【发布时间】:2016-09-20 02:17:07
【问题描述】:
对于 CI/CD 环境,我正在构建一个 PowerShell 脚本来创建一个新的 Hyper-V VM,它基本上是一个“base-vm”的克隆。此 base-vm 不是域的成员,它是 Windows 工作组成员。
当尝试将计算机添加到域时,我遇到以下问题,当直接在作为 Hyper-V 主机(在管理帐户下运行)的目标计算机上运行时,下面显示的脚本有效,但在从以下位置运行时无效构建服务器(詹金斯)。
失败的脚本部分如下:
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"
$remoteSession 变量包含基于本地管理员凭据的远程 PowerShell 会话。
$newVmRemoteSession 变量包含与具有本地管理员凭据的重命名虚拟机的远程会话。
我通过构建作业运行此脚本时收到的错误:
[base-vm] 连接到远程服务器 base-vm 失败并显示以下错误消息:WinRM 无法完成操作。验证指定的计算机名称是否有效,该计算机可通过网络访问,并且 WinRM 服务的防火墙例外已启用并允许从该计算机进行访问。默认情况下,公共配置文件的 WinRM 防火墙例外限制对同一本地子网中的远程计算机的访问。有关详细信息,请参阅 about_Remote_Troubleshooting 帮助主题。
抛出异常的命令是:
Invoke-Command -Session $newVmRemoteSession -Scriptblock {
Add-Computer -Domainname myfunny.domain -Credential $args[0] -Restart
} -ArgumentList $domainAdminCredentials`
我一直在寻找这个问题的解决方案,但我找不到错误。首先我认为它与构建服务器和虚拟机之间的信任关系有关,但是当我使用 WinRM 添加该关系时,构建仍然失败。
我使用:winrm s winrm/config/client '@{TrustedHosts="*"}' 来添加关系。
更新:我做的另一件事是使用与构建服务器相同的用户运行脚本。这给了我与上面相同的错误。奇怪的是,用户是运行脚本的服务器上的本地管理员,并且也是该服务器上“远程管理用户”组的成员。
UPDATE2:我发现问题与 Kerberos 与协商身份验证有关。从加入域的工作站运行脚本时,该脚本默认在 Kerberos 方案下运行,而从独立工作站运行时,它在 Negotaite 方案下运行,我从 https://msdn.microsoft.com/en-us/library/windows/desktop/aa378748(v=vs.85).aspx 读取的内容需要一个 SPN。
【问题讨论】:
-
错误信息提供了一些建议。你跟了吗?结果如何?另外,究竟是哪个语句首先引发了错误?
-
我一直在寻找这个问题的解决方案,但我找不到错误。首先,我认为它与构建服务器和虚拟机之间的受信任关系有关,但是当我使用 winrm 添加该关系时,构建仍然失败。我使用:`winrm s winrm/config/client '@{TrustedHosts="*"}'` 来添加关系。
-
在您的 Jenkins 主机上:您是否检查过 a) VM 的新名称可以解析为 IP 地址,b) 您可以连接到 VM 上的端口 5985?
-
Jenkins 主机不访问新 VM,Hyper-V 主机可以。并且错误发生在重命名之前,脚本无法访问“base-vm”,这是必须重命名的模板 VM。我将尝试为此设置添加示意图。
-
原来问题可能如下:在本地运行时,我作为用户在域中,但是在远程运行时,脚本没有在加入域的 pc 上运行。我会检查一下,然后再回来。 msdn.microsoft.com/en-us/library/aa384295(v=vs.85).aspx
标签: active-directory powershell-remoting