我研究过如何使用 psexec 组合多个命令,但似乎没有一种方法可行。也许是因为我在 PowerShell 中运行脚本而不是 cmd.exe?
我需要创建用户帐户并将其添加到非域计算机 (Windows 2003) 上的本地管理员组。我已导出以下脚本(可行),但我想知道是否有一种简单的方法可以组合两个 foreach 循环,因为它必须为每个服务器建立两次 psexec 连接。
$username = Read-Host "User name:"
$password = Read-Host "Password:"
$fullname = Read-Host "Full name:"
$computers = Get-Content C:\Tools\scripts\ServerList.txt
foreach ($computer in $computers) {
psexec \\$computer -u username -p password net user $username $password /add /fullname:""$fullname"" /comment:"Comment"
}
foreach ($computer in $computers) {
psexec \\$computer -u username -p password net localgroup Administrators $username /add
}
正如我所提到的,这是在 PowerShell 中运行的。我运行它的服务器是未安装 PowerShell 的工作组 Windows 2003 服务器。
答案1
psexec
正如@CIA 所说,您只需在一次循环中运行两次即可组合循环。
$username = Read-Host "User name:"
$password = Read-Host "Password:"
$fullname = Read-Host "Full name:"
$computers = Get-Content C:\Tools\scripts\ServerList.txt
foreach ($computer in $computers) {
psexec \\$computer -u username -p password net user $username $password /add /fullname:""$fullname"" /comment:"Comment"
psexec \\$computer -u username -p password net localgroup Administrators
}
但你真正想问的是如何运行这两个网络命令在一次psexec
会话中。
$username = Read-Host "User name:"
$password = Read-Host "Password:"
$fullname = Read-Host "Full name:"
$computers = Get-Content C:\Tools\scripts\ServerList.txt
foreach ($computer in $computers) {
psexec \\$computer -u username -p password net user $username $password ullname"" /comment:"Comment" ^&^& net localgroup Administrators
}
您可以尝试这种方式,但我不确定它是否会起作用。&&
使用转义^
,以便将其传递给psexec
而不是在本地解释,然后net
在本地运行第二个命令。
选择
你可以做的是psexec
根本不使用 PowerShell 远程控制。只需在你想要远程控制的每台机器上启用它即可。我知道这可能有点困难,但它是值得的,因为它更加通用,而且基本上,它是未来的趋势。
如果你在域中,你甚至可以使用组策略启用 PowerShell 远程处理(全面披露:这是我的文章)。
如果你这样做了,你的代码将如下所示:
$username = Read-Host "User name:"
$password = Read-Host "Password:"
$fullname = Read-Host "Full name:"
$computers = Get-Content C:\Tools\scripts\ServerList.txt
foreach ($computer in $computers) {
Invoke-Command -ComputerName $computer -ArgumentList $username,$password,$fullname -ScriptBlock { param($u,$p,$f)
# Everything in here is executed on the remote computer
net user $u $p /add /fullname:""$f"" /comment:"Comment"
net localgroup Administrators
}
}