使用PowerShell和WMI远程将计算机连接到域

问题描述:

对于CI/CD环境,我构建了一个PowerShell脚本来创建新的Hyper-V虚拟机,该虚拟机基本上是“base-vm”的克隆。这个base-vm不是该域的成员,它是一个Windows工作组成员。使用PowerShell和WMI远程将计算机连接到域

当试图将计算机添加到域时,出现以下问题,直接在Hyper-V主机(在管理帐户下运行)的目标计算机上运行,​​但在运行时没有运行从构建服务器(詹金斯)。

的方法是如示于下述方案: Jenkins deployment scheme

并且是失败的脚本部分如下:

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会话管理员crendentials。

$newVmRemoteSession变量包含通过本地管理员crendentials重命名的虚拟机的远程会话。

通过构建作业运行此脚本,而我收到的错误:

[基础-VM]连接到远程服务器基础-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。

+0

错误消息提供了一些建议。你遵循了吗?结果是什么?另外,哪个声明正是把错误放在首位呢? –

+0

我一直在寻找这个问题的解决方案,但我找不到错误。首先,我认为它必须处理构建服务器和虚拟机之间的可信关系,但是当我使用winrm添加该关系时,构建仍然失败。 我用过:'winrm s winrm/config/client'@ {TrustedHosts =“*”}''添加关系。 –

+0

在您的Jenkins主机上:您是否检查过a)VM的新名称可以解析为IP地址,以及b)您可以连接到VM上的端口5985? –

你是对的,这可能是一个验证问题。 PowerShell使用Kerberos作为这个东西,并为域加入的东西设置。 我认为你在可信任的主机加入正确的路线......

http://powershell.com/cs/blogs/tips/archive/2016/01/25/enabling-powershell-remoting-with-ntlm.aspx有一篇文章,它解释了如何设置它,并使用与您所描述的略有不同的语法。也许试试?

+0

我认为winrm的winrm/config/client'@ {TrustedHosts =“*”}'做了这个诀窍。我会查看你发布的链接。 –

计算机无法通过域访问,所以我使用CredSSP来连接它。为了启用credssp,我必须在客户端和服务器上运行enable-wsmancredssp命令行开关,并且必须使用gpedit.msc插件来配置访问。