选择

选择

我研究过如何使用 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     
    }
}

相关内容