Archive for 7. Dezember 2010

Windows Treiber per Powershell und Win32_SystemDriver Abfragen

7 Dezember 2010

Im vorigen Artikel hab ich verschiedene Möglichkeiten aufgezeigt, wie man unter Windows mit Powershell 2.0 Infos über Windows System-Dienste abfragen kann. https://newyear2006.wordpress.com/2010/12/07/windows-system-dienste-mit-powershell-abfragen/

In diesem Artikel geht es nun weiter zu Treibern. Bereits mit SC.EXE konnten Treiber abgefragt werden, wenn man den Parameter “type= driver” benutzte. Mittels Powershell und Get-Service kann man Dienste Abfragen, allerdings bekommt man keine Infos über Treiber, obwohl die ServiceType Auflistung KernelDriver und FileSystemDriver kennt.

Die Lösung bringt die Methode GetDevices aus der System.ServiceProcess.ServiceController Klasse. Welche so aufgerufen werden kann:

[System.ServiceProcess.ServiceController]::GetDevices()

Falls bei diesem Aufruf eine Fehlermeldung erscheint, dann sollte man zuerst Get-Service aufrufen, damit die zugehörige Assembly geladen wird. Näheres beschreibt: http://blogs.technet.com/b/heyscriptingguy/archive/2010/11/10/use-powershell-to-work-with-the-net-framework-service-classes.aspx

Wenn man sich nun mittels Get-Member die verfügbaren Properties und Methoden anzeigen lässt, so fällt auf, dass exakt die gleichen wie bei “Get-Service | Get-Member” zur Verfügung stehen.

Damit lassen sich dann viele Abfragen zu Treibern erstellen. Interessant dabei ist, dass Get-Service mit diesen Treibern umgehen kann! Ruft man also

Get-Service ntfs

auf, so wird einem der Status des ntfs-FileSystemDriver angezeigt, obwohl dieser bei den normalen Auflistungen nicht dargestellt wird. Dies funktioniert allerdings nur wenn man den Namen eines Treibers direkt angibt. Somit führt

Get-Service "*ntfs*"

nicht zum Erfolg.

Um nun mal einen Überblick zu bekommen, was denn für Treiber in welchem ServiceType-Bereich vorhanden sind, kann man folgenden Aufruf starten:

$dd = [System.ServiceProcess.ServiceController]::GetDevices()

$dd | Sort-Object ServiceType, Name | Format-Table Name, DisplayName, ServiceType –GroupBy ServiceType

Wenn man wissen möchte, welche Bluetooth-Treiber geladen sind, verwendet man z. B.

$dd | Where-Object {$_.DisplayName –match "Bluetooth"}

Man erhält vielleicht nicht alle, aber sicher die meisten Treiber die mit Bluetooth etwas zu tun haben.

Um die nicht sofort offensichtlich damit verbundenen Treiber ermitteln zu können, helfen noch

$dd | Where-Object {$_.DisplayName –match "Bluetooth"} | Format-Table Name, DependentServices

welches von den Treibern abhängige weitere Treiber anzeigt, die etwas mit Bluetooth zu tun haben können.

Da man gerade in Sachen Bluetooth mehrere Dinge im Auge haben muss, ist es natürlich lästig einmal eine Abfrage über Get-Services und einmal über GetDevices zu machen. Aus diesem Grund kann man eine Kombiabfrage erstellen, die beide Auflistungen berücksichtigt:

$($dd; Get-Service) | Where-Object {$_.DisplayName –match "Bluetooth"} | Format-Table Name, DependentServices

Dies funktioniert natürlich nur, weil beide Auflistungen dieselbe Member-Struktur aufweisen.

Ein allgemein interessanter Aufruf stellt dieser dar:

$dd | Where-Object {$_.DependentServices} | Format-Table Name, DependentServices

Er zeigt alle Treiber an, die von anderen abhängig sind, während dieser Aufruf Treiber anzeigt von denen andere abhängig sind:

$dd | Where-Object {$_.ServicesDependedOn} | Format-Table Name, ServicesDependedOn

Da leider wie bei Get-Service nicht alle Informationen zur Verfügung stehen, die man hin und wieder braucht, gibt es wieder die Möglichkeit mittels Get-WmiObject weitere Infos aus dem WMI zu holen. Was bei Get-Service Win32_Service ist, ist hier Win32_SystemDriver. Damit lässt sich nun der Startmodus eines Treibers ermitteln:

