Я написал этот сценарий, но результат одинаков для всех компьютеров. Точнее, если у моего устройства есть имя реестра, то оно есть у всех, что не отражает реальности. То же самое, если оно есть на моем устройстве. Мне нужна помощь, чтобы понять свою ошибку. заранее спасибо
$ADSearchBaseComputers = 'ou=computers,ou=xxx,ou=xx,ou=xxx,dc=xx,dc=xxx,dc=xxx'
$computers= get-adcomputer -filter * -searchbase "$ADSearchBaseComputers" | select -Property SamAccountName
foreach ($computer in $computers)
{
Invoke-Command {
$RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
$RegName= Get-ItemProperty -Path $RegPath -Name MTBLogin
if ($RegName)
{
Write-Output "Reg Key presente pour $($computer.SamAccountName)"
}
else
{
Write-Output "Reg Key non presente pour $($computer.SamAccountName)"
}
}
}
Изначально у меня были значения $RegPath
и $RegName
перед циклом, поэтому я переместил их внутрь, но результат тот же.
Я изменил команду invoke на Invoke-Command -computer $computer. но выдает ошибку Invoke-Command: набор параметров не может быть разрешен с использованием указанных именованных параметров. В строке: 7 символов: 13 + { Invoke-Command -computer $computer + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ + CategoryInfo: InvalidArgument: (:) [Invoke-Command], ParameterBindingException + FullyQualifiedErrorId: AmbiguousParameterSet,Microsoft.PowerShell.Commands.InvokeCommandCommand
@ js2010 - я согласен с вами, но я только начинаю с Powershell
Я сделал еще 2 исправления.
отредактировал скрипт $computers= get-adcomputer -filter * -searchbase "$ADSearchBaseComputers" -properties Имя | select -ExpandProperty Name foreach($computer in $computers) { Invoke-Command -computer $computer
как мне передать значение $computer внутри команды вызова? foreach($computer in $computers) {Invoke-Command -computer $computer { xxxxxxx Write-Output "Reg Key Presente pour $computer"
как мне передать значение $computer внутри команды вызова? имя, содержащееся в $computer, отсутствует в выводе записи-вывода foreach($computer in $computers) { Invoke-Command -computer $computer { $RegPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run" $RegName = Get-ItemProperty -Path $RegPath -Name MTBLogin if ($RegName) { Write-Output "Регистрационный ключ представлен для $компьютера"}
нашел, что мое решение добавило новую переменную в блок сценария $DeviceName = $env:computername
Так зачем использовать Write-Output
и добавлять новую переменную внутри блока сценария? Пусть он вместо этого выводит PsCustomObject со свойствами KeyPresent (значение $true или $false) и другим свойством ComputerName (значение = $env:ComputerName). КСТАТИ. Invoke-Command может обрабатывать массив имен компьютеров, поэтому нет необходимости перебирать их по одному.
Я бы сделал как-то так. Предоставление invoke-command всего массива имен компьютеров заставит ее работать параллельно. Если вы вернете объект, вы автоматически получите pscomputername. Это должно дать результат, есть ли запись в реестре или нет.
$ADSearchBaseComputers = 'ou=computers,ou=xxx,ou=xx,ou=xxx,dc=xx,dc=xxx,dc=xxx'
$computers= get-adcomputer -filter * -searchbase $ADSearchBaseComputers |
select -ExpandProperty Name
Invoke-Command $computers {
$RegPath = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
$RegName = Get-ItemProperty -Path $RegPath -Name MTBLogin
[pscustomobject]@{RegName = [boolean]$RegName}
}
RegName PSComputerName RunspaceId
------- -------------- ----------
True COMP001 d4124bfd-f3d1-4af0-b065-1607627f224a
True COMP002 d4124bfd-f3d1-4af0-b065-1607627f224b
False COMP003 d4124bfd-f3d1-4af0-b065-1607627f224c
В этом много неправильного: не используется select -expand, используется samaccountname вместо имени, не сообщается invoke-command, на каком компьютере запускать код.