正确执行远程 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")
}
脚本块已经阻止变量在当前上下文中展开。
发布完整的工作脚本,接受控制台参数,连接到指定主机并更改用户密码。
ARGS = 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
我正在尝试更改超过 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")
}
脚本块已经阻止变量在当前上下文中展开。
发布完整的工作脚本,接受控制台参数,连接到指定主机并更改用户密码。
ARGS = 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