Get-AdUsers из указанных c групп AD и результатов фильтрации - PullRequest
0 голосов
/ 04 марта 2020

Я могу экспортировать пользователям, которые не являются членами определенных групп, таких как IT_Group, как показано ниже. Но этот скрипт дает мне все членство пользователей в колонке memberof в выводе csv. Если они являются членами каких-либо групп, соответствующих «IT», они должны отображаться в столбце memberof в выводе csv, как показано ниже.

Кроме того, если пользователь не является членом какой-либо группы, которая начинается с IT_, он будет писать Ключевое слово «любая ИТ-группа не является членом» в столбце memberof в выводе csv.

Существует 3 группы безопасности, такие как IT_Group, IT_Group1, IT_Group2

Я пробовал до сих пор:

Get-ADUser -Filter {(emailaddress -like "*@contoso.com" -and Enabled -eq $false -and sAMAccountName -like "TEST*") -or (emailaddress -like "*@contoso.com" -and Enabled -eq $false -and sAMAccountName -like "PROD*")} -SearchBase "OU=USERS,DC=contoso,DC=com" -SearchScope Subtree -Properties * | Where { [string]$_.memberof -notmatch 'IT_Group'} | Select-Object name , samaccountname ,@{Name="MemberOf";Expression={($_.MemberOf | %{(Get-ADGroup $_).sAMAccountName}) -Join ";"}} |Export-CSV -Path "C:\tmp\output.csv" -NoTypeInformation -Encoding UTF8

Мой желаемый выход:

name,samaccountname,memberof
User01,TEST1,IT_Test
User02,PROD1,IT_Prod
User03,TEST4,any IT group is not member

Ответы [ 2 ]

1 голос
/ 04 марта 2020

-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

Надеюсь, что поможет

0 голосов
/ 04 марта 2020

Этот код получает всех пользователей, у которых есть группы, начинающиеся с "IT_", он предоставляется $_.memberof -like 'CN=IT_*'. Затем для каждого пользователя, получающего свое имя, логин и группы, начинающиеся с "CN=IT_", отформатируйте его с помощью -replace и добавьте его в CSV-файл без перезаписи.

$users=Get-ADUser -Filter {filter options}  -Properties MemberOf| Where-Object { $_.memberof -like '*CN=IT_*'}
foreach ($user in $users){    
$user|Select-Object name , samaccountname ,@{Name="MemberOf";Expression={((($_.MemberOf | Select-String -Pattern 'CN=IT_*')-replace "CN=")-replace ",.+$") -Join ";"}} |Export-CSV -Delimiter ';' -Path "D:\testdir\uss.csv" -NoTypeInformation -Encoding UTF8 -Append
}
...