2016-05-23 188 views
1

對於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? –

回答

0

你是對的,這可能是一個驗證問題。 PowerShell使用Kerberos作爲這個東西,併爲域加入的東西設置。 我認爲你在可信任的主機加入正確的路線......

http://powershell.com/cs/blogs/tips/archive/2016/01/25/enabling-powershell-remoting-with-ntlm.aspx有一篇文章,它解釋瞭如何設置它,並使用與您所描述的略有不同的語法。也許試試?

+0

我認爲winrm的winrm/config/client'@ {TrustedHosts =「*」}'做了這個訣竅。我會查看你發佈的鏈接。 –

0

計算機無法通過域訪問,所以我使用CredSSP來連接它。爲了啓用credssp,我必須在客戶端和服務器上運行enable-wsmancredssp命令行開關,並且必須使用gpedit.msc插件來配置訪問。

相關問題