Сценарий:
При локальном выполнении на Azure VM успешно добавляет машину к AD и перезапуски.
$DomainName = "test.local"
$AdminUserName = "sysadmin"
$Password = <mypass>
$SecurePassword = ConvertTo-SecureString $Password -asplaintext -force
$Credential = New-Object -Typename System.Management.Automation.PSCredential -Argumentlist $AdminUserName, $SecurePassword
$Credential
Add-Computer -DomainName $DomainName -Credential $Credential -Restart -Passthru -Verbose
Вопрос:
Используя те же переменные, но теперь запущение скрипта на моей машине, с другой Azure VM как цель, через удаленный Powershell:
$ScriptBlockContent = {
Param ($Arg1,$Arg2)
Add-Computer -DomainName $Arg1 -Credential $Arg2 -Restart -Passthru -Verbose}
$Session = New-PSSession -ConnectionUri $Uri -Credential $Credential
Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($DomainName,$Credential)
Это перестало работать при удаленном выполнении. Почему?
PS C:\> Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList $DomainName, $Credential
VERBOSE: Performing the operation "Join in domain 'test.local'" on target "testvm2".
Computer 'rzlab1sql1' failed to join domain 'test.local' from its current workgroup 'WORKGROUP' with following error
message: Unable to update the password. The value provided as the current password is incorrect.
+ CategoryInfo : OperationStopped: (testvm2:String) [Add-Computer], InvalidOperationException
+ FullyQualifiedErrorId : FailToJoinDomainFromWorkgroup,Microsoft.PowerShell.Commands.AddComputerCommand
+ PSComputerName : mylab.cloudapp.net
Все же что-то более основное, без аргументов, не имеет никаких проблем при выполнении удаленно, таким образом, мой $Uri, $Credential и общий синтаксис кажутся хорошо, сессии запускает и выполняет мой код:
$Path = "C:\"
$Attribute = "d"
$ScriptBlockContent = {
Param ($Arg1,$Arg2)
Get-ChildItem -Path $Arg1 -Attributes $Arg2}
$Session = New-PSSession -ConnectionUri $Uri -Credential $Credential
Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList $Path, $Attribute
Существует ли проблема с Вызывать-командой и способом, которым я храню учетные данные? Какие-либо другие опции получить сделанный (для добавления нового VM к домену из сценария PS)?
Решение
Используйте тест local\sysadmin вместо пользователя системного администратора для соединения с AD.
$DomainName = "test.local"
$AdminUserName = "sysadmin"
$DomainUserName = $DomainName+"\"+$AdminUserName
$Password = <mypass>
$SecurePassword = ConvertTo-SecureString $Password -asplaintext -force
$Credential = New-Object -Typename System.Management.Automation.PSCredential -Argumentlist ($AdminUserName, $SecurePassword)
$DomainCredential = New-Object -Typename System.Management.Automation.PSCredential -Argumentlist ($DomainUserName, $SecurePassword)
$ScriptBlockContent = {
Param ($Arg1,$Arg2)
Add-Computer -DomainName $Arg1 -Credential $Arg2 -Restart -Passthru -Verbose}
$Session = New-PSSession -ConnectionUri $Uri -Credential $Credential
Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($DomainName, $DomainCredential)
Другое (менее безопасное) решение состоит в том, чтобы отправить пользователя простого текста и пароль на удаленный сеанс, и создать учетные данные там:
$ScriptBlockContent = {
Param ($Arg1,$Arg2,$Arg3,$Arg4)
Add-Computer -ComputerName $Arg4 -DomainName $Arg1 -Credential (New-Object -Typename System.Management.Automation.PSCredential -Argumentlist ($Arg1+"\"+$Arg2), (ConvertTo-SecureString $Arg3 -asplaintext -force)) -Restart -Passthru -Verbose}
$Session = New-PSSession -ConnectionUri $Uri -Credential $Credential
Invoke-Command -Session $Session -ScriptBlock $ScriptBlockContent -ArgumentList ($DomainName,$AdminUserName,$Password,$VMName)
Я думаю, проблема может заключаться в том, как вы генерируете учетные данные с помощью ConvertTo-SecureString
. По умолчанию этот командлет использует ключ шифрования, специфичный для текущего хоста (я думаю) , если только вы не предоставите явный ключ шифрования с параметром -Key
. На удаленной стороне ему необходимо расшифровать строку, используя тот же ключ шифрования, которого у него нет (потому что ключ хоста другой).
Во-первых, я бы попробовал передать имя пользователя и пароль в виде открытого текста в качестве другого параметра в вызов и создание учетных данных в блоке сценария. Это, по крайней мере, докажет, действительно ли это ваша проблема.
* Изменить: вот ссылка на документацию для ConvertTo-SecureString
Взято из: http://www.gi-architects.co.uk / 2017/01 / powershell-add-computer-error-when-execute-remotely /
Корень проблемы (при условии, что ваш пароль правильный) в интерактивном режиме, домен добавляется заранее, и поэтому вы только нужно предоставить пользователю. Но в неинтерактивной среде домен не известен. Убедитесь, что вы включили короткие доменные имена, такие как contoso \ DMAdmin
, или полное FQDN (скрытое). Можно использовать следующий сценарий PowerShell, если вы передаете имя пользователя и пароль в качестве переменных безопасно с помощью автоматизации Azure:
$ PasswordSec = ConvertTo-SecureString $ Пароль -AsPlainText -Force
$ djuser = новый-объект -typename System.Management.Automation.PSCredential -argumentlist $ Username, $ PasswordSec
Add-Computer -DomainName "contoso.com" -Credential $ djuser -Restart