2016-04-17 7 views
0

Ich habe zwei Dateien. Das erste mit enthält Hostnamen (Computers.txt) und das zweite enthält SID (SID.txt). Ich möchte Get-Content und foreach verwenden, um einen Befehl auf jedem Computer mit der entsprechenden SID auszuführen, um die Registrierung zu ändern.Get-Content und foreach in zwei Dateien

Nehmen wir zum Beispiel PC 1 (erste Zeile Computers.txt mit erster Zeile SID.txt) und PC 2 (zweite Zeile Computers.txt mit zweiter Zeile SID.txt).

$Computer = Get-Content D:\Downloads\computers.txt 
$SID = Get-Content D:\Downloads\SID.txt 
foreach ($pc in $Computer) 
{ 
    Invoke-Command -ComputerName $pc {New-Item HKEY_USERS:\$SID -Name -Vaue} 
} 

Antwort

1
  • ein foreach -loop Verwendung nicht gibt Sie die aktuelle Zeilennummer, so dass es unmöglich ist, die gleiche Linie von der SIDs-Liste zu bekommen. Sie sollten einen while - oder for -loop verwenden, um einen Index zu erstellen, der für jeden Lauf um eins erhöht wird, damit Sie die "aktuelle Zeile" kennen.

  • Es gibt keine HKEY_USERS: PSDrive. Sie müssen es für den Zugriff auf die Registry-Provider, wie Registry::HKEY_USERS\

  • Variablen in Ihrem lokalen Bereich (ex. $currentsid) sind im Inneren des Invoke-Command -scriptblock nicht zugänglich, da es auf dem Remote-Computer ausgeführt wird. Sie können es mit -ArgumentList $yourlocalvariable übergeben und es mit $args[0] aufrufen (oder am Anfang des Skriptblocks param ($sid) setzen). Mit PS 3.0+ ist das viel einfacher, da Sie den using-scope ($using:currentsid) in Ihrem Skript verwenden können.

Beispiel:

$Computers = Get-Content D:\Downloads\computers.txt 
$SIDs = Get-Content D:\Downloads\SID.txt 

#Runs one time for each value in computers and sets a variable $i to the current index (linenumer-1 since arrays start at index 0) 
for($i=0; $i -lt $Computers.Length; $i++) { 
    #Get computer on line i 
    $currentpc = $Computers[$i] 
    #Get sid on line i 
    $currentsid = $SIDs[$i] 

    #Invoke remote command and pass in currentsid 
    Invoke-Command -ComputerName $currentpc -ScriptBlock { param($sid) New-Item "REGISTRY::HKEY_USERS\$sid" -Name "SomeKeyName" } -ArgumentList $curentsid 

    #PS3.0+ with using-scope: 
    #Invoke-Command -ComputerName $currentpc -ScriptBlock { New-Item "REGISTRY::HKEY_USERS\$using:currentsid" -Name "SomeKeyName" } 
} 

One-Liner:

0..($Computers.Length-1) | ForEach-Object { Invoke-Command -ComputerName $Computers[$_] -ScriptBlock { param($sid) New-Item REGISTRY::HKEY_USERS\$sid -Name "SomeKeyName" } -ArgumentList $SIDs[$_] } 

Auf einer Seite-Hinweis: Die Verwendung von zwei Dateien mit passenden Zeilennummern ist eine schlechte Idee. Was ist, wenn Computer mehr Zeilen als SIDs haben? Sie sollten eine CSV-Datei verwenden, die Computer und SID zuordnet. Ex ..

input.csv:

Computer,SID 
PC1,S-1-5-21-123123-123213 
PC2,S-1-5-21-123123-123214 
PC3,S-1-5-21-123123-123215 

Dies ist sicherer, einfacher zu warten und Sie können es wie folgt verwenden:

Import-Csv input.csv | ForEach-Object { 
    Invoke-Command -ComputerName $_.Computer -ScriptBlock { param($sid) New-Item REGISTRY::HKEY_USERS\$sid -Name "SomeKeyName" } -ArgumentList $_.SID 
} 
+0

ok, ich werde versuchen und kommentieren die Ergebnisse . Danke – Dfcrespo

+0

Es funktioniert perfekt. Vielen Dank – Dfcrespo

+0

Großartig. Denken Sie daran, die gewählte Antwort mit dem Häkchen links neben der Antwort zu markieren, damit die Frage geschlossen wird. :-) –