正确执行远程PS命令

时间:2016-07-21 13:20:00

标签: powershell powershell-remoting

我试图在运行Windows Server 2008/2012的1000多台主机上更改密码。他们分配到不同的域,所以我通过他们的IP连接到他们,所有这些都打开了PowerShell远程处理。 坚持我的脚本实现。现在我只想连接到单个主机并更改用户的密码或管理员。

这是我使用的代码

$username = "UserWhose Password I want to change"
$password = ConvertTo-SecureString "users old password" -AsPlainText    -Force 
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password

$serverNameOrIp = "host ip address here"

$s = New-PSSession -ComputerName $serverNameOrIp -Authentication default -Credential $cred
#invoke the scriptblock remotely 
$sb = {
  "[ADSI]`$Admin=`"WinNT://$env:COMPUTERNAME/$env:USERNAME`""
  "`$Admin.SetPassword(`"Users new password`")"
}
Invoke-Command -Session $s -ScriptBlock $sb

Remove-PSSession $s

现在,我得到控制台输出:

PS C:\> ./script

[ADSI]$Admin="WinNT://WIN-TA49U0TR9GT/Administrator"
$Admin.SetPassword("Users new password")

PS C:\>

" WINNT:// WIN-TA49U0TR9GT /管理员"属于远程主机,我的本地计算机名和用户名是不同的。 我这里没有收到任何错误或正确的输出。密码不会改变。如果我尝试在任何主机上手动运行这些命令 - 它可以工作。

有什么建议吗?也许是一个有效的解决方案?

2 个答案:

答案 0 :(得分:1)

您可以将要在远程主机上运行的命令定义为scriptblock中的字符串。当您在远程主机上调用scriptblock时,它会执行PowerShell对所有裸字符串执行的操作:回显它们。

删除外部引用和转义,代码应该按预期工作:

size_t count = 0;
while (str != '\0'){     //str is the string name
count++;
}

scriptblock已经阻止在当前上下文中扩展变量。

答案 1 :(得分:0)

发布完整的工作脚本,接受控制台参数,连接到指定的主机并更改用户密码。

ARGS = IP USERNAME OLDPASS NEWPASS

希望这会对某人有所帮助

$serverNameOrIp = $args[0]
$username = $args[1]
$password = ConvertTo-SecureString -String $args[2] -AsPlainText -Force 
$newPassword = $args[3]
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $password

$s = New-PSSession -ComputerName $serverNameOrIp -Authentication default -Credential $cred
$sb = {
    param($newPassword)
    [ADSI]$Admin = "WinNT://$env:COMPUTERNAME/$env:USERNAME"
    $Admin.SetPassword($newPassword)
}
Invoke-Command -Session $s -ScriptBlock $sb -args $newPassword
Remove-PSSession $s