Wie verwalte ich Windows-Dienste mit PowerShell?

Admin

Sie können Windows-Dienste nicht nur über das Snap-In „services.msc“ oder das Befehlszeilentool „sc.exe“ verwalten, sondern auch mit PowerShell. In diesem Artikel betrachten wir verschiedene Szenarien der Verwaltung von Windows-Diensten mit PowerShell.

Inhalt:

  • PowerShell-Cmdlets zur Verwaltung von Windows-Diensten
  • Wie überprüfe ich den Windows-Dienststatus mit Get-Service?
  • Wie kann ich einen Dienst mit PowerShell stoppen, starten oder neu starten?
  • Verwenden von Set-Service zum Ändern von Diensteinstellungen
  • Wie erstelle oder lösche ich einen Windows-Dienst über PowerShell?
  • Ändern Sie das Benutzerkonto, das den Windows-Dienst ausführt

PowerShell-Cmdlets zur Verwaltung von Windows-Diensten

Es gibt acht grundlegende Dienst-Cmdlets, mit denen Sie den Status von Windows-Diensten anzeigen und verwalten können. Um die vollständige Liste der Dienstverwaltungs-Cmdlets zu erhalten, führen Sie diesen Befehl aus:

Get-Help \*-Service

Grundlegende Powershell-Cmdlets zum Verwalten von Windows-Diensten
  • Get-Service – ermöglicht es, die Dienste auf einem lokalen oder Remote-Computer sowohl im laufenden als auch im gestoppten Zustand abzurufen;
  • Neuer Service – erstellt einen Dienst. Das Cmdlet erstellt einen neuen Eintrag für einen Windows-Dienst in der Registrierung und in der Dienstdatenbank;
  • Neustart-Service – startet einen Dienst neu. Das Cmdlet sendet die Neustartnachricht über den Windows Service Controller.
  • Lebenslauf-Service – nimmt einen Dienst wieder auf. Das Cmdlet sendet eine Fortsetzungsnachricht an den Windows-Dienst-Manager.
  • Set-Service – Ändert die Einstellungen eines lokalen oder Remote-Dienstes, einschließlich seines Status, seiner Beschreibung, seines angezeigten Namens oder seines Startmodus. Sie können dieses Cmdlet auch verwenden, um einen Dienst zu starten, zu stoppen oder anzuhalten.
  • Dienst starten – startet einen Dienst;
  • Dienst anhalten – stoppt einen Dienst (das Cmdlet sendet eine Stoppmeldung an den Windows-Dienstmanager);
  • Suspend-Dienst – unterbricht einen Dienst. Ein angehaltener Dienst wird weiterhin ausgeführt, führt jedoch erst dann etwas aus, wenn er mithilfe des Cmdlets „Resume-Service“ wieder aufgenommen wird.

Eine detaillierte Beschreibung und Beispiele für die Verwendung eines bestimmten Cmdlets erhalten Sie mit Get-Help:

Get-Help Start-Service

Hilfe bekommen

Wie überprüfe ich den Windows-Dienststatus mit Get-Service?

Sie können die Liste der Dienste und deren Status (Wird ausgeführt/Gestoppt) auf einem lokalen oder Remote-Computer abrufen Get-Service Cmdlet. Der -Name Mit dem Parameter können Dienste nach Namen ausgewählt werden. Der Dienstname kann mithilfe des Platzhalterzeichens angegeben werden *.

Überprüfen Sie den Windows-Dienststatus mit Get-Service

Wenn Sie den genauen Dienstnamen nicht kennen, können Sie ihn anhand des angezeigten Namens finden, indem Sie Folgendes verwenden:Anzeigename Parameter. Sie können die Werteliste und Platzhalter verwenden.

Powershell-Dienste abrufen

