2016-04-18 3 views
1

Я пишу интерфейс LDAP, который для objectguid данной группы должен возвращать список всех пользователей в этих группах вместе с SID пользователя.Запрос LDAP для возврата всех пользователей в группу

Для данной группы objectguid приведенный ниже код возвращает пользователей в этой группе. Однако они все в форме ...

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

... но мне нужен SID пользователя по сравнению с приведенной выше строкой. Есть ли способ получить SID пользователя, начиная с группы и запрашивая для всех пользователей в этой группе?

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

Можете ли вы использовать класс 'AccountManagement'? Было бы очень легко получить пользовательский «SID». Если нет, то то, что вы можете сделать, это сохранить все 'DistinguishedName' всех членов внутри списка строк, а затем выполнить поиск пользователей по их DN, а затем вы можете получить« SID ». – smr5

ответ

1

У вас есть несколько вариантов, как получить пользователь SIDs от конкретного group.

  1. Использование GroupPrincipal в 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. Вы можете хранить DistinguishedName всех пользователей из вашего запроса в List<string>, а затем сделать выглядеть для пользователя SID с помощью UserPrincipal класса.

    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. И последний вариант, вы все равно можете получить список DistiniguishedName от вас запрос и по-прежнему использовать DirectoryEntry

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

Примечание * в этом случае userSID будут возвращены как byte[] array.

Смежные вопросы