WMI Query Problem

This topic contains 0 replies, has 1 voice, and was last updated by Profile photo of Forums Archives Forums Archives 5 years, 3 months ago.

  • Author
    Posts
  • #5087

    by Sum4uandSum4u at 2012-09-08 20:04:24

    I cannot figure out what the problem is here. If I run just the $_.StartMode -eq "Auto", it filters fine. If try to run only the $_.Started -eq "False" it still comes back with the below response.
    Name : wuauserv
    Started : True
    StartMode : Auto

    Runnng the code below, I want it to pipe all services that are set to AUTO and then show me the AUTO services that are not running. Thanks in advance.
    Get-WmiObject -Query 'select Name,StartMode,Started from Win32_Service' -Namespace 'Root\CIMV2' |where { $_.StartMode -eq "Auto" -and $_.Started -eq "False" }

    by surveyor at 2012-09-09 04:35:10

    Try it with $false instead of the text "False"

    Get-WmiObject -Query 'select Name,StartMode,Started from Win32_Service' -Namespace 'Root\CIMV2' |where { $_.StartMode -eq "Auto" -and $_.Started -eq $false }

    by surveyor at 2012-09-09 04:37:16

    Or a little bit faster with:
    Get-WmiObject -Query "select Name,StartMode,Started from Win32_Service where StartMode = 'Auto' and Started = False" -Namespace 'Root\CIMV2'

    by Sum4uandSum4u at 2012-09-11 17:49:16

    Works like a charm ... Thanks Jens!

    by surveyor at 2012-09-11 23:43:26

    Maybe you can use the following script. It's very special for my needs, but shows how to read eventlogs from many servers in a few seconds and export to an Excel-file for filtering...
    (Seems that syntaxhighlighting has a few problems...)
    < #
    .SYNOPSIS
    Skript zur Überprüfung der Serverereignisprotokoll

    .DESCRIPTION
    Dieses Skript ruft von allen Servern alle Fehler und Warnungen
    aus den Ereignisprotokollen SYSTEM und APPLICATIOn ab, die seit
    dem letzten Abruf hinzu gekommen sind.

    .EXAMPLE
    & .\Get-ServerEventlogErrors.ps1

    .NOTES
    Freie und Hansestadt Hamburg
    Landesbetrieb Geoinformation und Vermessung
    LGV G 4 / IT-Betrieb
    Sachsenkamp 4
    20097 Hamburg

    Dipl.-Ing. Jens Kalski

    Tel : 040 / 428.26-5611
    Fax : 040 / 428.26-5964
    E-Mail : jens.kalski@gv.hamburg.de
    #>

    #region Funktionen
    Function Remove-ComObject {
    < #
    .Synopsis
    Releases all <__comobject> objects in the caller scope.

    .Description
    Releases all <__comobject> objects in the caller scope, except for those that are Read-Only or Constant.

    .Example
    Remove-ComObject -Verbose
    Description
    ===========
    Releases <__comobject> objects in the caller scope and displays the released COM objects' variable names.

    .Inputs
    None

    .Outputs
    None

    .Notes
    Name: Remove-ComObject
    Author: Robert Robelo
    LastEdit: 01/13/2010 19:14
    #>
    [CmdletBinding()]
    Param()
    End {
    Start-Sleep -Milliseconds 500
    [Management.Automation.ScopedItemOptions]$scopedOpt = 'ReadOnly, Constant'
    Get-Variable -Scope 1 | Where-Object {
    $_.Value.pstypenames -contains 'System.__ComObject' -and -not ($scopedOpt -band $_.Options)
    } | Remove-Variable -Scope 1 -Verbose]$PSBoundParameters['Verbose'].IsPresent)
    [GC]::Collect()
    }
    }
    #endregion Funktionen

    #region Admin-Test
    if (
    -Not (
    [Security.Principal.WindowsPrincipal] `
    [Security.Principal.WindowsIdentity]::GetCurrent()
    ).IsInRole(
    [Security.Principal.WindowsBuiltInRole]"Administrator"
    )
    ) {
    Write-Host " " -BackgroundColor Red
    Write-Host " Dieses Skript benötigt Administrator-Berechtigungen! " -BackgroundColor Red -ForegroundColor White
    Write-Host " " -BackgroundColor Red
    Exit
    }
    #endregion Admin-Test

    #region Vorbelegungen
    $DatumUhrzeit = Get-Date
    $Ergebnisdatei = Join-Path -Path $ScriptDirectory -ChildPath 'Data\Get-ServerEventlogErrors.csv'
    $ExcelDatei = Join-Path -Path $ScriptDirectory -ChildPath "Data\Get-ServerEventlogErrors_$NowForFiles.xlsx"
    $DateiMitLetztemZugriff = Join-Path -Path $ScriptDirectory -ChildPath 'Data\Get-ServerEventlogErrors_LetzterZugriff.xml'
    #endregion Vorbelegungen

    #region Datum des letzten Abrufs
    if (Test-Path -LiteralPath $DateiMitLetztemZugriff) {
    [DateTime]$LetzterZugriff = Import-Clixml -Path $DateiMitLetztemZugriff
    } else {
    [DateTime]$LetzterZugriff = $DatumUhrzeit.AddDays(-1)
    }
    Export-Clixml -Path $DateiMitLetztemZugriff -InputObject $DatumUhrzeit
    $LetzterZugriffWMI = [Management.ManagementDateTimeConverter]::ToDmtfDateTime($LetzterZugriff)
    #endregion Datum des letzten Abrufs

    #region Server-Eventlogeinträge seit letztem Abruf abrufen
    # Liste der Servernamen mit Test auf Erreichbarkeit
    $Serverliste = New-Object System.Collections.ArrayList
    Get-LGVServerNames | ForEach-Object { $Serverliste.Add($_) | Out-Null }
    if ($Serverliste.Count) {
    $i = 0
    do {
    if (Test-Connection -ComputerName $Serverliste[$i] -Count 1 -Quiet) {
    $i = $i + 1
    } else {
    Write-Host ("Server {0} ist nicht erreichbar und wird aus der Serverliste entfernt." -f $Serverliste[$i])
    $Serverliste.RemoveAt($i)
    }
    } while ($i -lt $Serverliste.Count)
    }

    # Ereignisprotokolleinträge von allen Servern abrufen
    $Job = Get-WmiObject -ComputerName $Serverliste -AsJob -Query @"
    SELECT
    ComputerName,Logfile,SourceName,Type,EventCode,TimeGenerated,User,Message
    FROM
    Win32_NTLogEvent
    WHERE
    (
    (Logfile = 'Application')
    or
    (Logfile = 'System')
    )
    and
    (
    (Type = 'Error')
    or
    (Type = 'Warning')
    )
    and
    TimeGenerated > '$LetzterZugriffWMI'
    and
    not ( (Type = 'Error') and (SourceName = 'Ntfs') and (EventCode = 137) )
    and
    not ( (Type = 'Warning') and (SourceName = 'Ntfs') and (EventCode = 57) )
    and
    not ( (Type = 'Warning') and (SourceName = 'McLogEvent') and (EventCode = 258) )
    and
    not ( (Logfile = 'Application') and (Type = 'Warning') and (SourceName = 'Microsoft-Windows-User Profiles Service') and (EventCode = 1530) )
    "@
    Wait-Job -Job $Job | Out-Null
    $Ergebnis = Receive-Job -Job $Job
    Remove-Job -Job $Job
    #endregion Server-Eventlogeinträge seit letztem Abruf abrufen

    #region Wenn es Daten gibt ---> Umwandlung in Excel-Arbeitsmappe ---> Aufruf der Excel-Arbeitsmappe
    if ($Ergebnis) {
    #region Umwandlung der Ergebnisdaten in CSV-Datei zum schnelleren Import in Excel
    $Ergebnis = $Ergebnis |
    Sort-Object -Property TimeGenerated -Descending |
    Select-Object `
    -Property `
    ComputerName,
    Logfile,
    SourceName,
    Type,
    EventCode,
    @{Label='Zeit';Expression={[Management.ManagementDateTimeConverter]::ToDateTime($_.TimeGenerated)}},
    User,
    @{Label='Ereignismeldung';Expression={($_.Message -replace "`n",'/n') -replace "/n/n","/n"}} # Umwandlung von Zeilenumbrüchen für CSV-Export
    Write-Host ("Insgesamt wurden in den Ereignisprotokollen seit {0:dd.MM.yyyy HH:mm:ss} auf {1} Servern {2} Fehler und/oder Warnungen gefunden." -f $LetzterZugriff,$Serverliste.Count,$Ergebnis.Count)
    $Ergebnis | Export-Csv -Path $Ergebnisdatei -Encoding UTF8 -NoTypeInformation -UseCulture
    #endregion Umwandlung der Ergebnisdaten in CSV-Datei zum schnelleren Import in Excel

    #region Umwandlung der CSV-Datei in eine Excel-Arbeitsmappe
    # Excel öffnen
    $Excel = New-Object -ComObject Excel.Application
    # Excel anzeigen
    $Excel.Visible = $true
    # Mögliche Fehlermeldungen und Frage-Popupfenster unterdrücken
    $Excel.DisplayAlerts = $false
    # CSV-Datei in Excel öffnen
    $Arbeitsmappe = $Excel.Workbooks.Open($Ergebnisdatei)
    If ($Arbeitsmappe) {
    If ($Arbeitsmappe.ReadOnly) {
    Write-Host "$Ergebnisdatei ist schreibgeschützt." -ForegroundColor Red
    Exit
    } else {
    # Importiertes Tabellenblatt auswähen
    $Tabellenblatt = $Arbeitsmappe.WorkSheets.Item("Get-ServerEventlogErrors")
    # Gesamte importierte Daten in Tabellenbereich umwandeln
    $NeueTabelle = $Tabellenblatt.ListObjects.Add([Microsoft.Office.Interop.Excel.XlListObjectSourceType]::xlSrcRange,$Tabellenblatt.Range($Tabellenblatt.Cells.Item(1,1),$Tabellenblatt.Cells.Item($Ergebnis.Count + 1,8)),$false,[Microsoft.Office.Interop.Excel.XlYesNoGuess]::xlYes,$Tabellenblatt.Cells.Item(1,1))

    # Umgewandelte Zeilenumbrüche aus den Originaldaten wiederherstellen
    $Tabellenblatt.Columns.Item("H]]::xlByRows,$false,$false,$false) | Out-Null
    # Alle Spalten auf optimale Breite einstellen
    $Tabellenblatt.Columns.Item("A:H").EntireColumn.AutoFit() | Out-Null
    # In der Meldungsspalte den Zeilenumbruch aktivieren, für den Fall dass die Daten noch breiter sind als die maximale Breite von 255 Zeichen
    $Tabellenblatt.Columns.Item("H:H").WrapText = $true

    # Gesamten Tabellenbereich auswählen
    $TabellenAuswahl = $Tabellenblatt.Range($Tabellenblatt.Cells.Item(1,1),$Tabellenblatt.Cells.Item($Ergebnis.Count + 1,8))
    $TabellenAuswahl.Select() | Out-Null
    # ... und die Daten darin OBEN positionieren
    $TabellenAuswahl.VerticalAlignment = [Microsoft.Office.Interop.Excel.XlVAlign]::xlVAlignTop
    }
    }
    # Arbeitsmappe als Excel-Arbeitsmappe im Standardformat abspeichern
    $Arbeitsmappe.SaveAs($ExcelDatei,[Microsoft.Office.Interop.Excel.XlFileFormat]]]::xlUserResolution,$true,$null,$null,$null) | Out-Null
    # Excel beenden und komplett aus dem Speicher entfernen
    $Excel.Quit()
    Remove-Variable -Name Excel -Force
    [GC]::Collect()
    Remove-ComObject
    #endregion Umwandlung der CSV-Datei in eine Excel-Arbeitsmappe

    # CSV-Datei löschen
    Remove-Item -LiteralPath "$Ergebnisdatei"
    # Excel-Arbeitsmappe aufrufen
    Invoke-Item -LiteralPath "$ExcelDatei"
    } else {
    Write-Host ("Seit {0:dd.MM.yyyy HH:mm:ss} wurden auf {1} Servern keine Fehler oder Warnungen gefunden." -f $LetzterZugriff,$Serverliste.Count)
    }
    #endregion Wenn es Daten gibt ---> Umwandlung in Excel-Arbeitsmappe ---> Aufruf der Excel-Arbeitsmappe

You must be logged in to reply to this topic.