2011-11-08 10 views
10

Sto tentando di elencare tutti in un gruppo di sicurezza in una directory attiva senza utilizzare CmdLets in PowerShell. La cosa strana con il mio script è che funziona se elenco l'intera directory ma se provo a specificare con una query ldap cosa voglio essere elencato non funziona. So che la mia domanda di LDAP è corretta perché l'ho usata in un altro vbs simile e funziona. Le righe commentate sono dove ho provato a inserire la query.Elenco degli utenti nel gruppo di annunci in modo ricorsivo con lo script PowerShell senza CmdLets

$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} 
+2

Perché non è possibile utilizzare i cmdlet? È come dire "Voglio programmare qualcosa in C# senza usare metodi". – JNK

+0

Le persone suggeriscono che dovrei installare e voglio che venga eseguito su qualsiasi computer con solo lo script. – yoyomommy

+0

I CmdLets sono disponibili con il modulo di directory attivo in PowerShell 2.0. – JPBlanc

risposta

8

Ecco qualcosa che funziona in Active Directory 2003 SP2 e 2008 R2. Io uso ADSI e Microsoft LDAP_MATCHING_RULE_IN_CHAIN. Ricerca in modo ricorsivo (ma in una query) tutti gli utenti di un gruppo (fate attenzione che restituisca agli utenti di sicurezza e distribuzioni gruppo)

Clear-Host 
$dn = New-Object System.DirectoryServices.DirectoryEntry ("LDAP://WM2008R2ENT:389/dc=dom,dc=fr","[email protected]","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"] 
} 
+0

per avere un elenco completo di utenti, computer e gruppi utilizzare questa riga modificata: $ dsLookFor.Filter = "(& (memberof: 1.2.840.113556.1.4.1941: = CN = sg01, OU = sg, DC = int, DC = io, DC = locale) (objectCategory = *)) "; –

+0

Entrambi funzionavano perfettamente, ma questo aveva più funzionalità come quello che stavo cercando, quindi ho scelto questo. Grazie mille per il tuo aiuto! – yoyomommy

6

In questo modo ottenere tutti i membri del gruppo Administrators di dominio, tra cui i membri nidificati (richiede .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) 
+0

Entrambi funzionavano perfettamente, ma il secondo aveva più funzionalità come quello che stavo cercando, quindi ho scelto quello. Grazie mille per il tuo aiuto! Scusa non potevo concedere ad entrambi il credito ... – yoyomommy

+0

+1 Perché è più corto del mio; o) – JPBlanc

+0

Nessun problema yoyomommy. @JPBlanc grazie per il voto alto. –

0

Finché si conosce il nome del gruppo, è possibile eseguire il seguente (brutto) quasi-one-liner:

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

Inoltre dal momento che raramente uno senza l'altro, io sono anche andando a includere il modo per elencare tutti i gruppi per un utente utilizzando lo stesso approccio di base:

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

Entrambi questi interrogare il dominio corrente e non richiedono alcuna qualifica di dominio, né richiedono eventuali moduli o libr aggiuntivi Ariete essere installato. Mi trovo anche a lavorare in un ambiente piuttosto vaneggiante di tanto in tanto con autorizzazioni minime in cui ho bisogno di cercare attraverso AD, e trovo che questi due comandi mi aiutino un po '.

Problemi correlati