Benutzen Sie die Get-Service Cmdlet mit dem -Computername Parameter, um den Dienststatus auf einem Remotecomputer abzurufen. Sie können den Dienststatus auf mehreren Remotecomputern gleichzeitig abfragen, indem Sie deren Namen durch Kommas getrennt angeben. Der unten gezeigte Befehl ruft beispielsweise den Spooler-Dienststatus auf den Remotecomputern ny-prnt1 und ny-prnt2 ab.

Get-Service spooler –ComputerName ny-prnt1,ny-prnt2

Statusname DisplayName. Laufender Spooler. Druckspooler. Spooler gestoppt Druckspooler

Um alle Eigenschaften eines Dienstes anzuzeigen, verwenden Sie die Objekt auswählen Cmdlet:

Get-Service spooler | Select-Object *

Get-Service-Eigenschaften

Mit dem Cmdlet Select-Object können bestimmte Eigenschaften eines Dienstes abgerufen werden. Sie möchten beispielsweise den Namen, den Status und die verfügbaren Optionen des Spooler-Dienstes anzeigen:

Get-Service Spooler | Select DisplayName, Status, ServiceName, Can*

Get-Service-Status

Der Get-Service Das Cmdlet verfügt über zwei Parameter, mit denen Sie die Dienstabhängigkeiten anzeigen können:

  • -Abhängige Dienste ermöglicht die Anzeige der vom jeweiligen Dienst abhängigen Dienste
  • -Erforderliche Dienste Zeigt die Dienste an, von denen der angegebene Dienst abhängt

Der folgende Befehl zeigt die Dienste an, die zum Starten des Spooler-Dienstes erforderlich sind:

Get-Service –Name Spooler -RequiredServices

Get-Service RequiredServices

Der folgende Befehl zeigt die Dienste an, die vom Spooler abhängen:

Get-Service –Name Spooler -DependentServices

Get-Service DependentServices

Wenn Sie die Dienste mit dem spezifischen Status oder Parametern finden möchten, verwenden Sie die Wo-Objekt Cmdlet. Lassen Sie uns zum Beispiel die Liste der ausgeführten Dienste abrufen:

Get-Service | Where-Object {$_.status -eq 'running'}

Get-Service: Liste der laufenden Dienste

Um die Dienste mit dem manuellen Starttyp anzuzeigen, führen Sie diesen Befehl aus:

Get-Service | Where-Object {$_.starttype -eq 'Manual'}

Erhalten Sie Service mit dem manuellen Starttyp

Verwenden Sie das folgende PowerShell-Skript, um zu überprüfen, ob ein bestimmter Windows-Dienst auf einem aktuellen Computer vorhanden ist:

if (Get-Service "ServiceTest" -ErrorAction SilentlyContinue)
{
Write-host "ServiceTest exists"
}

Wie kann ich einen Dienst mit PowerShell stoppen, starten oder neu starten?

Sie können einen Dienst mit stoppen Dienst anhalten Cmdlet. Um den Spooler zu stoppen, führen Sie den folgenden Befehl aus:

Stop-Service -Name spooler

Das Stop-Service-Cmdlet zeigt nach der Ausführung nichts an. Um das Ergebnis anzuzeigen, verwenden Sie die -Durchgehen Parameter.

Stop-Service PassThru

Bitte beachten Sie, dass nicht jeder Dienst gestoppt werden kann. Wenn abhängige Dienste vorhanden sind, wird eine Fehlermeldung angezeigt:

Der Dienst kann nicht gestoppt werden, da er über abhängige Dienste verfügt. Es kann nur gestoppt werden, wenn das Force-Flag gesetzt ist.
Der Dienst kann nicht gestoppt werden, da er über abhängige Dienste verfügt. Es kann nur gestoppt werden, wenn das Force-Flag gesetzt ist.

Um das Beenden eines Dienstes zu erzwingen, verwenden Sie die -Gewalt Parameter. Beachten Sie, dass auch alle abhängigen Dienste gestoppt werden:

Stop-Service samss –Force -Passthru

