正确执行远程 PS 命令

Execute remote PS command properly

我正在尝试更改超过 1000 台主机 运行ning windows 服务器 2008/2012 的密码。他们分配到不同的域,所以我通过他们的 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/Administrator"属于远程主机,我的本地计算机名和用户名不同。 我在这里没有收到任何错误或正确的输出。密码没有改变。如果我尝试在任何主机上手动 运行 这些命令 - 它有效。

有什么建议吗?也许是可行的解决方案?

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

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

$sb = {
  [ADSI]$Admin = "WinNT://$env:COMPUTERNAME/$env:USERNAME"
  $Admin.SetPassword("Users new password")
}

脚本块已经阻止变量在当前上下文中展开。

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

A​​RGS = IP 用户名旧密码新密码

希望这会对某人有所帮助

$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