Im vorigen Artikel hab ich verschiedene Möglichkeiten aufgezeigt, wie man unter Windows mit Powershell 2.0 Infos über Windows System-Dienste abfragen kann.
http://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.