Der folgende Befehl stoppt die angegebenen Dienste (Bits, Spooler), wenn sie sich im Status „Wird ausgeführt“ befinden:

get-service bits, spooler | where {$_.status -eq 'running'} | stop-service –passthru

Stoppen Sie Dienste im laufenden Zustand
Manchmal bleiben Dienste im Status „Wird gestoppt“ hängen und müssen es sein gewaltsam getötet.

Der Dienst starten Cmdlet startet einen gestoppten Dienst:

Start-Service -Name spooler -PassThru

Dienst starten

Ein Dienst wird nicht gestartet, wenn einer seiner abhängigen Dienste gestoppt wird. Um sie zu finden und zu starten, verwenden Sie den folgenden PowerShell-Einzeiler:

get-service samss | Foreach { start-service $_.name -passthru; start-service $_.DependentServices -passthru}

Powershell startet einen Dienst mit allen Abhängigkeiten

Der Suspend-Servce Das Cmdlet kann Dienste anhalten, wenn sie diesen Status unterstützen. Um zu erfahren, ob ein Dienst ausgesetzt werden kann, verwenden Sie die Get-Service Cmdlet mit dem CanPauseAndContinue Eigentum.

Get-Service samss | Format-List name, canpauseandcontinue

Der Get-Service kann angehalten und fortgesetzt werden

Um die Liste aller Dienste anzuzeigen, die möglicherweise angehalten werden, führen Sie diesen Befehl aus:

Get-Service | Where-Object {$_.canpauseandcontinue -eq "True"}

Erhalten Sie einen Service mit der Option „canpauseandcontinue“.

Lassen Sie uns den SQLBrowser-Dienst anhalten:

Suspend-Service -Name SQLBrowser

Suspend-Dienst

Um einen unterbrochenen Dienst fortzusetzen, verwenden Sie die Lebenslauf-Service Cmdlet:

Resume-Service -Name SQLBrowser

Lebenslauf-Service

Der folgende Befehl setzt alle angehaltenen Dienste fort:

get-service | where-object {$_.Status -eq "Paused"} | resume-service

Der Neustart-Service Das Cmdlet startet einen Dienst neu:

Restart-Service -Name spooler

Neustart-Service

Dieser Befehl startet alle gestoppten Netzwerkdienste auf einem Computer:

get-service net* | where-object {$_.Status -eq "Stopped"} | restart-service

Diese Befehle haben nicht das –Computername Parameter, aber Sie können sie mit dem auf einem Remotecomputer ausführen Invoke-Befehl Cmdlet oder eine Pipe.

Um beispielsweise einen Druckspooler auf dem Remotecomputer ny-prnt1 neu zu starten, führen Sie den folgenden Befehl aus:
Get-Service Spooler -ComputerName ny-prnt1 | Start-Service

Standardmäßig dürfen nur Administratoren Windows-Dienste starten/stoppen, Sie jedoch nicht kann Benutzern ohne Administratorrechte Start-/Stopp-/Neustartberechtigungen für einen bestimmten Dienst erteilen.

Verwenden von Set-Service zum Ändern von Diensteinstellungen

Der Set-Service Mit dem Cmdlet können Sie beliebige Parameter oder Einstellungen eines Dienstes auf einem lokalen oder Remotecomputer ändern. Da der Status eines Dienstes eine Eigenschaft ist, können Sie mit diesem Cmdlet einen Dienst starten, stoppen oder anhalten. Set-Service hat die -Starttyp Parameter, der es ermöglicht, den Starttyp eines Dienstes zu ändern.

Ändern wir den Spooler-Starttyp auf „Automatisch“:

Set-Service spooler –startuptype automatic –passthru

Ändern Sie den Starttyp des Druckspoolers in „Automatisch“.

Sie können den manuellen Starttyp festlegen:

Set-Service spooler –startuptype manual –passthru

Stellen Sie den manuellen Starttyp Set-Service ein

