LDAP 查询 return 组中的所有用户
LDAP query to return all users in a group
我正在编写一个 LDAP 接口,对于给定组的 objectguid
,必须 return 这些组中所有用户的列表以及用户的 SID。
对于给定组的 objectguid
下面的代码 return 是该组中的用户。然而他们都在形式...
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;
}
关于如何从特定 group
检索用户 SIDs
的选项很少。
在 AccountManagement
命名空间中使用 GroupPrincipal
。
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;
}
您可以将查询中所有用户的 DistinguishedName
存储到 List<string>
中,然后使用 [=20] 查找用户 SID
=] class.
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;
}
最后一个选项你仍然可以从你的查询中得到 DistiniguishedName
的列表并且仍然使用 DirectoryEntry
using (DirectoryEntry entry = new DirectoryEntry("LDAP://userDistinguishedName")
{
var userSID = entry.Properties["objectSID"][0];
}
注意* 在这种情况下 userSID
将返回为 byte[] array
。
我正在编写一个 LDAP 接口,对于给定组的 objectguid
,必须 return 这些组中所有用户的列表以及用户的 SID。
对于给定组的 objectguid
下面的代码 return 是该组中的用户。然而他们都在形式...
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;
}
关于如何从特定 group
检索用户 SIDs
的选项很少。
在
AccountManagement
命名空间中使用GroupPrincipal
。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; }
您可以将查询中所有用户的
DistinguishedName
存储到List<string>
中,然后使用 [=20] 查找用户SID
=] class.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; }
最后一个选项你仍然可以从你的查询中得到
DistiniguishedName
的列表并且仍然使用DirectoryEntry
using (DirectoryEntry entry = new DirectoryEntry("LDAP://userDistinguishedName") { var userSID = entry.Properties["objectSID"][0]; }
注意* 在这种情况下 userSID
将返回为 byte[] array
。