2017-02-11 2 views
0

У меня есть следующий рабочий скрипт, который проверяет, является ли большой список пользователей в CSV-файле членом группы AD и записывает результаты в results.csv.Как получить список выбранных групп AD, членом которых является большой список пользователей?

Не знаете, как преобразовать сценарий, чтобы я мог изменить $group = "InfraLite" на $group = DC .\List_Of_AD_Groups.CSV.

Таким образом, сценарий не просто возвращает совпадения для одной группы AD, но так что он возвращает совпадения для групп 80 AD, содержащихся в List_of_AD_groups.csv. Написание YES/NO для каждой группы AD в новом столбце CSV (или, если это невозможно, создание отдельного CSV-файла для каждой группы с результатами будет также.

Я мог бы сделать это вручную, изменив значение из $group и имя файла экспорта и повторного запуска скрипта в 80 раз, но должен быть быстрым был с PS, чтобы сделать это

например results.csv?:

NAME AD_GROUP1 AD_GROUP2 AD_GROUP80 etc etc. 
user1  yes  no   yes 
user2  no   no   yes 
user3  no   yes  no
echo "UserName`InfraLite" >> results.csv 

$users = GC .\user_list.csv 
$group = "InfraLite" 

$members = Get-ADGroupMember -Identity $group -Recursive | 
      Select -ExpandProperty SAMAccountName 

foreach ($user in $users) { 
    if ($members -contains $user) { 
     echo "$user $group`tYes" >> results.csv 
    } else { 
     echo "$user`tNo" >> results.csv 
    } 
} 

ответ

0

тривиальное решение вашей проблемы было бы обернуть ваш существующий код в другом цикле и создать выходной файл для каждой группы:

$groups = Get-Content 'C:\groups.txt' 

foreach ($group in $groups) { 
    $members = Get-ADGroupMember ... 
    ... 
} 

Более изящный подход был бы создать шаблон отображения группы, клонировать его для каждого пользователя, и заполнить копию с членством в группах пользователя. Нечто подобное должно работать:

$template = @{} 
Get-Content 'C:\groups.txt' | ForEach-Object { 
    $template[$_] = $false 
} 

$groups = @{} 
Get-ADGroup -Filter * | ForEach-Object { 
    $groups[$_.DistinguishedName] = $_.Name 
} 

Get-ADUser -Filter * -Properties MemberOf | ForEach-Object { 
    $groupmap = $template.Clone() 
    $_.MemberOf | 
    ForEach-Object { $groups[$_] } | 
    Where-Object { $groupmap.ContainsKey($_) } | 
    ForEach-Object { $groupmap[$_] = $true } 
    New-Object -Type PSObject -Property $groupmap 
} | Export-Csv 'C:\user_group_mapping.csv' -NoType 
0

я играл с этим на некоторое время, и я думаю, что я нашел способ, чтобы получить Вас именно то, что вы были после.

Я думаю, что Ansgar был на правильном пути, но я не мог заставить его делать то, что было после. Он упомянул, что на момент написания статьи он не имел доступа к среде AD.

Вот что я придумал:

$UserArray = Get-Content 'C:\Temp\Users.txt' 
$GroupArray = Get-Content 'C:\Temp\Groups.txt' 
$OutputFile = 'C:\Temp\Something.csv' 

# Setting up a hashtable for later use 
$UserHash = New-Object -TypeName System.Collections.Hashtable 

# Outer loop to add users and membership to UserHash 
$UserArray | ForEach-Object{ 
    $UserInfo = Get-ADUser $_ -Properties MemberOf 
    # Strips the LPAP syntax to just the SAMAccountName of the group 
    $Memberships = $UserInfo.MemberOf | ForEach-Object{ 
     ($_.Split(',')[0]).replace('CN=','') 
    } 
    #Adding the User=Membership pair to the Hash 
    $UserHash.Add($_,$Memberships) 
} 

# Outer loop to create an object per user 
$Results = $UserArray | ForEach-Object{ 
    # First create a simple object 
    $User = New-Object -TypeName PSCustomObject -Property @{ 
     Name = $_ 
    } 
    # Dynamically add members to the object, based on the $GroupArray 
    $GroupArray | ForEach-Object { 
     #Checking $UserHash to see if group shows up in user's membership list 
     $UserIsMember = $UserHash.($User.Name) -contains $_ 
     #Adding property to object, and value 
     $User | Add-Member -MemberType NoteProperty -Name $_ -Value $UserIsMember 
    } 
    #Returning the object to the variable 
    Return $User 
} 

#Convert the objects to a CSV, then output them 
$Results | ConvertTo-CSV -NoTypeInformation | Out-File $OutputFile 

Будем надеяться, что все имеет смысл. Я прокомментировал столько, сколько мог. Было бы очень просто преобразовать в ADSI, если у вас не было RSAT, установленного на любой машине, на которой вы запускаете это. Если вам это нужно, дайте мне знать, и я сделаю некоторые быстрые изменения.

Я также бросил слегка измененную версию этого в Gist для более поздней справки.