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-Key: 1066562214

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

Printed on: April 19, 2024 at 22:04 o'clock

Mitglied: 148656
148656 Jul 21, 2021 at 06:56:47 (UTC)
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.
Member: SlainteMhath
Solution SlainteMhath Jul 21, 2021 at 07:47:52 (UTC)
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
Member: ITAllrounder
ITAllrounder Jul 21, 2021 at 08:27:58 (UTC)
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'  
    }

    }
}
Member: RenWin
RenWin Jul 21, 2021 at 13:27:55 (UTC)
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
Member: SlainteMhath
SlainteMhath Jul 21, 2021 at 15:00:52 (UTC)
Goto Top
Warum wird der Computername aus einer Datei entnommen?
In der Datei stehen (wahrscheinlich) mehrere Computername, deswegen auch die Foreach Schleife.
Member: RenWin
RenWin Jul 21, 2021 at 16:41:01 (UTC)
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