Использование Select-Object и Where-Object в одном предложении с PowerShell - PullRequest
0 голосов
/ 09 января 2020

Я недавно использую 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+ строк.

1 Ответ

2 голосов
/ 09 января 2020

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
}
...