PowerShell hilft Zeit zu sparen, indem es bestimmte Dienstverwaltungsaufgaben übernimmt. Lesen Sie hier, wie Sie solche Tools erstellen können.
Das Stoppen, Starten und Wieder-Starten von Windows-Diensten ist eine häufige Aufgabe von vielen IT-Fachleuten. Wir alle kennen das Dienste MMC-Snapin, wo wir zu einem Dienst browsen und ihn mit einem rechten Mausklick wieder starten oder verschiedene Attribute ändern. Wenn wir zeitsparend arbeiten, greifen wir möglicherweise auf einen entfernten Computer im Dienste-Snapin zu und verwalten ihn so. Trotzdem wird es schnell mühsam auf diese Weise mit Windows-Diensten zu arbeiten.
Es ist zeitverschwendend, wenn man viele Dienste verwaltet und so in der Benutzeroberfläche herumklicken muss! Zum Glück kann man über PowerShell Tools erstellen, die diese Dienstverwaltungsaufgaben durchführen.
PowerShell bietet einige vorkonfigurierte Befehle, um mit Windows-Diensten zu arbeiten.
PS> Get-Command -Noun Service
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Get-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet New-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Restart-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Resume-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Set-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Start-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Stop-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Suspend-Service 3.1.0.0 Microsoft.PowerShell.Management
Man kann diese vorgefertigten Kommandos für alle möglichen Aufgaben benutzen, um sich das Leben einfacher zu machen. Wenn man zum Beispiel den Dienststatus von vielen verschiedenen Computern gleichzeitig vom Active Directory holen möchte. Um solch ein Tool zu erstellen, kann man das Active Directory PowerShell-Module verwenden – die Computer vom AD entfernen und diese Computer-Namen dann in den Get-ServiceBefehl eingeben.
$computers = Get-AdComputer -Filter * | Select-Object -ExpandProperty Name
get-service -ComputerName $computers -Name wuauserv | Select-Object MachineName,Name,Status
MachineName Name Status
----------- ---- ------
DC wuauserv Running
CLIENT1 wuauserv Running
...
Wenn man nun die Dienste auf all diesen Computer gleichzeitig wieder starten möchte, kann man die Resulte, die man gerade erhalten hat, direkt in Restart-Service eingeben.
Get-Service -ComputerName $computers -Name wuauserv | Restart-Service
Man kann diese gleiche Vorgehensweise auch zum Starten und Stoppen von Diensten verwenden. Anstatt Restart-Service zu benutzen, hätte man ebenso einfach Stop-Service oder Start-Service benutzen können.
Dienste können mit dem Set-Service Befehl auch verändert werden. Mit dem Befehl Set-Servicekann man zum Beispiel den Anzeigenamen eines Dienstes, den Starttyp oder die Beschreibung ändern. Und wieder kann man die Dienste, die man vorher über Get-Service erhalten hat, in den Befehl Set-Service eingeben, um andere Aktionen durchzuführen.
## Change the display name for all wuauserv services to 'foo'
Get-Service -ComputerName $computers -Name wuauserv | Set-Service -DisplayName 'foo'
## Change the description to 'stuff'
Get-Service -ComputerName $computers -Name wuauserv | Set-Service -Description 'stuff'
Sie sehen also, dass, solange man die Dienste mit Get-Service abfragen kann, man sehr vieles mit diesen Diensten machen kann. Es kann jedoch nicht alles mit den eingebauten Befehlen gemacht werden. Zum Beispiel ist es nicht möglich, den Benutzernamen und das Passwort, unter denen ein Dienst läuft, mit einem Dienstbefehl zu ändern. Hierfür müsste man WMI verwenden. Um die Zugangsdaten zu ändern, müsste man den Dienst direkt von WMI holen und die .NET method verwenden, um das Dienstkonto zu verändern. Hier ist ein ausgezeichnetes Beispiel, wie man das machen kann.
## Gather the username and password
$credential = Get-Credential
## Find the service to change
$params = @{
'Namespace' = 'root\CIMV2'
'Class' = 'Win32_Service'
'Filter' = "DisplayName='App Service'"
}
$service = Get-WmiObject @params
## Make the change using the username and password
$service.Change($null,
$null,
$null,
$null,
$null,
$null,
$credential.UserName,
$credential.GetNetworkCredential().Password,
$null,
$null,
$null
)
Auch wenn nicht alles mit den eingebauten Dienst-Cmdlets möglich ist, ist doch so gut wie alles möglich, da PowerShell auf .NET gebaut ist. Man muss nur wissen, wo man schauen muss!
Tipp: Lesen Sie dazu auch das Whitepaper Automatisieren mit PowerShell oder laden Sie sich kostenfrei eine Testversion von MOVEit Automation, Software für die Automatisierung der sicheren Dateiübertragung, herunter.
Adam Bertram
Adam Bertram is a 20-year veteran of IT. He’s currently an automation engineer, blogger, independent consultant, freelance writer, author, and trainer. Adam focuses on DevOps, system management, and automation technologies as well as various cloud platforms. He is a Microsoft Cloud and Datacenter Management MVP and efficiency nerd that enjoys teaching others a better way to leverage automation.