Wie erstelle oder lösche ich einen Windows-Dienst über PowerShell?

Neuer Service – ist ein Cmdlet zum Erstellen eines neuen Dienstes in Windows. Geben Sie den Namen und die ausführbare Datei für den neuen Dienst an (Sie können sogar Führen Sie ein PowerShell-Skript als Windows-Dienst aus).

Erstellen wir einen neuen Dienst mit dem Namen TestSvc:

new-service -name TestSvc -binaryPathName "C:\WINDOWS\System32\svchost.exe -k netsvcs"

Neuer Dienst: Dienst mit Powershell erstellen

Rufen Sie Informationen zum Starttyp und zur Beschreibung des Dienstes mit dem Cmdlet Get-WmiObject ab.

get-wmiobject win32_service -filter "name='testservice'"

get-wmiobject win32_service

Sie können die Einstellungen des neuen Dienstes mit dem folgenden Befehl ändern:

Set-Service -Name TestSvc -Description ‘My Service’ -StartupType Manual

Ändern Sie den Starttyp des Dienstes in „Manuell“.

Um einen Dienst zu löschen, führen Sie diesen Befehl aus:

(Get-WmiObject win32_service -Filter ″name=′TestSvc′″).delete()

Ändern Sie das Benutzerkonto, das den Windows-Dienst ausführt

Sie können PowerShell verwenden, um das Benutzerkonto zu ändern, das zum Starten eines Dienstes verwendet wird. Rufen Sie den Namen des Kontos ab, mit dem TestSvc gestartet wird:

get-wmiobject win32_service -filter "name='TestSvc'" | Select name, startname

Rufen Sie das Benutzerkonto ab, um den Dienst auszuführen

Um den Benutzernamen und das Passwort für einen Windows-Dienst zu ändern, führen Sie die folgenden Befehle aus:

$svc = get-wmiobject win32_service -filter "name='TestSvc'"
$svc.GetMethodParameters("change")

Die Liste der Parameter der Change()-Methode wird angezeigt. Zählen Sie, wo sich die Parameter StartName und StartPassword befinden: Sie befinden sich auf der 20Th und 21st Plätze bzw.

Ändern Sie das Runas-Benutzerkonto eines Windows-Dienstes

$svc | Invoke-WmiMethod -Name Change –ArgumentList @ ($null,$null,$null,$null,$null,$null,$null, $null,$null,$null,$null,$null,$null,$null,$null,$null, $null,$null,$null,"Administrator","!123Pa$$w0rd")

Oder Sie können den Namen eines eingeben gMSA Konto (das Kontokennwort wird in diesem Fall nicht angegeben).

Wie Sie sehen, erleichtert PowerShell die Verwaltung von Windows-Diensten. Sie können Dienste erstellen, stoppen, starten oder fortsetzen und deren Eigenschaften ändern. Die meisten Cmdlets ermöglichen die Verwaltung von Diensten auf Remotecomputern.

Suchen Sie nach Windows-Betriebssystemversionen und -Builds in Active Directory
Suchen Sie nach Windows-Betriebssystemversionen und -Builds in Active Directory

Schauen wir uns verschiedene Möglichkeiten zur Inventarisierung von Versionen und Builds von Wind...

Wie starte ich abgestürzte oder geschlossene Apps/Prozesse mit PowerShell automatisch neu?
Wie starte ich abgestürzte oder geschlossene Apps/Prozesse mit PowerShell automatisch neu?

Lassen Sie uns lernen, wie Sie PowerShell verwenden, um zu überprüfen, ob eine bestimmte Anwendun...

RDP-Brute-Force-Schutz mit PowerShell und Windows-Firewallregeln
RDP-Brute-Force-Schutz mit PowerShell und Windows-Firewallregeln

Ich hatte die Idee, ein einfaches PowerShell-Skript zu schreiben, um IP-Adressen, auf denen RDP-B...