Como combinar dois loops foreach?

2

Eu olhei como combinar vários comandos com psexec, mas nenhum dos métodos parece funcionar. Talvez seja porque estou executando o script no PowerShell e não o cmd.exe?

Eu preciso criar contas de usuário E adicioná-las ao grupo Administradores local em computadores sem domínio (Windows 2003). Eu tenho derivado o seguinte script (que funciona), mas eu estou querendo saber se há uma maneira fácil de combinar os dois loops foreach, pois tem que estabelecer a conexão psexec duas vezes para cada servidor.

$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
}

Como mencionei, isso está sendo executado no PowerShell. Os servidores em que estou executando são Workgroups Windows 2003 Servers sem o PowerShell instalado.

    
por MarcLaf 04.06.2015 / 17:08

1 resposta

3

Como o @CIA disse, você pode combinar os loops executando apenas psexec duas vezes em um loop.

$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     
}

Mas parece que o que você está realmente perguntando é como executar os net commands em uma única psexec sessão.

$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     
}

Você pode tentar desta forma, mas não tenho certeza se funcionará. O && é escapado usando ^ para que seja passado para psexec em vez de ser interpretado localmente, o que teria então executado o segundo comando net localmente.

Alternativa

O que você poderia fazer em vez disso não é usar psexec e usar o controle remoto do PowerShell. Ele só precisa ser ativado em cada máquina na qual você deseja se conectar. Eu sei que isso pode ser um pouco complicado, mas valerá a pena, já que é muito mais versátil e, basicamente, é o futuro.

Se você estiver em um domínio, poderá até mesmo usar a Política de grupo para ativar o recurso de comunicação remota do PowerShell (divulgação completa: este é o meu artigo).

Se você fez isso, seu código ficaria assim:

$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     
    }
}
    
por 04.06.2015 / 19:03