Énumérer les utilisateurs dans le groupe d'annonce récursivement avec le script powershell sans CmdLets

j'essaie de lister tout le monde dans un groupe de sécurité dans un répertoire actif sans utiliser CmdLets dans PowerShell. Ce qui est bizarre avec mon script, c'est qu'il fonctionne si j'énumère tout le répertoire, mais si j'essaie de spécifier avec une requête ldap ce que je veux être listé, cela ne fonctionne pas. Je sais que ma requête ldap est correcte parce que je l'ai utilisée 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}
11
demandé sur JPBlanc 2011-11-08 22:28:15

3 réponses

voici quelque chose qui fonctionne dans un Active-Directory 2003 SP2 et 2008 R2. J'utilise ADSI et Microsoft LDAP_MATCHING_RULE_IN_CHAIN. Il Recherche récursive (mais dans une seule requête) tous les utilisateurs à partir d'un groupe (attention à ce qu'il revienne utilisateurs de la sécurité et des distributions de groupe)

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"]
}
9
répondu JPBlanc 2011-11-08 19:36:33

cela va obtenir tous les membres du groupe des 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)
8
répondu Shay Levy 2011-11-08 21:01:14

aussi longtemps que vous connaissez le nom du groupe, vous pouvez exécuter le quasi-one-liner (ugly) suivant:

## List Members in a Group
$groupname = 'GroupNameHere'
(New-Object System.DirectoryServices.DirectoryEntry((New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=Group)(name=$($groupname)))")).FindOne().GetDirectoryEntry().Path)).member | % { (New-Object System.DirectoryServices.DirectoryEntry("LDAP://"+$_)) } | Sort-Object sAMAccountName | SELECT @{name="User Name";expression={$_.Name}},@{name="User sAMAccountName";expression={$_.sAMAccountName}}
## List Groups for a Username
$username = 'UsernameHere'
(New-Object System.DirectoryServices.DirectorySearcher("(&(objectCategory=User)(samAccountName=$($username)))")).FindOne().GetDirectoryEntry().memberOf | % { (New-Object System.DirectoryServices.DirectoryEntry("LDAP://"+$_)) } | Sort-Object sAMAccountName | SELECT @{name="Group Name";expression={$_.Name}},@{name="Group sAMAccountName";expression={$_.sAMAccountName}}

tous les deux interrogent votre domaine actuel et n'exigent aucune qualification de domaine, pas plus qu'ils n'exigent l'installation de modules ou de bibliothèques supplémentaires. Je me retrouve aussi à travailler dans une jolie vanille environnement de temps en temps avec des permissions minimales où j'ai besoin de chercher à travers la publicité, et je trouve que ces deux commandes m'aident avec ça un peu.

0
répondu John Eisbrener 2017-04-07 16:39:42