Für eine CI/CD-Umgebung erstelle ich ein PowerShell-Skript, um eine neue Hyper-V-VM zu erstellen, bei der es sich im Grunde um einen Klon eines 'base-vm' handelt. Diese Basis-VM ist kein Mitglied der Domäne, sondern ein Windows-Arbeitsgruppenmitglied.Computer remote an Domäne mit Powershell und WMI anschließen
Beim Versuch, den Computer der Domäne hinzuzufügen, habe ich das folgende Problem, das unten angezeigte Skript funktioniert direkt auf dem Zielcomputer, der der Hyper-V-Host ist (unter einem Administratorkonto ausgeführt), aber nicht ausgeführt vom Build-Server (Jenkins).
Der Prozess ist in dem folgenden Schema wie folgt:
und das Skript Teil, das versagt ist folgende:
Invoke-Command -Session $remoteSession -Scriptblock {
Rename-Computer -NewName $args[0] -Restart
} -ArgumentList $vmSettings.ComputerName
Start-Sleep -s 30
$newVmRemoteSession = New-PSSession -ComputerName $vmSettings.ComputerName -Credential $credentials
Invoke-Command -Session $newVmRemoteSession -Scriptblock {
Add-Computer -Domainname myfunny.domain -Credential $args[0] -Restart
} -ArgumentList $domainAdminCredentials
Remove-PSSession $newVmRemoteSession
Remove-PSSession $remoteSession
Write-Host "Done creating new VM"
Die $remoteSession
Variable enthält eine Remote-Sitzung Powershell basiert auf dem lokalen Administrator-Anmeldedaten.
Die Variable $newVmRemoteSession
enthält eine Remotesitzung für die umbenannte virtuelle Maschine mit den lokalen Administrator-crendentials.
Der Fehler Ich erhalte während dieses Skript über einen Aufbaujob ausgeführt wird:
[base-vm] Verbindung zum Remote-Server Basis-vm mit der folgenden Fehlermeldung fehlgeschlagen: WinRM den Vorgang nicht abschließen können. Stellen Sie sicher, dass der angegebene Computername gültig ist, dass auf den Computer über das Netzwerk zugegriffen werden kann und dass eine Firewall-Ausnahme für den WinRM-Dienst aktiviert ist und den Zugriff von diesem Computer aus ermöglicht. Standardmäßig beschränkt die WinRM-Firewall-Ausnahme für öffentliche Profile den Zugriff auf Remotecomputer innerhalb desselben lokalen Subnetzes. Weitere Informationen finden Sie im Hilfethema about_Remote_Troubleshooting.
Der Befehl, der die Ausnahme auslöst ist:
Invoke-Command -Session $newVmRemoteSession -Scriptblock {
Add-Computer -Domainname myfunny.domain -Credential $args[0] -Restart
} -ArgumentList $domainAdminCredentials`
Ich habe für die Lösung für dieses Problem suchen, aber ich kann den Fehler nicht finden. Zuerst dachte ich, es habe mit vertrauenswürdigen Beziehungen zwischen dem Build-Server und der virtuellen Maschine zu tun, aber als ich WinRM verwendete, um diese Beziehung hinzuzufügen, schlägt der Build immer noch fehl.
Ich verwendete: winrm s winrm/config/client '@{TrustedHosts="*"}'
, um die Beziehung hinzuzufügen.
UPDATE: Die andere Sache, die ich getan habe, ist das Ausführen des Skripts mit dem gleichen Benutzer wie der Build-Server tat. Dies gab mir den gleichen Fehler wie oben. Das Seltsame ist, dass der Benutzer ein lokaler Administrator auf dem Server ist, von dem aus das Skript ausgeführt wird, und außerdem Mitglied der Gruppe "Remote Management Users" auf diesem Server ist.
UPDATE2: Ich habe herausgefunden, dass das Problem mit Kerberos versus Negotiate Authentifizierung zu tun hat. Bei der Ausführung eines Skripts von einer mit der Domäne verbundenen Arbeitsstation wird das Skript standardmäßig unter dem Kerberos-Schema ausgeführt, und wenn es von einer eigenständigen Arbeitsstation ausgeführt wird, wird es unter dem Negotitaite-Schema ausgeführt, das einen SPN für das benötigt, was ich von https://msdn.microsoft.com/en-us/library/windows/desktop/aa378748(v=vs.85).aspx gelesen habe.
Die Fehlermeldung bietet einige Hinweise. Hast du es verfolgt? Was waren die Ergebnisse? Auch welche Aussage wirft den Fehler überhaupt auf? –
Ich habe nach der Lösung für dieses Problem gesucht, aber ich kann den Fehler nicht finden. Zuerst dachte ich, dass es mit vertrauenswürdigen Beziehungen zwischen dem Build-Server und der virtuellen Maschine zu tun hat, aber wenn ich winrm verwendete, um diese Beziehung hinzuzufügen, schlägt der Build immer noch fehl. Ich habe verwendet: 'winrm s winrm/config/client '@ {TrustedHosts =" * "}' ', um die Beziehung hinzuzufügen. –
Auf Ihrem Jenkins-Host: Haben Sie überprüft, dass a) der neue Name der VM in eine IP-Adresse aufgelöst werden kann und b) Sie eine Verbindung zu Port 5985 auf der VM herstellen können? –