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
}
ok, ich werde versuchen und kommentieren die Ergebnisse . Danke – Dfcrespo
Es funktioniert perfekt. Vielen Dank – Dfcrespo
Großartig. Denken Sie daran, die gewählte Antwort mit dem Häkchen links neben der Antwort zu markieren, damit die Frage geschlossen wird. :-) –