Arbeiten mit Windows-Diensten in PowerShell

Juli 26, 2018 Sicherheit und Compliance, MOVEit

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 ist seit 20 Jahren in der IT-Branche tätig und arbeitet aktuell als Automatisierungs-Ingenieur, Blogger und selbstständiger Consultant und Autor, und Ausbilder. Sein Schwerpunkt liegt dabei auf DevOps, System-Management und Automatisierungs-Technologien, sowie auf zahlreichen Cloud-Plattformen. Er ist ein Microsoft Cloud und Datacenter Management MVP und ist dafür bekannt effizient zu arbeiten. Außerdem liebt er es anderen Leuten die Welt der Automatisierung näherzubringen.

Read next Benutzung der neuen MOVEit 2018 REST API mit PowerShell