Wie man Dienste in PowerShell verwaltet
- Dienste in PowerShell auflisten
- Entfernte Dienste in PowerShell finden
- Dienste in PowerShell starten und stoppen
- Dienst in PowerShell neu starten
- Den Starttyp eines Dienstes in PowerShell ändern
Windows-Dienste sind eines der Themen, die nahezu jeder Windows-Systemadministrator nutzen muss. Natürlich könnten wir zur Verwaltung von Windows-Diensten das services.msc MMC-Snap-In für einmalige Aufgaben starten, aber was ist, wenn wir Automation mit PowerShell aufbauen müssen?
In diesem Artikel werden alle PowerShell-Service-Cmdlets besprochen, wie man sie verwendet und wie wir unser Skript entwickeln, um Dienste auf vielen Computern lokal oder remote zu verwalten.
Dienste in PowerShell auflisten
Eine der grundlegendsten Aufgaben, die wir mit Windows PowerShell und Diensten erledigen können, ist einfach die Aufzählung der Dienste, die auf einem lokalen oder einem entfernten Computer vorhanden sind. Zum Beispiel, öffnen Sie PowerShell, führen Sie den Befehl Get-Service aus und beobachten Sie die Ausgabe.
Der Befehl Get-Service listet allein alle Dienste auf dem lokalen Computer sowie den Status, den Name und DisplayName jedes Dienstes auf.
Get-Service
Ausgabe:
Status Name DisplayName
------ ---- -----------
Stopped AarSvc_55244 AarSvc_55244
Stopped AJRouter AllJoyn Router Service
Stopped ALG Application Layer Gateway Service
Running AMD Crash Defen... AMD Crash Defender Service
<SNIP>
Wie viele andere Cmdlets gibt PowerShell nicht alle Eigenschaften für jeden Dienst zurück.
Falls wir zum Beispiel einen erforderlichen Dienst oder vielleicht die Dienstbeschreibung sehen möchten, können wir diese Eigenschaften finden, indem wir das Ergebnis an den Befehl Select-Object pipen und das *-Wildcard verwenden, um alle Eigenschaften darzustellen.
Get-Service ALG | select *
Ausgabe:
Name : ALG
RequiredServices : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : False
DisplayName : Application Layer Gateway Service
DependentServices : {}
MachineName : .
ServiceName : ALG
ServicesDependedOn : {}
ServiceHandle :
Status : Stopped
ServiceType : Win32OwnProcess
StartType : Manual
Site :
Container :
Entfernte Dienste in PowerShell finden
Vielleicht sind wir in einem Netzwerk und müssen Dienste auf einem oder mehreren entfernten Windows-Computern auflisten. Wir hätten dies in den Tagen von Windows PowerShell mit dem Parameter -ComputerName tun können, aber leider existiert dieser Parameter nicht mehr.
Eine Möglichkeit, Windows-Dienste auf einem entfernten Computer zu inspizieren, ist die Verwendung von Windows PowerShell Remoting (oder PS Remoting). Mit PS Remoting können wir jeden lokalen Befehl kapseln und ihn in einer entfernten Sitzung aufrufen, genau wie wir es lokal machen würden.
Angenommen, wir haben PowerShell Remoting auf einem entfernten Computer aktiviert, könnten wir zum Beispiel das Cmdlet Invoke-Command verwenden, um den Befehl Get-Service auf einem entfernten Computer auszuführen.
$cred = Get-Credential
Invoke-Command -ComputerName SRV1 -ScriptBlock { Get-Service } -Credential $cred
Ausgabe:
Status Name DisplayName PSComputerName
------ ---- ----------- --------------
Stopped AarSvc_55244 AarSvc_55244 SRV1
<SNIP>
Nach der Ausführung gibt das Cmdlet Invoke-Command alle Informationen weiter, die Get-Service zurückgegeben hat, und die Dienste werden wie erwartet an Sie zurückgegeben.
Beachten Sie die zusätzliche PSComputerName-Eigenschaft, die vom Cmdlet Invoke-Command zurückgegeben wird. Wir können auch ein einfaches Skript erstellen, um Dienste auf vielen entfernten Computern aufzulisten.
Dienste in PowerShell starten und stoppen
Wir können auch Dienste mit Windows PowerShell starten und stoppen.
Die Cmdlets Start-Service und Stop-Service tun genau das, was wir erwarten würden. Als nächstes können wir die Pipeline oder den -Name-Parameter unten verwenden.
## Stop a service
$serviceName = 'wuauserv'
Stop-Service -Name $serviceName
## Stop a service with the pipeline
Get-Service $wuauserv | Stop-Service
Alle *-Service-Cmdlets ermöglichen es uns, die Dienstnamenwerte mit den Parametern -Name und -DisplayName vollständig auszufüllen. Geben Sie einfach den Parameter -Name gefolgt von einem Leerzeichen ein und drücken Sie die Tab-Taste.
Wir werden sehen, dass es durch alle Dienste auf dem lokalen Computer durchläuft. Dasselbe Konzept gilt auch für das Starten von Diensten.
## Start a service
$serviceName = 'wuauserv'
Start-Service -Name $serviceName
## Start service with the pipeline
Get-Service $wuauserv | Start-Service
Sowohl die Befehle Start-Service als auch Stop-Service sind idempotent, was bedeutet, dass wenn ein Dienst entweder gestartet oder gestoppt ist und wir versuchen, den Dienst zu stoppen oder zu starten, wenn er sich bereits in diesem Zustand befindet, die Cmdlets den Dienst überspringen werden.
Um entfernte Dienste mit PowerShell zu stoppen und zu starten, müssen Sie diese Befehle erneut in einen Skriptblock einfügen und PowerShell Remoting verwenden, um sie remote aufzurufen, wie unten gezeigt.
$cred = Get-Credential
$serviceName = 'wuauserv'
Invoke-Command -ComputerName SRV02 -ScriptBlock { Start-Service -Name $using:serviceName } -Credential $cred
Dienst in PowerShell neu starten
Um den Codewiederverwendungsaufwand zu begrenzen, um einen Dienst mit Windows PowerShell neu zu starten, sollten wir besser das Cmdlet Restart-Service verwenden. Dieses Cmdlet tut genau das, was wir denken, und funktioniert ähnlich wie die anderen Dienstbefehle.
Wenn wir beispielsweise den Dienst wuauserv wie im vorherigen Beispiel oben starten und stoppen möchten, könnten wir etwas Code einsparen, indem wir die Ausgabe von Get-Service direkt an Restart-Service pipen, wie unten gezeigt.
## Restart a service with the Name parameter
$serviceName = 'wuauserv'
Get-Service -Name $serviceName | Restart-Service
Den Starttyp eines Dienstes in PowerShell ändern
Der Starttyp eines Dienstes ist das Attribut, das bestimmt, was die Dienste tun, wenn Windows hochfährt. Also haben wir wieder einige Optionen.
Automatisch: Der Dienst beginnt automatisch, wenn Windows hochfährt.Deaktiviert: Der Dienst wird niemals gestartet, es sei denn, er wird geändert.Manuell: Der Dienst kann gestartet werden, muss aber manuell vorgenommen werden.Automatisch – Verzögert: Der Dienst startet automatisch, wird jedoch verzögert, sobald Windows bootet.
Zuerst müssen wir wissen, was ein Starttyp ist. Sie können dies mit Get-Service herausfinden.
Wenn Sie Get-Service verwenden, um den Starttyp zu finden, werden Sie feststellen, dass Get-Service ihn Status nennt und als Eigenschaft Status dargestellt wird.
(Get-Service -Name wuauserv | select *).StartType
Ausgabe:
Manual
Sobald Sie den aktuellen Starttyp kennen, können wir ihn mit Set-Service ändern. Das folgende Beispiel legt den Starttyp auf Automatisch fest.
Set-Service -Name <service name> -StartupType Automatic
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn