Wir haben bereits viel über PowerShell gelernt. Das letzte Mal haben wir mit WMI gearbeitet: PowerShell für Anfänger (Teil 9): Holen Sie sich alles von Windows mit PowerShell und WMI Jetzt ist es meiner Meinung nach der beste Zeitpunkt, sich auf das Thema „Filtern mit PowerShell“ zu konzentrieren. Aber schauen wir uns zuerst die Übung aus dem letzten Teil an.
Alle Teile der Serie finden Sie hier: PowerShell für Anfänger (Serie)
Review (Teil 9)
Hier ist die Aufgabe und die Lösung aus Teil 9:
Abrufen von Informationen zu Ihrer Festplatte. Verwenden Sie Get-WmiObject oder Get-CimInstance. Suchen Sie zuerst nach dem WMI-Objekt und zeigen Sie, sobald Sie es gefunden haben, den Namen, die Partitionen, das Modell, die Firmware und die Seriennummer an.
Zuerst müssen wir den Namen der WMI-Instanz herausfinden. Da sich die Aufgabe auf die Festplatte bezieht, könnten wir beispielsweise nach *disk* suchen.
Get-WmiObject *disk* -List
Win32_DiskDrive hört sich gut an. Denken Sie an die zweistufige Methode aus Teil 8, um mehr aus PowerShell herauszuholen:
Get-CimInstance win32_diskdrive | Get-Member
Dort finden Sie die entsprechenden Attribute. Verwenden Sie nun Select-Object , um sie alle abzurufen.
Get-CimInstance Win32_DiskDrive | Select-Object Name,Partitions, Size,Model,FirmwareRevision,SerialNumber
Review
WMI (Windows Management Instruments) bietet Lese- und Schreibzugriff auf fast alle Windows-Einstellungen. Es gibt zwei wichtige Cmdlets: Get-WmiObject und Get-CimInstance.
Warum filtern?
Die Filterung ist eine Schlüsseltechnologie in PowerShell. Sobald Sie wissen, wie man filtert, werden Sie mehr aus PowerShell herausholen.
Nun, meine Aufgabe für diesen Teil ist es zu erklären, warum das Filtern wichtig ist. Ok, nehmen wir an, Sie haben mehr als eine Festplatte. Die obige Ausgabe zeigt Ihnen alle Festplatten. Sie möchten jedoch beispielsweise nur Samsung-Festplatten anzeigen.
Warum sollten Sie das tun wollen? Vielleicht fragt Sie Ihr Chef, wie viele Samsung-Festplatten verwendet werden. Auf ALLEN Computern. Denken Sie daran, dass Sie mit WMI und PowerShell Remote-Abfragen durchführen können. Ok zurück zum Thema. Wir wollen nur die Samsung SSD mit 500 GB. Beobachten Sie den Filterparameter!
Get-CimInstance Win32_DiskDrive -Filter "Model='Samsung SSD 850 EVO 500GB'" | Select-Object Name,Partitions, Size,Model,FirmwareRevision,SerialNumber
Das Folgende ist etwas ungewöhnlich und für fortgeschrittene PowerShell-Nerds, aber warum nicht? Der folgende Befehl ruft alle Samsung SSDs von allen Domänencomputern ab, jedoch nicht von Servern.
Get-CimInstance Win32_DiskDrive -Filter "Model='Samsung SSD 850 EVO 500GB'" -ComputerName (Get-ADComputer -Filter {operatingsystem -notlike '*server*'}).Name | Select-Object Name,Partitions, Size,Model,FirmwareRevision,SerialNumber
Wenn Ihre Kollegen denken, dass Sie vor einem unlösbaren Problem stehen, drücken Sie einfach die Tasten und zeigen Sie ihnen, was Sie tun können. 😉
Ok, gehen wir zu den Beispielen für Anfänger.
Objekte filtern
Erinnern Sie sich an den Befehl Get-ChildItem? Ich habe diesen Befehl in dieser Serie sehr oft verwendet.
Wenn Sie Get-Help Get-ChildItem ausführen, finden Sie viele Filterbeispiele in der Hilfe.
Get-Help Get-ChildItem -Online
Ich bevorzuge die lokale Hilfe.
Get-Help Get-ChildItem -Examples
Was haben wir bisher gelernt?
Die Filterung ist eine Schlüsseltechnologie in PowerShell. Sobald Sie verstehen, wie man filtert, werden Sie mehr aus PowerShell herausholen.
Filtern von Active Directory-Objekten
Wenn Sie ein IT-Profi sind, arbeiten Sie wahrscheinlich in einer Active Directory-Umgebung. Das Filtern ist eine Schlüsseltechnik beim Arbeiten mit Active Directory-Objekten.
Der folgende Befehl verwendet den Filterparameter, um alle Benutzer abzurufen, die deaktiviert sind:
Get-ADUser -Filter {enabled -eq 'false'} | Select-Object Name
Sie fragen sich vielleicht, woher ich die Attributnamen kenne? Denken Sie an die 2-Schritte-Methode, um mehr aus Objekten herauszuholen: 1. verwenden Sie Get-Member 2. verwenden Sie Select-Object.
Der Filterparameter
Schauen wir uns um. Welche Befehle verwenden den Filterparameter? Beachten Sie, dass ich mich auf einem Domänencontroller befinde.
Get-Command -ParameterName Filter
Wie Sie sehen können, wird der Filterparameter hauptsächlich in Active Directory-Befehlen verwendet. Und ich muss zugeben, dass ich den Filterparameter immer nur für Active Directory verwendet habe. So ist es. Konzentrieren wir uns auf Active Directory. Angenommen, wir möchten, dass alle Domänencomputer (Server-Betriebssystem und Client-Betriebssystem) nach Betriebssystem sortiert sind. Dazu müssen wir den Filterparameter mit * verwenden.
Get-ADComputer -Filter * -Properties Name,Operatingsystem,OperatingSystemVersion,IPv4Address | Sort-Object OperatingSystem | Select-Object Name,OperatingSystem
In Bezug auf die Filterung war dies eine einfache Aufgabe.
Die Filtermethode
Jetzt versuchen wir, alle Computer zu erhalten, auf denen Windows 10 installiert ist. Dazu müssen wir den Filterparameter in geschwungene Klammern setzen.
Get-ADComputer -Filter {operatingsystem -like '*windows 10*'}
Es ist Zeit, die Details aufzuschlüsseln.
Die Klammern
Setzen Sie den Filter in gebogene Klammern.
Die Attribute
Als nächstes finden Sie den Namen der Eigenschaften (Attribute) heraus. Wir haben es bereits in PowerShell für Anfänger besprochen (Teil 8): Die Macht der PowerShell – Kontakt mit Objekten aufnehmen (Get-Member, Select-Object). Denken Sie an die zweistufige Methode!
Get-ADComputer client01 -Properties * | Get-Member
Randnotiz: Beachten Sie den Parameter properties. In Active Directory werden standardmäßig nicht alle Eigenschaften angezeigt.
Die Operatoren
Verwenden als nächstes einen Operator.
Ein Operator könnte -like, -as, -equal, -ne und so weiter sein … Für mehr über Parameter geben Sie
help about_operators
Dies öffnet eine Textdatei, die auf Ihrem Computer gespeichert ist.
Die Anweisung
Wenn wir etwas filtern wollen, brauchen wir eine Bedingung. Diese Bedingung muss in Anführungszeichen gesetzt werden.
Review
Wenn Sie mit Filtern arbeiten, lesen Sie zuerst den Hilfebereich. Filter werden normalerweise in Klammern gesetzt. Oft wird auch ein Operator verwendet.
Einige weitere Filterbeispiele … ohne viel zu reden …
Suche nach Benutzern, die ein falsches Passwort von 0 haben. Hier ist ein Beispiel für Petras Konto:
Get-ADUser -Filter {badpwdcount -eq '0'} | Select-Object Name
Suche nach Benutzern, die ein falsches Passwort von 0 haben und aktiviert sind. (Sie werden sehen, Petra ist nicht aktiviert).
Get-ADUser -Filter {(badpwdcount -eq '0') -and (enabled -eq 'true')} | Select-Object Name
Zeigt alle Windows Server-Domänencomputer an, jedoch nur diejenigen, auf denen Windows Server 2016 ausgeführt wird und deren Name mit DC beginnt.
Get-ADComputer -Filter {(operatingsystem -like '*2016*') -and (name -like 'dc*')}
Aber manchmal müssen wir einen anderen Weg finden. Nämlich dann, wenn keine Filterung zur Verfügung steht. Dann verwenden wir Where-Object .
Filtern mit Where-Object
Where-Object befindet sich immer auf der rechten Seite der Pipe. Filterung auf der linken Seite. Was das bedeutet, die Vor- und Nachteile am Ende des Beitrags. In diesem Teil konzentrieren wir uns auf Where-Object.
Hier sind einige Beispiele aus der PowerShell-Hilfe.
Get-Process | Where-Object {$_.handles -gt 200 -and $_.name -eq "svchost"}
Get-ChildItem c:\scripts | Where-Object {$_.length -gt 100000}
Ich möchte jedoch ein Beispiel aus einem meiner Beiträge verwenden.
Get-Hotfix | Where-Object HotfixID -like KB31*
Achten Sie auf HotFixID. Es bezieht sich auf ein Attribut.
Die empfohlene Vorgehensweise (wegen der Abwärtskompatibilität) sieht folgendermaßen aus:
Get-Hotfix | Where-Object {$_.HotfixID -like 'KB31*'}
Es gibt jetzt etwas Neues. Was bedeutet $_?
$_ ist eine Variable, die über jedes Objekt / Element iteriert, das von der vorherigen (Pipe) übergeben wurde. Einfach ausgedrückt: Nehmen Sie die hotfixID von jedem Objekt, das aus der Pipe kommt.
Filtern vs. Where-Object
Wenn kein Filter verfügbar ist, verwenden Sie Where-Object. Wenn Sie einen Filter auf der linken Seite des Rohres verwenden können, verwenden Sie ihn! Warum? Nun, es ist ein Unterschied, ob Sie 1000 Objekte über die Pipe senden oder nur 500, im Fall von Where-Object müssen alle Objekte die Pipe durchlaufen und erst dann werden sie gefiltert. Erinnere dich an die Pipe aus Teil 7: PowerShell für Anfänger (Teil 7): Die Pipe (und viele Beispiele zum Spielen)
Review
Wobei-Object immer auf der rechten Seite der Pipe ist. Filterung auf der linken Seite. Wenn Sie die Wahl zwischen einem Filter auf der linken Seite der Pipe oder Where-Object auf der rechten Seite haben, wählen Sie die linke Seite.
Übung
Hier ist die Übung bis zum nächsten Teil.
Where-Object:
Verwenden Sie Get-Service und Where-Object, um nur Dienste anzuzeigen, die ausgeführt werden.
Filter (Active Directory erforderlich):
Verwenden Sie den Filterparameter, um alle Benutzer abzurufen, die deaktiviert sind.
Bis zum nächsten Mal beim Thema: PowerShell für Einsteiger (Teil 11): Spaß haben mit PowerShell-Laufwerken
Patrick Gruenauer, MVP PowerShell