从 Active Directory 中的组中获取所有用户和联系人
Get all users and contacts from a group in Active Directory
我一直在寻找一种从 Active Directory 中的组获取用户和联系人的解决方案,但找不到。
我了解我无法像用户一样获取联系人,因为他们不是安全负责人?
我使用此代码获取我组中的所有用户,是否可以扩展此代码以从联系人中检索姓名和手机号码?还是我需要写点新东西?
var context = new PrincipalContext(ContextType.Domain, "MY_DOMAIN");
using (var searcher = new PrincipalSearcher())
{
var groupName = "MY_GROUP";
var sp = new GroupPrincipal(context, groupName);
searcher.QueryFilter = sp;
var group = searcher.FindOne() as GroupPrincipal;
if (group == null)
Console.WriteLine("Invalid Group Name: {0}", groupName);
foreach (var f in group.GetMembers())
{
var principal = f as UserPrincipal;
if (principal == null || string.IsNullOrEmpty(principal.Name))
continue;
DirectoryEntry entry = (principal.GetUnderlyingObject() as DirectoryEntry);
DirectorySearcher entrySearch = new DirectorySearcher(entry);
entrySearch.PropertiesToLoad.Add("mobile");
entrySearch.PropertiesToLoad.Add("sAMAccountName");
entrySearch.PropertiesToLoad.Add("name");
SearchResultCollection results = entrySearch.FindAll();
ResultPropertyCollection rpc = results[0].Properties;
foreach (string rp in rpc.PropertyNames)
{
if (rp == "mobile")
Console.WriteLine(rpc["mobile"][0].ToString());
if(rp == "sAMAccountName")
Console.WriteLine(rpc["sAMAccountName"][0].ToString());
}
您不能使用 System.DirectoryServices.AccountManagement
命名空间从 Active Directory 查询联系人信息,因为正如您指出的那样,它们不是安全原则。您需要直接从组的 DirectoryEntry
读取并解析组的 member
属性。这将是作为该组成员的所有对象的专有名称列表。无法从中知道它们是什么类型的对象,因此您需要为每个对象查询 AD 才能找出答案。
您发布的内容中已经包含完成此操作所需的所有代码,只需将 member
属性 添加到加载列表,然后循环加载新的 DirectoryEntry
对象. objectClass
属性 会告诉您它是用户、组还是联系人。
我一直在寻找一种从 Active Directory 中的组获取用户和联系人的解决方案,但找不到。
我了解我无法像用户一样获取联系人,因为他们不是安全负责人?
我使用此代码获取我组中的所有用户,是否可以扩展此代码以从联系人中检索姓名和手机号码?还是我需要写点新东西?
var context = new PrincipalContext(ContextType.Domain, "MY_DOMAIN");
using (var searcher = new PrincipalSearcher())
{
var groupName = "MY_GROUP";
var sp = new GroupPrincipal(context, groupName);
searcher.QueryFilter = sp;
var group = searcher.FindOne() as GroupPrincipal;
if (group == null)
Console.WriteLine("Invalid Group Name: {0}", groupName);
foreach (var f in group.GetMembers())
{
var principal = f as UserPrincipal;
if (principal == null || string.IsNullOrEmpty(principal.Name))
continue;
DirectoryEntry entry = (principal.GetUnderlyingObject() as DirectoryEntry);
DirectorySearcher entrySearch = new DirectorySearcher(entry);
entrySearch.PropertiesToLoad.Add("mobile");
entrySearch.PropertiesToLoad.Add("sAMAccountName");
entrySearch.PropertiesToLoad.Add("name");
SearchResultCollection results = entrySearch.FindAll();
ResultPropertyCollection rpc = results[0].Properties;
foreach (string rp in rpc.PropertyNames)
{
if (rp == "mobile")
Console.WriteLine(rpc["mobile"][0].ToString());
if(rp == "sAMAccountName")
Console.WriteLine(rpc["sAMAccountName"][0].ToString());
}
您不能使用 System.DirectoryServices.AccountManagement
命名空间从 Active Directory 查询联系人信息,因为正如您指出的那样,它们不是安全原则。您需要直接从组的 DirectoryEntry
读取并解析组的 member
属性。这将是作为该组成员的所有对象的专有名称列表。无法从中知道它们是什么类型的对象,因此您需要为每个对象查询 AD 才能找出答案。
您发布的内容中已经包含完成此操作所需的所有代码,只需将 member
属性 添加到加载列表,然后循环加载新的 DirectoryEntry
对象. objectClass
属性 会告诉您它是用户、组还是联系人。