Использование foreach
-loop не дает вам текущее LINENUMBER так что невозможно, чтобы получить ту же строку из МОСРГА списка. Вы должны использовать while
- или for
-loop, чтобы создать индекс, который увеличивается на единицу для каждого прогона, чтобы вы знали «текущую строку».
Нет HKEY_USERS:
PSDrive. Вам нужно получить к нему доступ с помощью реестра-провайдера, как Registry::HKEY_USERS\
переменных в локальном масштабе (напр. $currentsid
) не доступны внутри Invoke-Command
-scriptblock, поскольку он выполняется на удаленном компьютере. Вы можете передать его с помощью -ArgumentList $yourlocalvariable
и позвонить ему $args[0]
(или положить param ($sid)
в начале скриптового блока). С PS 3.0+ это намного проще, поскольку вы можете использовать область использования ($using:currentsid
) в своем скрипте.
Пример:
$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" }
}
Однострочник:
0..($Computers.Length-1) | ForEach-Object { Invoke-Command -ComputerName $Computers[$_] -ScriptBlock { param($sid) New-Item REGISTRY::HKEY_USERS\$sid -Name "SomeKeyName" } -ArgumentList $SIDs[$_] }
На боковой ноте: Использование двух файлов с номерами соответствия линии является плохой идеей. Что делать, если у comptuers больше строк, чем SID? Вы должны использовать CSV-файл, который отображает компьютер и SID. 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
Это безопаснее, проще в обслуживании, и вы можете использовать его как это:
Import-Csv input.csv | ForEach-Object {
Invoke-Command -ComputerName $_.Computer -ScriptBlock { param($sid) New-Item REGISTRY::HKEY_USERS\$sid -Name "SomeKeyName" } -ArgumentList $_.SID
}
хорошо, я постараюсь прокомментировать результаты , спасибо – Dfcrespo
Это прекрасно работает. Спасибо y – Dfcrespo
Отлично. Не забудьте отметить выбранный ответ, используя галочку слева от ответа, чтобы вопрос был закрыт. :-) –