J'essaie d'énumérer tout le monde dans un groupe de sécurité dans un actif sans utiliser des cmdlets dans PowerShell. La chose étrange avec mon script est que cela fonctionne si je répertorie tout le répertoire, mais si j'essaie de spécifier avec une requête LDAP ce que je veux être répertorié, cela ne fonctionne pas. Je sais que ma requête LDAP est correcte parce que je l'ai utilisé dans un autre VBS similaire et cela fonctionne. Les lignes commentées sont où j'ai essayé de mettre dans la requête.
$strFilter = "(&(objectCategory=person)(objectClass=user))" #$strFilter = "(&(objectCategory=person)(objectClass=user)(memberOf=CN=Common Name,OU=User Groups,...,DC=ad,DC=domain,DC=com))" #... is just left out part of query #$objDomain = New-Object System.DirectoryServices.DirectoryEntry $objDomain = New-Object System.DirectoryServices.DirectoryEntry("LDAP://CN=Common Name,OU=User Groups,...,DC=ad,DC=domain,DC=com") #... is just left out part of query $objSearcher = New-Object System.DirectoryServices.DirectorySearcher $objSearcher.SearchRoot = $objDomain $objSearcher.PageSize = 1000 $objSearcher.Filter = $strFilter $objSearcher.SearchScope = "Subtree" $colProplist = "name" foreach ($i in $colPropList){$objSearcher.PropertiesToLoad.Add($i)} $colResults = $objSearcher.FindAll() foreach ($objResult in $colResults) {$objItem = $objResult.Properties; $objItem.name}
3 Réponses :
Voici quelque chose de travail dans un répertoire actif 2003 SP2 et 2008 R2. J'utilise Adsi et Microsoft LDAP_MATCHING_RULE_IN_CHAIN . Il cherche de manière récursive (mais dans une requête) tous les utilisateurs d'un groupe (soyez prudent de retourner les utilisateurs du groupe de sécurité et de distributions)
Clear-Host $dn = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://WM2008R2ENT:389/dc=dom,dc=fr","jpb@dom.fr","PWD") # To find all the users member of groups "MonGrpPlusSec" : # Set the base to the groups container DN; for example root DN (dc=societe,dc=fr) # Set the scope to subtree # Use the following filter : # (member:1.2.840.113556.1.4.1941:=CN=MonGrpPlusSec,OU=ForUser1,DC=dom,DC=fr) $dsLookFor = new-object System.DirectoryServices.DirectorySearcher($dn) $dsLookFor.Filter = "(&(memberof:1.2.840.113556.1.4.1941:=CN=MonGrpPlusSec,OU=ForUser1,DC=dom,DC=fr)(objectCategory=user))"; $dsLookFor.SearchScope = "subtree"; $n = $dsLookFor.PropertiesToLoad.Add("cn"); $n = $dsLookFor.PropertiesToLoad.Add("distinguishedName"); $n = $dsLookFor.PropertiesToLoad.Add("sAMAccountName"); $lstUsr = $dsLookFor.findall() foreach ($usrTmp in $lstUsr) { Write-Host $usrTmp.Properties["samaccountname"] }
Pour avoir une liste complète des utilisateurs, des ordinateurs et des groupes utilisent cette ligne modifiée: $ dslookfor.filter = "(& (membre de: 1.2.840.113556.1.4.1941: = CN = SG01, OU = SG, DC = INT, D C = io, dc = local) (objec tcategory = *)) ";
Celles-ci ont tous deux fonctionné parfaitement, mais celui-ci avait plus de fonctionnalités comme ce que je cherchais, alors j'ai choisi celui-ci. Merci beaucoup pour votre aide!
Cela obtiendra tous les membres du groupe Administrateurs de domaine, y compris les membres imbriqués (nécessite .NET 3.5).
$Recurse = $true Add-Type -AssemblyName System.DirectoryServices.AccountManagement $ct = [System.DirectoryServices.AccountManagement.ContextType]::Domain $group=[System.DirectoryServices.AccountManagement.GroupPrincipal]::FindByIdentity($ct,'Administrators') $group.GetMembers($Recurse)
Celles-ci ont tous deux fonctionné parfaitement, mais le 2ème avait plus de fonctionnalités comme ce que je cherchais, alors j'ai choisi celui-ci. Merci beaucoup pour votre aide! Désolé je ne pouvais pas vous donner à la fois votre crédit ...
Tant que vous connaissez le nom de groupe, vous pouvez exécuter ce qui suit (laid) quasi-un-doublure: aussi depuis que vous faites rarement un sans l'autre, je suis Allons également inclure la façon de répertorier tous les groupes d'un utilisateur à l'aide de la même approche de base: p> Les deux interrogations de votre domaine actuel et ne nécessitent aucune qualification de domaine, ni Exécutent-ils des modules ou des bibliothèques supplémentaires. Je me trouve également travailler dans un joli environnement de vanille de temps à autre avec des autorisations minimales où j'ai besoin de chercher à travers une annonce, et je trouve ces deux commandes m'aidez avec cela un peu. P> P>
Comment puis-je obtenir le champ de description de groupe à l'aide de ADSI si un nom de groupe est fourni?
@John Eisbrener - Merci pour cela. J'utilise des comptes qui ne peuvent pas installer des cmdlets et c'est donc exactement ce dont j'avais besoin.
Pourquoi ne pouvez-vous pas utiliser des cmdlets? C'est comme dire "Je veux programmer quelque chose en C # sans utiliser des méthodes".
Ceux que les gens suggèrent que je devrais installer et je souhaite que cela fonctionne sur n'importe quel ordinateur avec juste le script.
Les cmdlets sont disponibles avec module Active Directory à PowerShell 2.0.
Parfois, les commandes d'accès à la sécurité et les autorisations limitent la possibilité d'installer / utiliser des cmdlets publicitaires non par défaut, dans ce cas, cette question est toujours pertinente.