получить деактивированные компьютеры в объявлении из списка csv

#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 $_' }