############################################################################# # Commandlet: get-sysdriver und set-sysdriver # # Autor: Armin Friedrich # # Klasse: Win32_SystemDriver # # Beschreibung: # # Systemtreiber fuer Basisdienste ausgeben, starten bzw. stoppen # # Aufruf der Commandlets mit Parametern durch , getrennt # # Beispiele: # # get-sysdriver, get-sysdriver g1_11,netbios, get-systreiber netbios # # set-sysdriver, set-sysdriver beep,start, set-systreiber g1_10,beep,stop # ############################################################################# function get-SysDriver { param([string[]]$arg) begin{ $anz=0 # Variable fuer die Anzahl der eingegebenen Parameter # Schleife zur Ermittlung Anzahl Parameter if($arg){ foreach ($anzahl in $arg) { $anz++ # Anzahl der Parameter } } # Pruefung, von welchem Rechner die Systemtreiber abgefragt werden # inklusive Auswahl des entsprechenden Treibers # Keine Eingabe - dann manuelle Auswahl Treiber und Auswahl PC if($anz -eq 0) { $treiber = Read-Host "Bestimmter Treiber oder fuer alle" $pc = Read-Host "Welcher PC" } # Eingabe von PC und Treiber korrekt erfolgt (z.B. get-sysdriver g1_11,vga) elseif ($anz -eq 2) { $pc = $arg[0] $treiber = $arg[1] } # Eingabe vom Treiber erfolgt (z.B. get-sysdriver vga) - Auswahl des PC moeglich else { $treiber = $arg[0] $pc = Read-Host "Welcher PC" } } process{ } end{ # Pruefung wenn bei PC nicht . fuer localhost eingegeben wurde # ob der Rechner auch erreichbar ist if($pc -ne ".") { $adress="Address='"+$pc+"'" $p=Get-WmiObject -Class Win32_PingStatus -Filter $adress |select-object statuscode if($p.statuscode -ne 0) { Write-Host -ForegroundColor red -BackgroundColor yellow "keine Verbindung zu dem angegebenen PC" break } } # Wenn ENTER dann alle Systemtreiber ausgeben if($treiber -eq "") { $treiber = Get-WmiObject -Class "Win32_SystemDriver" -computername $pc -Namespace "ROOT\CIMV2" $treiber | select-object Name,Status,State,AcceptStop,StartMode,Systemname | Format-Table } # Ausgabe des eingegebenen Systemtreibers else { # Hilfsvariable zum Treibervergleich $tmp=$treiber $treiber = Get-WmiObject -Class "Win32_SystemDriver" -computername $pc -Namespace "ROOT\CIMV2" | Where-Object {$_.Name -eq $treiber} # Pruefung, ob der Treiber ueberhaupt existiert if($treiber.name -ne $tmp) { write-host -ForegroundColor red "Treiber exisitiert nicht" break } # Wenn Treiber exisitiert, dann Ausgabe der entsprechenden Daten else { Write-Host "*******************************************" Write-Host " Name: " $treiber.name Write-Host " Status: " $treiber.status Write-Host " State: " $treiber.state Write-Host " Accept Stop: " $treiber.acceptstop Write-Host "*******************************************" } } } } function set-SysDriver { param([string[]]$arg) begin{ $anz=0 # Variable fuer die Anzahl der eingegebenen Parameter # Schleife zur Ermittlung Anzahl Parameter if($arg){ foreach ($anzahl in $arg) { $anz++ # Anzahl der Parameter } } # Pruefung, ob Parameter eingegeben wurden: if($anz -le 1) { # Gar kein Parameter wurde eingegeben (z.B. set-sysdriver) falscheeingabe $pc = Read-Host "Welcher PC " $treiber = Read-Host "Welcher Systemtreiber " $status = Read-Host "Start oder Stop " if($status -ne "start" -and $status -ne "stop") { Write-Host "falsch Eingabe beim Status!!" $status = Read-Host "Status (start/stop)" } } # 2 Parameter eingegeben (z.B. set-sysdriver netbios,start) elseif ($anz -eq 2) { $pc = "." $treiber = $arg[0] $status = $arg[1] if($status -ne "start" -and $status -ne "stop") { Write-Host "falsch Eingabe beim Status!!" $status = Read-Host "Status (start/stop)" } } # 3 Parameter eingegeben (z.B. set-sysdriver g1_11,netbios,start) else { $pc = $arg[0] $treiber = $arg[1] $status = $arg[2] if($status -ne "start" -and $status -ne "stop") { Write-Host "falsch Eingabe beim Status!!" $status = Read-Host "Status (start/stop)" } } } process{ } end{ # Pruefung wenn bei PC nicht . fuer localhost eingegeben wurde # ob der Rechner auch erreichbar ist if($pc -ne ".") { $adress="Address='"+$pc+"'" $p=Get-WmiObject -Class Win32_PingStatus -Filter $adress |select-object statuscode if($p.statuscode -ne 0) { Write-Host -ForegroundColor red -BackgroundColor yellow "keine Verbindung zu dem angegebenen PC" break } } # Keine Treiber angegeben if($treiber -eq "") { write-host -ForegroundColor red "Kein Treiber angegeben" break } # Pruefungen, wenn Treiber angegeben else { # Hilfsvariable zum Treibervergleich $tmp=$treiber $treiber = Get-WmiObject -Class "Win32_SystemDriver" -computername $pc -Namespace "ROOT\CIMV2" | Where-Object {$_.Name -eq $treiber} # Pruefung, ob der Treiber ueberhaupt existiert if($treiber.name -ne $tmp) { write-host -ForegroundColor red "Treiber exisitiert nicht" break } # Treiber exisitiert -> Abarbeiten von Parameter Start bzw. Stop else { # Pruefung Status: switch($status) { # Pruefung ob Starten des Treibers moeglich ist: "Start" { # Pruefung ob der angegebene Treiber bereits laeuft: if($treiber.state -like "running") { Write-Host -ForegroundColor yellow "Treiber laeuft bereits" break } else { # Zuweisung Ergebnis Startvorgang $erg = $treiber.startservice() } # Abschluss Pruefung, ob Treiber bereits laeuft # Pruefung ob der angegebene Treiber korrekt gestartet wurde: if($erg.returnvalue -eq "0") { Write-Host -ForegroundColor green "Treiber" $treiber.name "wurde gestartet" } else { # Fehlermeldung, da Ergebnis -ne 0 ist -> d. h. Treiber konnte nicht gestartet werden: Write-Host -ForegroundColor Red "Treiber" $treiber.name "konnte nicht gestartet werden" Write-Host -ForegroundColor Red "Fehler-Nummer" $erg.returnvalue } # Abschluss Pruefung, ob Treiber korrekt gestartet wurde } # Ende Start # Pruefung ob Stoppen des Treibers moeglich ist: "Stop" { # Pruefung, ob ein stoppen des Treibers ueberhaupt moeglich ist if($treiber.AcceptStop -like "false") { Write-Host -ForegroundColor red "Treiber kann nicht gestoppt werden" break } # Abschluss Pruefung, ob Treiber gestoppt werden kann # Pruefung ob der angegebene Treiber schon gestoppt ist: if($treiber.state -like "stopped") { Write-Host "Treiber ist bereits gestoppt" break } else { # Zuweisung Ergebnis Startvorgang $erg = $treiber.stopservice() } # Abschluss Pruefung, ob Treiber bereits gestoppt if($erg.returnvalue -eq "0") { Write-Host -ForegroundColor green "Treiber" $treiber.name "wurde gestoppt" } else { # Fehlermeldung, da Ergebnis -ne 0 ist -> d. h. Treiber konnte nicht gestartet werden: Write-Host -ForegroundColor Red "Treiber" $treiber.name "konnte nicht gestoppt werden" Write-Host -ForegroundColor Red "Fehler-Nummer" $erg.returnvalue } # Abschluss Pruefung, ob Treiber korrekt gestartet wurde } # Ende Stop } # Ende switch } # Ende Abarbeitung Treiber existiert } # Ende Pruefung wenn Treiber angegeben } # Ende end } # Ende function set-sysdriver function falscheeingabe { Write-Host -ForegroundColor blue -backgroundcolor yellow "Folgende Eingaben beim naechsten Mal beruecksichtigen: " write-host -ForegroundColor blue -backgroundcolor yellow "-> set-sysdriver treiber, status " Write-Host -ForegroundColor blue -backgroundcolor yellow "-> set-sysdriver pc,treiber,status " } #zur Erfolgskontrolle: "Das Commandlet fuer die Systemtreiber wurde erfolgreich geladen"