Wer einen Dienst starten oder stoppen möchte macht dies im Normalfall über die Dienste-Verwaltung in der Systemsteuerung oder den Task-Manager. Allerdings ist es durchaus auch sinnvoll das in einem PowerShell-Skript oder einer Batch-Datei zu erledigen. Wie das geht erfährst du in diesem Artikel.
Stoppen in PowerShell
1 |
Stop-Service -DisplayName "Backup" |
Service starten in PowerShell
1 |
Start-Service -DisplayName "Backup" |
Stoppen in CMD
1 |
net stop "Backup" |
Starten in CMD
1 |
net start "Backup" |
Beispiel mit nicht automatisch startenden Diensten
Auf einem Windows Server 2003 R2 hatte ich damals ab und zu das Problem, dass bestimmte Exchange-Dienste und der HyperV-VM-Shutdown-Dienst nach einem Neustart des Servers nicht zuverlässig starteten. Obwohl unter Dienststart „Automatisch“ konfiguriert war tat sich nichts.
Um das ganze bei einem automatischen Neustart zu überprüfen, hatte ich mir eine Kombination aus einem Batch- und einem PowerShell-Skript gebaut. Denn unter Server 2003 R2 hatte ich leider keine Möglichkeit gefunden ein PowerShell-Skript direkt über die Aufgabenplanung beim Systemstart auszuführen. Mit einem Batch-Skript ist dies aber auch in älteren Windows-Server-Versionen problemlos möglich.
Das PowerShell-Skript sieht wie folgt aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$Services = "MSExchangeSA", "MSExchangeIS", "MSExchangeADTopology", "MSExchangeAntispamUpdate","MSExchangeEdgeSync","MSExchangeFDS", "MSExchangeMailSubmission", "MSExchangeMailboxAssistants", "MSExchangePop3", "MSExchangeRepl","MSExchangeSearch", "MSExchangeServiceHost", "MSExchangeTransport", "MSExchangeTransportLogSearch"; foreach ($Service in $Services) { $ServiceObj = Get-Service $Service; if ($ServiceObj.Status -ne "Running") { do { cmd /c "net start $Service"; Start-Sleep -Seconds 30; $ServiceObj = Get-Service $Service; } while ($ServiceObj.Status -ne "Running") } } |
Das Skript iteriert durch alle in der Variable $Services angegebenen Dienste und überprüft ob diese bereits ausgeführt werden. Ist dies nicht der Fall werden sie über „net start“ gestartet.
AutostartCheckup.ps1
Die Batch-Datei sieht wie folgt aus:
Eine Batchdatei um die PS1-Datei aufzurufen könnte, mit eingebauten Timeout, wie folgt aussehen:
1 2 |
timeout /T 150 powershell -command "& './AutostartCheckupExchangeServices.ps1';" |
Natürlich funktioniert das PowerShell-Skript auch unter neueren Server-Versionen. Allerdings braucht man hier die zusätzliche Batch-Datei nicht unbedingt.
Fazit
Mit Hilfe der Befehle kann man aber auch komplexere Probleme lösen, wenn z. B. ein Dienst erst nach einem anderen gestartet werden darf oder wenn für den Neustart einer Anwendung auch ein Dienst neu gestartet werden muss.