-Filter
должен быть записан не как блок скрипта ({..}
), а как обычная строка.
Это должно сделать то, что вы после:
$filter = "(Enabled -eq 'False' -and EmailAddress -like '*@contoso.com') -and (SamAccountName -like 'TEST*' -or SamAccountName -like 'PROD*')"
Get-ADUser -Filter $filter -SearchBase "OU=USERS,DC=contoso,DC=com" -SearchScope Subtree -Properties EmailAddress, MemberOf | ForEach-Object {
if ($_.MemberOf -match 'CN=IT_(Test|Prod)') {
# the user is a member of any IT_Group, get the names of all groups for this user
$groups = foreach ($grp in $_.MemberOf) { (Get-ADGroup -Identity $grp).Name }
$_ | Select-Object Name, SamAccountName, @{Name = 'MemberOf'; Expression = {$groups -join ', '}}
}
else {
# the user is not a member of any IT_Group
$_ | Select-Object Name, SamAccountName, @{Name = 'MemberOf'; Expression = {'Not a member of any IT_Group'}}
}
} | Export-CSV -Path "C:\tmp\output.csv" -NoTypeInformation -Encoding UTF8
Анализ имени объекта из DistinghuishedName сложен, потому что там могут быть специальные символы. Вот почему этот код использует командлет Get-ADGroup
для получения имен групп.
Если значения SamAccountNames не имеют значения, и вы хотите получить ВСЕХ пользователей в OU OU=USERS,DC=contoso,DC=com
, которые не являются Включено И имеет адрес электронной почты, оканчивающийся на @contoso.com
, чем просто изменить переменную $filter
на
$filter = "Enabled -eq 'False' -and EmailAddress -like '*@contoso.com'"
Согласно вашему последнему комментарию, вы хотели бы только перечислить группы IT_Test
и / или IT_Prod
для пользователей, которые являются членами любой из этих двух групп, приведенный ниже код должен сделать это:
$filter = "(Enabled -eq 'False' -and EmailAddress -like '*@contoso.com') -and (SamAccountName -like 'TEST*' -or SamAccountName -like 'PROD*')"
Get-ADUser -Filter $filter -SearchBase "OU=USERS,DC=contoso,DC=com" -SearchScope Subtree -Properties EmailAddress, MemberOf | ForEach-Object {
$testgroups = $_.MemberOf | Where-Object { $_ -match 'CN=IT_(Test|Prod)'}
if ($testgroups) {
# the user is a member of group IT_Test and/or IT_Prod, get the names of these groups for this user
$groups = foreach ($grp in $testgroups) { (Get-ADGroup -Identity $grp).Name }
$_ | Select-Object Name, SamAccountName, @{Name = 'MemberOf'; Expression = {$groups -join ', '}}
}
else {
# the user is not a member of any IT_Group
$_ | Select-Object Name, SamAccountName, @{Name = 'MemberOf'; Expression = {'Not a member of any IT_Group'}}
}
} | Export-CSV -Path "C:\tmp\output.csv" -NoTypeInformation -Encoding UTF8
Надеюсь, что поможет