Для среды CI/CD я создаю скрипт PowerShell для создания новой виртуальной машины Hyper-V, которая в основном является клоном «base-vm». Этот base-vm не является членом домена, он является членом рабочей группы Windows.Удаленное подключение компьютера к домену с помощью powershell и WMI
При попытке добавить компьютер в домен у меня возникает следующая проблема, приведенный ниже сценарий работает при запуске непосредственно на целевой машине, которая является хостом Hyper-V (выполняется под учетной записью администратора), но не при запуске с сервера сборки (Jenkins).
Процесс, как показано на следующей схеме:
а часть сценария, который неисправного заключается в следующем:
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.
Сообщение об ошибке предлагает некоторые советы. Вы следили за ним? Каковы были результаты? Кроме того, какое утверждение точно бросает ошибку в первую очередь? –
Я искал решение этой проблемы, но я не могу найти ошибку. Сначала я думал, что это связано с доверительными отношениями между сервером сборки и виртуальной машиной, но когда я использовал winrm, чтобы добавить эти отношения, сборка все еще терпит неудачу. Я использовал: 'winrm s winrm/config/client '@ {TrustedHosts =" * "}'', чтобы добавить отношения. –
На хосте Jenkins: вы проверили, что: а) новое имя виртуальной машины может быть разрешено к IP-адресу, а b) вы можете подключиться к порту 5985 на виртуальной машине? –