Get-WmiObject –Class Win32_SystemDriver –Property StartMode –Filter "Name=’ntfs’"

Mit diesem Konstrukt lassen sich nun interessante Dinge basteln. Oftmals möchte man wissen, welche Version eines Treibers findet überhaupt Anwendung. Dabei hilft folgendes:

$dv = Get-WmiObject –Class Win32_SystemDriver –filter "Name=’ntfs’"

(Get-Command $dv.PathName).FileVersionInfo | Format-List

Damit hat man den perfekten Überblick.

Windows System-Dienste mit Powershell abfragen

7 Dezember 2010

Wo man seither zu SC.EXE griff um Dienste unter Windows zu untersuchen oder zu bearbeiten, hilft einem nun Powershell weiter. Gerade wenn man bestimmte Abfragen starten möchte ist Powershell die bei weitem bessere Wahl.

Generelle Auflistung der Dienste:

Get-Service

Wenn man sich nur für einen Dienst interessiert, kann man

Get-Service spooler

verwenden. Dazu funktioniert alternativ auch:

Get-Service Druckwarteschlange

Von einem Dienst abhängige Dienste bekommt man über

Get-Service spooler –DependentServices

Bevor man Piping benutzt um bestimmte Dienste zu filtern kann man auch einfach den Parameter –Include verwenden. Folgende Anweisung stellt z.B. Dienste dar die SPO enthalten:

Get-Service –Include "SPO*"

was dem Befehl

Get-Service "SPO*"

entspricht.

Auf die gleiche Weise kann man mittels –DisplayName auch nach dem Anzeigenamen suchen:

Get-Service –DisplayName "*druck*"

Um zu sehen welche Properties oder Methoden zur Verfügung stehen, verwendet man einfach

Get-Service | Get-Member

Wenn man nun wissen möchte welche Dienste aktuell laufen, verwendet man

Get-Service | Where-Object {$_.Status –eq "Running"}

Um laufende Dienste zu ermitteln, welche einen bestimmten Anzeigenamen haben, verwendet man

Get-Service | Where-Object {$_.Status –eq "Running"} | Where-Object {$_.DisplayName –like "*Blue*"}

womit z. B. laufende Bluetoothdienste angezeigt werden.

Zusätzliche Infos bekommt man dann wieder über Format-Table

Get-Service | Where-Object {$_.Status –eq "Running"} | Where-Object {$_.DisplayName –like "*Blue*"} | Format-Table Name, CanShutdown, ServiceType

Übrigens lässt sich Get-Service auch mittels Alias gsv abkürzen.

Leider gibt es einige Dinge die noch nicht optimal gelöst sind. Z. B. gibt es momentan keine Möglichkeit den StartMode einfach zu ermittlen, statt dessen muss man zu folgendem Trick greifen:

Get-WmiObject –Class Win32_Service –Property StartMode –Filter "Name=’spooler’"

Wer es einfacher haben möchte, kann hier für die Änderung voten: https://connect.microsoft.com/PowerShell/feedback/details/424948/i-would-like-to-see-the-property-starttype-added-to-get-services

Wenn man Dienste sehen möchte, die keine Abhängigkeiten haben, verwendet man:

Get-Service | Where-Object {!$_.ServicesDependedOn}

um einen Überblick über Dienste und Ihre Abhängigkeiten zu bekommen, kann man

Get-Service | Where-Object {$_.ServicesDependedOn} | Format-Table Name, ServicesDependedOn

verwenden.

Wenn man wissen möchte, welche Dienste von einem bestimmten anderen Dienst abhängen kann folgendes verwenden:

Get-Service | Where-Object {$_.ServicesDependedOn | Where-Object {$_.Name –match "rpc"}} | Format-Table Name, ServicesDependedOn

Damit werden alle Dienste die von einem RPC Dienst abhängen ausgegeben.

Technet zu Get-Service: http://technet.microsoft.com/en-us/library/dd347591.aspx

Weitere Interessante Links: Reihenfolge in der Dienste gestartet wurden ermitteln, mittels win32_LoadOrderGroupServiceMembers und WMI: http://blogs.technet.com/b/heyscriptingguy/archive/2010/09/02/using-windows-powershell-to-determine-service-launch-order.aspx


Follow

Erhalte jeden neuen Beitrag in deinen Posteingang.