Для среды CI/CD я создаю сценарий PowerShell для создания новой виртуальной машины Hyper-V, которая по сути является клоном «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="*"}'
, чтобы добавить отношения.
ОБНОВЛЕНИЕ: Еще одна вещь, которую я сделал, это запустить скрипт с тем же пользователем, что и сервер сборки. Это дало мне ту же ошибку, что и выше. Странно то, что пользователь является локальным администратором на сервере, с которого запускается сценарий, а также является членом группы «пользователи удаленного управления» на этом сервере.
ОБНОВЛЕНИЕ 2: я обнаружил, что проблема связана с аутентификацией Kerberos и Negotiate. При запуске сценария с рабочей станции, присоединенной к домену, сценарий запускается по схеме Kerberos по умолчанию, а при запуске с автономной рабочей станции он работает по схеме Negotaite, для которой требуется SPN для того, что я прочитал на https://msdn.microsoft.com/en-us/library/windows/desktop/aa378748(v=vs.85).aspx.