itallrounder
Goto Top

PS - Start Remote Service if Service not running

Guten Morgen zusammen,

wir haben seit einigen Tagen ein Problem auf unseren Citrix Terminalservern.
Nach dem Neustart gegen 03:00 aller Server startet der Dienst "Citrix Profilverwaltung" leider nicht auf allen Servern.

Ich bin hier noch auf Ursachenforschung, wollte dafür dann kurzfristig ein Workaround schaffen.

Leider komme ich mit der Aufgabe in Powershell an meine Skripting grenzen und bräuchte euer Fachwissen.


Folgende Skript liegt vor:

$ServiceName = 'ctxProfile'  
$ctxserver = get-content "\\fileserver01\support\Deployment\ctx-servers.txt"  
$ServiceStatus = Get-Service -ComputerName $ctxserver -Name $ServiceName 



foreach ($computer in $ctxserver)
{
    while ($ServiceStatus.Status -ne 'Running')  
    {
    Start-Service $ServiceName
    write-host $ServiceStatus.status
    write-host 'Service starting'  
    Start-Sleep -seconds 60
    $ServiceStatus.Refresh()
    if ($ServiceStatus.Status -eq 'Running')  
    {
    Write-Host '$ServiceName is now Running'  
    }

    }
}

Ich erhalte allerdings folgende Ausgabe in der Powershell:

Start-Service : Es kann kein Dienst mit dem Dienstnamen "ctxProfile" gefunden werden.  
In Zeile:10 Zeichen:5
+     Start-Service $ServiceName
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (ctxProfile:String) [Start-Service], ServiceCommandException
    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.StartServiceCommand
 
Stopped Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Ru
nning Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running
Service starting
$ServiceName is now Running
Start-Service : Es kann kein Dienst mit dem Dienstnamen "ctxProfile" gefunden werden.  
In Zeile:10 Zeichen:5
+     Start-Service $ServiceName
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (ctxProfile:String) [Start-Service], ServiceCommandException
    + FullyQualifiedErrorId : NoServiceFoundForGivenName,Microsoft.PowerShell.Commands.StartServiceCommand
 
Stopped Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Ru
nning Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running Running
Service starting


Folgendes sollte mit dem Skript umgesetzt werden:

- Prüfe alle Citrix Server aus der Liste "ctx-servers.txt", ob der Dienst "ctxProfile" gestartet ist
- Wenn der Dienst nicht den Status "Running" aufweist, soll der Dienst per Powershell auf dem Server gestartet werden
- Optional wäre eine Ausgabe in ein Logfile schön, wo dokumentiert wird, auf welchem Server der Dienst nicht lief und gestartet werden musste

Ich bedanke mich vorab für Input.

Content-ID: 1066562214

Url: https://administrator.de/contentid/1066562214

Ausgedruckt am: 25.11.2024 um 02:11 Uhr

148656
148656 21.07.2021 um 08:56:47 Uhr
Goto Top
Moin,

Dein Skript macht genau das, was du ihm sagst.
In Zeile 3 fragst du den Status auf den Citrix-Servern ab.
In Zeile 11 willst auf dem lokalen Server den Service starten.

Geh nochmal in dich und stelle den gesamten Ablauf in einem Programmablaufplan (PAP) dar.
Den kannst du zu deiner Dokumentation legen, damit du im Falle eines Audits alles zusammen hast.

Gruß
C.C.
SlainteMhath
Lösung SlainteMhath 21.07.2021 um 09:47:52 Uhr
Goto Top
Moin,

TL;DR:
- Zeile 3 gehört zwischen Zeile 8 und 9,
- ersetze dabei $ctxserver durch $computer
- Zeile 11 ersetzen mit: $ServiceStatus | Set-Service -Status Running

lg,
Slainte
ITAllrounder
ITAllrounder 21.07.2021 um 10:27:58 Uhr
Goto Top
Danke an @slaite

Das Skript läuft nun sauber durch.

Der Vollständigkeit halber hier nochmal das Skript:

$ServiceName = 'ctxProfile'  
$ctxserver = get-content \\fileserver01\support\Deployment\ctx-servers.txt"  

foreach ($computer in $ctxserver)
{
    $ServiceStatus = Get-Service -ComputerName $computer -Name $ServiceName 
    while ($ServiceStatus.Status -ne 'Running')  
    {
    $ServiceStatus | Set-Service -Status Running
    write-host $ServiceStatus.status
    write-host 'Service starting'  
    Start-Sleep -seconds 60
    $ServiceStatus.Refresh()
    if ($ServiceStatus.Status -eq 'Running')  
    {
    Write-Host '$ServiceName is now Running'  
    }

    }
}
RenWin
RenWin 21.07.2021 um 15:27:55 Uhr
Goto Top
Jetzt hab ich mal noch ne Frage dazu. Warum wird der Computername aus einer Datei entnommen?
Könnte man das nicht einfach über eine Systemvariable machen? Das Script wird ja sowieso nur lokal
ausgeführt. Wäre auch im Recovery Fall sonst ein Fallstrick, da der Fileserver da sein müsste.

Sonst super Script. Das nehme ich mir mal in mein Wiki mit auf für solche Fälle. Danke
SlainteMhath
SlainteMhath 21.07.2021 um 17:00:52 Uhr
Goto Top
Warum wird der Computername aus einer Datei entnommen?
In der Datei stehen (wahrscheinlich) mehrere Computername, deswegen auch die Foreach Schleife.
RenWin
RenWin 21.07.2021 um 18:41:01 Uhr
Goto Top
Zitat von @SlainteMhath:

Warum wird der Computername aus einer Datei entnommen?
In der Datei stehen (wahrscheinlich) mehrere Computername, deswegen auch die Foreach Schleife.

Mein Fehler Danke