Выполните Добавлять-компьютер Powershell удаленно через Вызывать-команду

Сценарий:

При локальном выполнении на 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)
4
задан 13 March 2015 в 19:04
2 ответа

Я думаю, проблема может заключаться в том, как вы генерируете учетные данные с помощью ConvertTo-SecureString . По умолчанию этот командлет использует ключ шифрования, специфичный для текущего хоста (я думаю) , если только вы не предоставите явный ключ шифрования с параметром -Key . На удаленной стороне ему необходимо расшифровать строку, используя тот же ключ шифрования, которого у него нет (потому что ключ хоста другой).

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

* Изменить: вот ссылка на документацию для ConvertTo-SecureString

5
ответ дан 3 December 2019 в 03:06

Взято из: 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

1
ответ дан 3 December 2019 в 03:06

Теги

Похожие вопросы