Windows Treiber per Powershell und Win32_SystemDriver Abfragen


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.

3 Antworten to “Windows Treiber per Powershell und Win32_SystemDriver Abfragen”

  1. quirel Says:

    Bei Verwendung von Get-Command in Verbindung mit FileVersionInfo kann es zu Problemen kommen, wenn der Pfad in $dv Leerzeichen enthält und deshalb der String in obere Anführungsstriche gesetzt wurde.

    Es erscheint eine Fehlermeldung wie:
    Get-Command : Die Benennung „“Dateipfad““ wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt…

    Anstatt

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

    sollte man

    (Get-Command $dv.PathName.Replace(„“““,““)).FileVersionInfo | Format-List

    verwenden.

  2. Quirel Says:

    Um einen gefundenen Systemtreiber hier z. B. Cdr4_xp zu deaktivieren, benutzt man

    $s=gwmi -Class Win32_SystemDriver -Filter „Name=’Cdr4_xp'“
    $s.ChangeStartMode(„disabled“)

    als Ergebnis sollte man

    __GENUS : 2
    __CLASS : __PARAMETERS
    __SUPERCLASS :
    __DYNASTY : __PARAMETERS
    __RELPATH :
    __PROPERTY_COUNT : 1
    __DERIVATION : {}
    __SERVER :
    __NAMESPACE :
    __PATH :
    ReturnValue : 0

    angezeigt bekommen. Weitere Werte für den Startmode: http://msdn.microsoft.com/en-us/library/aa384896(v=vs.85).aspx

  3. Quirel Says:

    Wenn die WMI-Methode nicht fruchtet, es gibt noch SC.EXE:

    sc config VMNetBridge start= demand

    Mögliche Werte für start: start= { boot | system | auto | demand | disabled } : Specifies the start type for the service.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s


%d Bloggern gefällt das: