2016-04-18 18 views
1

特定のグループのobjectguidに対して、ユーザーのSIDと共にグループ内のすべてのユーザーの一覧を返す必要があるLDAPインターフェイスを作成しています。グループ内のすべてのユーザーを返す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

あなたは、特定のgroupからユーザーSIDsを取得する方法についていくつかのオプションがあります。

  1. GroupPrincipalAccountManagement 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. あなたはList<string>にあなたのクエリからすべてのユーザーのDistinguishedNameを格納し、UserPrincipalクラスを使用して、ユーザーSID探しを行うことができます。

    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のリストを取得することができ、最後のオプションは、この場合にはuserSIDbyte[] arrayとして返されます*照会し、まだDirectoryEntry

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

NOTEを使用しています。

関連する問題