#powershell
Вопрос:
я пытаюсь выяснить, какие компьютеры отключены. для этого я предоставляю имена компьютеров в списке csv. я просто хочу вывести компьютеры, которые деактивированы. это то, что у меня есть. к сожалению, у меня все компьютеры отключены. но я хочу, чтобы эти имена были указаны только в csv
Import-CSV -Path "C:pc_names" | Select -expand Name | Get-ADComputer -searchbase 'XXX' -Filter {(Enabled -eq $False)} -Properties Name, OperatingSystem | Export-CSV “C:TempDisabledComps.CSV” -NoTypeInformation
Комментарии:
1. Вы не включили сообщение об ошибке.
Ответ №1:
Проблема, скорее всего, в Get-ADComputer
команде, вы указываете SearchBase
(предположительно подразделение) и фильтр для всех отключенных компьютеров, но на самом деле никогда не указываете имя компьютера, которое вы передали из CSV, поэтому он просто возвращает каждый отключенный компьютер в этой базе поиска.
Попробуйте вместо этого что-нибудь подобное;
Import-CSV -Path "C:pc_names" | Select -Expand Name | Get-ADComputer -SearchBase 'XXX' -Filter {(Enabled -eq $False) -and ($_.Name)} -Properties Name, OperatingSystem | Export-CSV "C:TempDisabledComps.CSV" -NoTypeInformation
Обратите $_.Name
внимание на фильтр.
Вероятно, я неправильно понял синтаксис фильтра, но это должно быть причиной.
Комментарии:
1. к сожалению, это не работает. скрипт говорит, что $_.фильтр не определен
2. Да, я подумал, что, возможно, неправильно понял синтаксис. Вы можете сделать это вместо этого, я просто проверял быстро и работает;
$pcnames | % { Get-ADComputer -Identity $_ } | ? -Property Enabled -eq $False
обратите внимание, что$pcnames
это просто массив строк, в данном случае E.г;$pcnames = @('PC1','PC2')
получение фильтр работать будет лучший способ сделать это, хотя, я просто не так много времени сейчас — такой подход значительно медленнее, как он будет работать командлет Get-ADComputer команду для каждого устройства в отдельности. Надеюсь, это поможет в промежутке.
Ответ №2:
Вы не можете проверить, можно ли найти имя компьютера в массиве имен с помощью -Filter
параметра..
Сначала вам нужно собрать компьютерные объекты в вашем подразделении SearchBase и отфильтровать только те, которые отключены.
После этого вы отфильтровываете те, которые можно найти в массиве $pcNames, используя предложение Where-Object:
$pcNames = (Import-Csv -Path "C:pc_names.csv").Name
Get-ADComputer -SearchBase 'XXX' -Filter "Enabled -eq 'False'" -Properties OperatingSystem |
Where-Object { $pcNames -contains $_.Name } | # or: Where-Object { $_.Name -in $pcNames }
Export-Csv -Path "C:TempDisabledComps.csv" -NoTypeInformation
Примечание: Get-ADComputer
по умолчанию уже возвращает эти свойства: DistinguishedName, DNSHostName, Enabled, Name, ObjectClass, ObjectGUID, SamAccountName, SID, UserPrincipalName
. Это означает, что в этом случае вам нужно только запросить дополнительную собственность OperatingSystem
Ответ №3:
Довольно очевидно, что нечто подобное игнорирует то, что передается по каналу, и возвращает множество компьютеров.
'comp001' | get-adcomputer -filter 'Enabled -eq $False'
Если вы подождете до конца, появится сообщение об ошибке:
get-adcomputer : The input object cannot be bound to any parameters for the command either because the command does not take pipeline input or the input and its
properties do not match any of the parameters that take pipeline input.
At line:1 char:13
'comp001' | get-adcomputer -filter 'Enabled -eq $false'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : InvalidArgument: (comp001:String) [Get-ADComputer], ParameterBindingException
FullyQualifiedErrorId : InputObjectNotBound,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
Вы также можете ввести-adcomputer в цикл по каждому элементу и имя теста:
$list = echo comp001 comp002 comp003
$list | % { get-adcomputer -filter 'Enabled -eq $False -and Name -eq $_' }