2011-02-10 3 views
2

Je dois d'abord énumérer tous les groupes AD de l'utilisateur actuel. Obtenir le SID et le nom est facile:Comptage des membres du groupe de sécurité Active Directory

foreach(var group in WindowsIdentity.GetCurrent().Groups) 
{ 
    var sid = new SecurityIdentifier(group.Value); 
    string name = (group.Translate(typeof(NTAccount)) as NTAccount).Value; 
} 

Alors j'ai besoin de déterminer le nombre de membres dans chacun des groupes, et je ne peux pas que pour travailler. Je suppose que j'ai besoin d'un moyen d'obtenir le nom distinctif des groupes des utilisateurs actuels. Une idée de comment l'obtenir?

Ce que je l'ai fait jusqu'à présent: J'ai essayé WMI requête comme ceci, mais il renvoie aucun résultat parce que je besoin du nom de domaine complet, mais NTAccount ne me donne que le compte de domaine « convivial » (DOMAIN \ groupe) :

SELECT PartComponent FROM Win32_GroupUser 
WHERE (GroupComponent = "Win32_Group.Domain='somedomain', Name='somegroup'") 

Alors j'ai essayé LDAP, travaillant autour du chemin/nom distinctif manquant en se liant au SID du groupe:

var adGroupEntry = new DirectoryEntry(String.Format("LDAP://<SID={0}>", group.Value)); 
if (adGroupEntry != null) 
{ 
    IEnumerable members = adGroupEntry.Invoke("Members", null) as IEnumerable; 
    if (members != null) 
    { 
    foreach (object member in members) 
    { 
     noOfMembers++; 
    } 
    } 
} 

I t trouve le groupe, la propriété name renvoie la valeur correcte, cependant Members ne contient aucun élément. Si je connaissais le chemin LDAP complet pour un groupe (comme lorsque je le code en dur), le code ci-dessus donnerait le nombre correct d'utilisateurs dans le groupe.

Qu'est-ce qui me manque ici? Je ne suis pas très familier avec Active Directory ou WMI.

Restrictions:

  • Je ne peux pas coder en dur les noms de domaine ou les chemins LDAP. Je suis limité à .NET 2.0, donc je ne peux pas utiliser System.DirectoryServices.AccountManagement.

Répondre

1

Je peux repro votre problème dans mon environnement. Cela ressemble à un bug dans ADSI pour moi. L'objet COM renvoyé ne fonctionne pas si vous utilisez simultanément serverless binding et SID binding.

Je pourrais contourner cela en n'utilisant pas bindnig serverless. c'est-à-dire en utilisant ce LDAP://*yourdomain.com*/<SID={0}> à la place

Je pourrais également contourner cela en liant à nouveau l'objet.

var adGroupEntry = new DirectoryEntry(String.Format("LDAP://<SID={0}>",group.Value)); 
string dn = adGroupEntry.Properties["distinguishedName"].Value as string; 
DirectoryEntry de = new DirectoryEntry("LDAP://" + dn); 
if (de != null) 
{ 
    IEnumerable members = de.Invoke("Members", null) as IEnumerable; 
    if (members != null) 
    { 
     foreach (object member in members) 
     { 
      noOfMembers++;  
     } 
    } 
} 
+0

Merci beaucoup de tester mon code et la solution de contournement! En fait, il a résolu le problème pour moi aussi:) Je ne m'attendais pas à pouvoir obtenir le nom distinctif des propriétés, car la propriété typée pour cette info ne contenait pas de contenu utile dans QuickWatch. – realMarkusSchmidt

Questions connexes