2016-07-21 161 views
0

我试图在运行Windows Server 2008/2012的超过1000台主机上更改密码。他们分配到不同的域,所以我通过他们的IP连接到他们,他们所有的PowerShell远程打开。 卡住我的脚本实现。现在我只想连接到单个主机并更改用户或管理员的密码。正确执行远程PS命令

这里是我的代码使用

$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 /管理员” 属于远程主机,我的地方计算机名和用户名是不同的。 我没有收到任何错误或正确的输出。密码不变。如果我尝试在任何主机上手动运行这些命令 - 它的工作原理。

有什么建议吗?也许工作的解决方案?

回答

1

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

取下外引号和转义和代码应工作,你希望:

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

的脚本块已经阻止变量从当前上下文正在扩大。

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