Использование Select-Object и Where-Object в одном предложении с PowerShell

Я новичок в использовании PowerShell, и я пытаюсь выбрать некоторые поля из Active Directory, которые похожи на некоторые строки, позвольте мне объяснить:

Это мой код до сих пор:

$csv = Import-Csv C:\Users\barreola\Desktop\test_AD.csv

$IS = @(
'*601*',
'*609*',
'*602*',
'*608*',
'*610*',
'*611*',
'*1212*',
'*603*',
'*604*'
)


$csv.Username | ForEach-Object {
    Get-ADUser $_ -Properties Department | Select-Object SamAccountName,Department
}

На данный момент это извлекает ожидаемые данные, как показано ниже.

SamAccountName Department                              
-------------- ----------                              
user1          First floor department (0601)
user2          Second floor department (0609)                   
user3          Second floor department (0609)                   
user4          Second floor department (0609)                   
user5          Third floor department (0604)              
user6          Fourth floor department (0707)      
user7          Fifth floor department (0500)                  
user8          Sixth floor department (1306)   
user9          First floor department (0601)

Но я хочу, чтобы PowerShell показывал мне только те, которые содержатся в $IS, что-то вроде

Get-ADUser $_ -Properties Department | Select-Object SamAccountName,Department Where-Object {Department -like $IS}

И ожидаемый результат будет

SamAccountName Department                              
-------------- ----------                              
user1          First floor department (0601)
user2          Second floor department (0609)                   
user3          Second floor department (0609)                   
user4          Second floor department (0609)                   
user5          Third floor department (0604)   
user9          First floor department (0601)

ПРИМЕЧАНИЕ. Файл .csv содержит более 700 000 строк.


person Bryan Arreola    schedule 09.01.2020    source источник


Ответы (1)


Where-Object может сделать это, но это не лучший способ. То, как вы используете Get-ADUser, позволит получить каждого пользователя в вашем домене. Это та часть, которая займет больше всего времени. Таким образом, вы не хотите извлекать больше пользователей, чем нужно, так как это будет просто пустой тратой времени.

Вместо этого используйте параметр -Filter параметра Get-ADUser, чтобы запрашивать в AD только тех пользователей, которых вы хотите. В вашем случае вам понадобится такая строка:

Department -like *601*' -or Department -like '*609*' -or etc.

Вы можете получить такую ​​​​строку из своего массива, выполнив следующие действия:

"Department -like '$($IS -Join "' -or Department -like '")'"

Вы можете прочитать о -Join в документация.

Но тогда вы также не можете использовать параметр -Identity (на который сопоставляется $_) одновременно с -Filter. Поэтому вам придется включить имя пользователя (или SamAccountName) в фильтр.

Собрав это вместе, это будет выглядеть так:

$csv.Username | ForEach-Object {
    Get-ADUser -Filter "SamAccountName -eq '$_' -and (Department -like '$($IS -Join "' -or Department -like '")')" -Properties Department | Select-Object SamAccountName,Department
}
person Gabriel Luci    schedule 09.01.2020
comment
Я действительно работал, я добавил некоторые изменения в ваш ответ, так как «Описание» было неверным. - person Bryan Arreola; 09.01.2020
comment
@BryanArreola Ой, извините. Я читаю слишком быстро. Есть атрибут с именем Description, просто он не тот, который вам нужен. - person Gabriel Luci; 09.01.2020