2016-05-23 4 views
1

Для среды CI/CD я создаю скрипт PowerShell для создания новой виртуальной машины Hyper-V, которая в основном является клоном «base-vm». Этот base-vm не является членом домена, он является членом рабочей группы Windows.Удаленное подключение компьютера к домену с помощью powershell и WMI

При попытке добавить компьютер в домен у меня возникает следующая проблема, приведенный ниже сценарий работает при запуске непосредственно на целевой машине, которая является хостом Hyper-V (выполняется под учетной записью администратора), но не при запуске с сервера сборки (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 содержит удаленный сеанс для переименованной виртуальной машины с локальными полномочиями администратора.

Ошибка я получаю во время выполнения этого сценария с помощью скоплению работы:

[база-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="*"}', чтобы добавить отношения.

UPDATE: Другое, что я сделал, это запустить скрипт с тем же пользователем, что и сервер сборки. Это дало мне ту же ошибку, что и выше. Странно то, что пользователь является локальным администратором на сервере, с которого выполняется сценарий, а также является членом группы пользователей удаленного управления на этом сервере.

UPDATE2: Я выяснил, что проблема связана с аутентификацией Kerberos и Negotiate. При запуске скрипта из подключенной рабочей станции домена сценарий выполняется по схеме Kerberos по умолчанию, и при запуске с автономной рабочей станции он выполняется по схеме Negotaite, для которой требуется номер SPN для того, что я читал от https://msdn.microsoft.com/en-us/library/windows/desktop/aa378748(v=vs.85).aspx.

+0

Сообщение об ошибке предлагает некоторые советы. Вы следили за ним? Каковы были результаты? Кроме того, какое утверждение точно бросает ошибку в первую очередь? –

+0

Я искал решение этой проблемы, но я не могу найти ошибку. Сначала я думал, что это связано с доверительными отношениями между сервером сборки и виртуальной машиной, но когда я использовал winrm, чтобы добавить эти отношения, сборка все еще терпит неудачу. Я использовал: 'winrm s winrm/config/client '@ {TrustedHosts =" * "}'', чтобы добавить отношения. –

+0

На хосте Jenkins: вы проверили, что: а) новое имя виртуальной машины может быть разрешено к IP-адресу, а b) вы можете подключиться к порту 5985 на виртуальной машине? –

ответ

0

Вы правы в том, что это, вероятно, проблема с auth. PowerShell использует Kerberos для этого материала и настроен для присоединенного домена. Я думаю, что вы были на правильных строках с добавлением доверенных хостов ...

В статье приведена статья http://powershell.com/cs/blogs/tips/archive/2016/01/25/enabling-powershell-remoting-with-ntlm.aspx, в которой объясняется, как ее настроить, и использует слегка отличающийся синтаксис к тому, что вы описали. Может, попробуй?

+0

Я предположил, что winrm s winrm/config/client '@ {TrustedHosts = "*"}' сделал трюк для этого. Я посмотрю ссылку, которую вы разместили. –

0

Компьютер не был доступен через домен, поэтому я использовал CredSSP для подключения к нему. Чтобы включить credssp, я должен был запустить командлет enable-wsmancredssp на клиенте и сервере и должен был использовать gpedit.msc addin для настройки доступа.

Смежные вопросы