2012-09-10 1 views
2

J'essaye de faire une liste de tous les groupes qui contiennent des membres d'une unité d'organisation spécifique. Pour ce faire, je suis en train de lire un fichier avec la liste de tous les noms de groupes et en utilisant get-ADGroupMember $ groupName pour trouver les membres de chaque groupe. Je convertis la valeur de chaque membre en chaîne et en la comparant à $ member.indexOf ("OU spécifique"). Le problème est que je n'ai pas compris comment obtenir $ member [$ i] .indexOf ("OU spécifique"). Mon code est ci-dessous.Comment faire une boucle sur les membres du groupe Active Directory dans Powershell

EDIT: Si j'utilise une boucle for-each, je peux parcourir les membres correctement, mais je ne peux pas utiliser le break, ce qui empêche les doublons.

Import-Module ActiveDirectory 
#declaring end result group array 
$results = @() 

#sets path for files 
$pathName = $MyInvocation.MyCommand.Path 
$pathLen = $pathName.LastIndexOf("\") 
$pathStr = $PathName.Substring(0,$pathLen +1) 
$APgroupFile = $pathStr + "APGroups.csv" 
$groupFile = $pathStr + "GGroups.csv" 

#gets the list of group names and loops through them 
get-content $groupFile | foreach-object{ 
#sets all of the group names 
#start of if1 
if($_.IndexOf("CN=") -ge 0){ 
$nameStart = $_.IndexOf("CN=")+3 
$nameEnd = $_.indexOf(",")-$nameStart 
$name = $_.substring($nameStart, $nameEnd) 

#issue starts here 
#goal is to find member of "specific OU". 
#If found, add group to $results. If not, go to next group 
$members = get-ADGroupMember -Identity $name 
if($members.length -gt 0){ 
$i=0 
for($i=0; $i -le ($members.length -1); $i++){ 
#need to check users OU for specific OU. If a user is member, save group to .txt. If none are members, move to next group 
    $OU = $members.toString() 
    if($OU.indexOf("OU=specific OU") -ge 0){#start of if OU 
    $results += New-Object psObject -Property @{'GroupName'=$name; 'Member'=$OU} 
    break 
    }#end if OU 
    }#end for mem.length 
}#end if mem.length 
}#end if1 
}#end foreach 

$results | Export-Csv $APgroupFile -NoTypeInformation 

Répondre

4

Essayez ceci:

Get-ADGroupMember -Identity $name | 
Where-Object {$_.distinguishedName -like '*OU=specific OU*'} 
+0

Cela semble fonctionner après le test initial. Tu es génial. Merci. – spassen

+1

Merci. Vous pouvez également obtenir des appartenances imbriquées en ajoutant le commutateur -Recursive. –

0

Une considération que vous n'avez pas mentionné explicitement: Qu'en est-OUs imbriqué? Par exemple, considérez-vous seulement un membre immédiatement dans votre unité d'organisation cible? Ou un membre d'une UO de deux ou trois niveaux de profondeur serait-il aussi logiquement inclus, pour vos besoins? Par exemple, si "Californie" est votre OU cible, voulez-vous seulement des objets directement sous Californie? Ou voulez-vous inclure tous les membres de San Francisco et tous les membres de San Diego (qui sont des sous-unités de la Californie) dans le jeu de résultats? De toute façon:

Get-ADUser includes search and filter capability - http://technet.microsoft.com/en-us/library/ee617241

Get-ADuser -Filter {sAMAccountName -eq "jdoe"} -SearchBase "OU=IS,DC=foodomain,DC=com" -SearchScope SubTree 

    Get-ADuser -Filter {sAMAccountName -eq "jdoe"} -SearchBase "OU=IS,DC=foodomain,DC=com" -SearchScope OneLevel 

Ainsi, l'approche est ici pour rechercher votre cible OU pour votre utilisateur cible, une recherche séparée pour chaque utilisateur. Vous obtiendrez cet utilisateur dans le jeu de résultats retourné ou non. Cela peut être la condition pour laquelle vous testez. Évidemment, vous voudrez remplacer "jdoe" par la variable appropriée (je pense que $ members [i] .SamAccountName fera l'affaire ici).


Juste vu la réponse de Shay Levy. Beaucoup plus concis, bon travail. Sans base de recherche explicite, vous pourriez finir par visiter des conteneurs avec le même nom qui sont enterrés sous d'autres unités d'organisation parentes, mais le jeu de résultats devrait être le même. Par exemple, si chaque ville contient une unité d'organisation standard "Office Staff", chacune d'entre elles sera recherchée avec l'expression "OU = Office Staff". Vous pouvez essayer les deux approches et tester les différences de performances. Cela étant égal, Shay Levy lit plus agréablement.

Questions connexes