2016-04-18 11 views
1

Ich schreibe eine LDAP-Schnittstelle, die für eine bestimmte Gruppe objectguid eine Liste aller Benutzer in diesen Gruppen zusammen mit der Benutzer-SID zurückgeben muss.LDAP-Abfrage, um alle Benutzer in einer Gruppe zurückzugeben

Für die Gruppe objectguid einer gegebenen Gruppe gibt der folgende Code die Benutzer in dieser Gruppe zurück. Jedoch sind sie alle in der Form ...

CN=Chad Hutchins,OU=Contractors,DC=RM,DC=LOCAL 

... aber ich brauche die SID des Benutzers gegen die obige Zeichenfolge. Gibt es eine Möglichkeit, die SID eines Benutzers ausgehend von einer Gruppe zu erhalten und nach allen Benutzern in dieser Gruppe zu fragen?

using System.DirectoryServices; 

public void GetUsers(Guid groupId, string domain, string username, string password) 
{ 
    var rootEntry = new DirectoryEntry("LDAP://" + domain); 
    rootEntry.Username = username; 
    rootEntry.Password = password; 

    var searcher = new DirectorySearcher(rootEntry); 
    searcher.Filter = @"(objectguid=" + ConvertGuidToOctectString(groupId) + ")"; 

    var groupResult = searcher.FindOne(); 
    foreach (DictionaryEntry prop in groupResult.Properties) 
    { 
     var key = (string)prop.Key; 

     switch (key) 
     { 
      case "member": 
       foreach (string name in groupResult.Properties[key]) 
        Console.WriteLine(name); 
       break; 
     } 
    } 
} 

private string ConvertGuidToOctectString(Guid guid) 
{ 
    var byteGuid = guid.ToByteArray(); 
    var queryGuid = string.Empty; 
    foreach (var b in byteGuid) 
    { 
     queryGuid += @"\" + b.ToString("x2"); 
    } 
    return queryGuid; 
} 
+0

Können Sie die 'AccountManagement' Klasse verwenden? Es wird sehr einfach sein, die Benutzer-SID zu erhalten. Wenn nicht, dann können Sie alle "DistinguishedName" aller Mitglieder in der Liste der Strings speichern und dann nach Benutzern anhand ihres DN suchen und dann können Sie die 'SIDs' abrufen. – smr5

Antwort

1

Sie haben einige Möglichkeiten, wie Benutzer SIDs von einem bestimmten group abzurufen.

  1. Verwenden GroupPrincipal in AccountManagement namepsace.

    public static List<string> GetUsersFromGroupByGroupID(string ID) 
    { 
        using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "yourdomain.com") 
        { 
         using (GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, IdentityType.Guid, ID)) 
         { 
          if (group != null) 
          { 
           List<string> memberSIDs = new List<string>(); 
           var members = group.GetMembers(true); 
           foreach(var member in members) 
           { 
            memberSIDs.Add(member.Sid.ToString()); 
           } 
           return memberSIDs; 
          } 
         } 
        } 
        return null; 
    } 
    
  2. können Sie speichern die DistinguishedName aller Benutzer aus der Abfrage in eine List<string> und dann ein SID mit UserPrincipal Klasse für Benutzer nachschlagen tun.

    public static List<string> GetUserSIDs(List<string>userDNs) 
    { 
        List<string> userSIDs = new List<string>(); 
        using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "yourdomain.com")) 
        { 
         foreach(string userDN in userDNs) 
         { 
          using (UserPrincipal user = UserPrincipal.FindByIdentity(ctx, IdentityType.DistinguishedName, userDN)) 
          { 
           if (user != null) 
           { 
            userSIDs.Add(user.Sid.ToString()); 
           } 
          } 
         } 
        } 
        return userSIDs; 
    } 
    
  3. Und die letzte Option, die Sie immer noch die Liste der DistiniguishedName bekommen können von Ihnen abfragen und noch DirectoryEntry

    using (DirectoryEntry entry = new DirectoryEntry("LDAP://userDistinguishedName") 
    { 
        var userSID = entry.Properties["objectSID"][0]; 
    } 
    

HINWEIS * in diesem Fall benutzen userSID als byte[] array zurückgegeben.

Verwandte Themen