2017-02-11 2 views
0

Ich habe das folgende funktionierende Skript, das überprüft, ob eine große Liste von Benutzern in einer CSV-Datei Mitglied einer AD-Gruppe ist und schreibt die Ergebnisse in results.csv.Wie erhalte ich eine Liste ausgewählter AD-Gruppen, zu denen eine große Liste von Benutzern gehört?

Nicht sicher, wie das Skript zu konvertieren, damit ich $group = "InfraLite" zu $group = DC .\List_Of_AD_Groups.CSV ändern kann.

So gibt das Skript nicht nur Übereinstimmungen für eine AD-Gruppe zurück, sondern gibt auch Übereinstimmungen für die 80 AD-Gruppen zurück, die in der List_of_AD_groups.csv ebenfalls enthalten sind. Schreiben Sie ein JA/NEIN für jede AD-Gruppe in einer neuen Spalte in der CSV (oder wenn das nicht möglich ist Erstellen einer separaten CSV-Datei für jede Gruppe mit Ergebnissen würde auch tun.

Ich könnte dies manuell durch Ändern des Wertes tun von $group und Exportdateinamen und Wieder Ausführen des Skripts 80 mal, sondern muss eine schnelle war mit PS, dies zu tun

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

Antwort

0

Die triviale Lösung für Ihr Problem wäre, deinen vorhandenen Code zu verpacken in einer anderen Schleife und erstellen für jede Gruppe einer Ausgabedatei:

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

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

Ein elegantere Ansatz eine Gruppe Mapping-Vorlage zu erstellen wäre, klont es für jeden Benutzer, und die Kopie mit der Gruppenmitgliedschaften des Benutzers füllen. So etwas sollte funktionieren:

$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

ich mit diesem für eine Weile gespielt, und ich glaube, ich einen Weg gefunden, sie zu bekommen genau das, was Sie nach waren.

Ich denke, Ansgar war auf dem richtigen Weg, aber ich konnte es nicht ganz zu tun, was Sie wollten. Er erwähnte, dass er zum Zeitpunkt des Schreibens keinen Zugang zu einer AD-Umgebung hatte.

Hier ist, was ich kam mit:

$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 

Hoffentlich macht alles Sinn. Ich habe so viel wie möglich kommentiert. Es wäre sehr einfach, ADSI zu verwenden, wenn Sie RSAT nicht auf dem Computer installiert haben, auf dem Sie dies ausführen. Wenn Sie das brauchen, lassen Sie es mich wissen, und ich werde ein paar schnelle Änderungen vornehmen.

Ich habe auch eine leicht modifizierte Version von diesem in einer Gist für spätere Referenz geworfen.

Verwandte Themen