Eine grundlegende Überlegung, warum bestimmte Dienste nach dem Startvorgang geladen werden könnten (verzögerter Start), wäre:
-
Um die Startleistung des Servers zu verbessern und einige Sicherheitsvorteile zu bieten.
-
Bestimmte Dienste sind von anderen Diensten abhängig, um zu starten. Im Fall des Dienstes für die Windows Remote-Verwaltung ist er abhängig von folgenden Diensten:
a. HTTP-Dienst
b. Remote Procedure Call (RPC) (Automatisch)
i. DCOM-Serverprozessstartprogramm (Automatisch)
ii. RPC-Endpunktmapper (Automatisch)
Wie kann ich sicherstellen, dass der Windows RM-Dienst läuft, bevor ich versuche, eine RemotepowerShell-Sitzung zu öffnen?
Schauen Sie sich die folgenden Optionen und Funktionen an, die ich entwickelt habe, um das zu tun, was Sie wollen.
A) Sie können Test-Connection verwenden, um zu überprüfen, ob der Computer online ist oder nicht.
Test-Connection -ComputerName $Computer -Count 1 -Quiet
B) Ich habe die Funktion StartWinRMIfStopped
erstellt, die den Dienst "WinRM" mithilfe von WMI startet.
C) Die zweite Funktion ist TryToCreateNewPSSession
, die versucht, eine neue PSSession
zu erstellen oder Ihnen ein Ausnahmenobjekt gibt.
param([string]$server)
Get-PSSession | Remove-PSSession
$newsession = $null
function StartWinRMIfStopped
{
param([string]$ComputerName)
Write-Host $ComputerName
$WinRMService = Get-WmiObject -Namespace "root\cimv2" -class Win32_Service -Impersonation 3 -ComputerName $ComputerName | Where-Object {$_.Name -match "WinRM"}
if($WinRMService.State -eq "Stopped" -or $WinRMService.State -eq "Paused"){
"WinRM-Dienst ist" + $WinRMservice.State
$WinRMService.StartService()
}
else{
"WinRM-Dienst ist " + $WinRMservice.State
}
}
function TryToCreateNewPSSession{
param([string]$computerName)
Try
{
$newsession = New-PSSession -Computer $computerName -ErrorAction Stop
#Connect-PSSession -Session $newsession
$newsession
}
Catch [System.Management.Automation.RuntimeException]{
if($error.Exception.Gettype().Name -eq "PSRemotingTransportException"){
Write-host "WinRM-Dienst ist auf dem Server nicht gestartet"
}
Write-host "RuntimeException beim Erstellen einer neuen PSSession zum Server aufgetreten"
}
Catch [Exception]{
Write-host "Generische Ausnahme beim Erstellen von PSSession"
}
}
$error.Clear()
Wenn (Test-Connection -Computer $server -count 1 -Quiet) {
#Verbindung zum Server erfolgreich
StartWinRMIfStopped $server
Start-Sleep -s 4
#Befehl auf dem Remote-Server ausführen mithilfe der Funktion trytocreatenewpssession.
Invoke-Command -Session (TryToCreateNewPSSession $server) -ScriptBlock { write-host "Hallo Welt"}
}
Sie können das gesamte Skript aufrufen als
PS C:\> .\ScriptName.ps1 remotecomputername