3 Stimmen

Warum besteht der Windows-Fernwartungsdienst darauf, als "verzögert starten" eingestellt zu werden?

Ich habe Probleme mit dem WinRM-Dienst. Er besteht immer darauf, ein "Verzögerter Start (Automatisch)"-Dienst zu sein, anstatt einfach "Automatisch".

Warum? Das verursacht Probleme für meine VMs (auf Hyper-V). Ich setze sie programmgesteuert über PowerShell zurück und muss dann über PowerShell-Remoting auf sie zugreifen, aber manchmal ist der WinRM-Dienst einfach noch nicht gestartet, wenn ich die VMs zum ersten Mal online bringe (sie sind "vollständig gebootet", d.h. ich kann mich einloggen).

Wenn ich den Dienst dennoch auf automatisch setze, sagt das Ausführen des PowerShell-Befehls winrm quickconfig, dass der Dienst nicht für Remoting eingerichtet ist, und besteht darauf, den Dienst wieder auf verzögerten Start zu setzen.

Wie kann ich sicherstellen, dass der Windows RM-Dienst läuft, bevor ich versuche, eine Remote-PowerShell-Sitzung zu öffnen?

6voto

Mitul Punkte 9484

Eine grundlegende Überlegung, warum bestimmte Dienste nach dem Startvorgang geladen werden könnten (verzögerter Start), wäre:

  1. Um die Startleistung des Servers zu verbessern und einige Sicherheitsvorteile zu bieten.

  2. 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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X