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

时间:2016-05-23 09:09:24

标签: active-directory powershell-remoting

对于CI / CD环境,我正在构建一个PowerShell脚本来创建一个新的Hyper-V VM,它基本上是'base-vm'的克隆。此base-vm不是域的成员,它是Windows工作组成员。

尝试将计算机添加到域时遇到以下问题,直接在目标计算机(即管理帐户下运行)上运行时,下面显示的脚本可以正常运行构建服务器(Jenkins)。

该过程如以下方案所示: 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会话。

$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和Negotiate身份验证有关。从域加入的工作站运行脚本时,默认情况下脚本在Kerberos方案下运行,当从独立工作站运行时,它在Negotaite方案下运行,该方案需要一个SPN用于我从https://msdn.microsoft.com/en-us/library/windows/desktop/aa378748(v=vs.85).aspx读取的内容。

2 个答案:

答案 0 :(得分:0)

你是对的,这可能是一个身份验证问题。 PowerShell使用Kerberos来完成这些工作,并为域加入的东西设置。 我认为你和可信赖的主机一起排在正确的位置......

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

答案 1 :(得分:0)

无法通过域访问计算机,因此我使用CredSSP连接到它。要启用credssp,我必须在客户端和服务器上运行enable-wsmancredssp命令行开关,并且必须使用gpedit.msc addin来配置访问权限。