我试图在运行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 /管理员"属于远程主机,我的本地计算机名和用户名是不同的。 我这里没有收到任何错误或正确的输出。密码不会改变。如果我尝试在任何主机上手动运行这些命令 - 它可以工作。
有什么建议吗?也许是一个有效的解决方案?
答案 0 :(得分:1)
您可以将要在远程主机上运行的命令定义为scriptblock中的字符串。当您在远程主机上调用scriptblock时,它会执行PowerShell对所有裸字符串执行的操作:回显它们。
删除外部引用和转义,代码应该按预期工作:
size_t count = 0;
while (str != '\0'){ //str is the string name
count++;
}
scriptblock已经阻止在当前上下文中扩展变量。
答案 1 :(得分:0)
发布完整的工作脚本,接受控制台参数,连接到指定的主机并更改用户密码。
希望这会对某人有所帮助
$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