我有以下代码的两个目标
1)获取下面的用户列表到特定的AD组
2)获取属于该组的所有用户的电子邮件/姓氏/名字
如果有更好的方法可以实现这两点,请告诉我。
我可以获得完整的DN,但我不确定如何从完整的DN获取剩余数据,或者如果有更好的方法来提取此信息,请告诉我。下面是我正在使用的代码,但它会出错:
The value provided for adsObject does not implement IADs.
当我尝试使用完整DN进行DirectorySearcher时。
HashSet<string> User_Collection = new HashSet<string>();
SearchResultCollection sResults = null;
DirectoryEntry dEntryhighlevel = new DirectoryEntry("LDAP://CN=Global_Users,OU=Astrix,OU=Clients,OU=Channel,DC=astro,DC=net");
foreach (object dn in dEntryhighlevel.Properties["member"])
{
DirectoryEntry dEntry = new DirectoryEntry(dn);
Console.WriteLine(dn);
DirectorySearcher dSearcher = new DirectorySearcher(dEntry);
//filter just user objects
dSearcher.SearchScope = SearchScope.Base;
//dSearcher.Filter = "(&(objectClass=user)(dn="+dn+")";
dSearcher.PageSize = 1000;
sResults = dSearcher.FindAll();
foreach (SearchResult sResult in sResults)
{
string Last_Name = sResult.Properties["sn"][0].ToString();
string First_Name = sResult.Properties["givenname"][0].ToString();
string Email_Address = sResult.Properties["mail"][0].ToString();
User_Collection.Add(Last_Name + "|" + First_Name + "|" + Email_Address);
}
速度很重要,是的,我知道我没有使用HashSet,因为它的设计。
答案 0 :(得分:1)
我总是使用System.DirectoryServices.AccountManagement
。
您将看到的第一件事是:“可用时使用快速并行绑定(FSB)功能可以提高连接速度。连接缓存会减少使用的端口数量。” 有了这个说我没有测试你的代码反对这个速度你必须自己做,但这是微软的新库。
这是我的代码示例:
// Create the context for the principal object.
PrincipalContext ctx = new PrincipalContext(ContextType.Domain,
"fabrikam",
"DC=fabrikam,DC=com");
// Create an in-memory user object to use as the query example.
GroupPrincipal u = new GroupPrincipal(ctx) {DisplayName = "Your Group Name Here"};
// Set properties on the user principal object.
// Create a PrincipalSearcher object to perform the search.
PrincipalSearcher ps = new PrincipalSearcher {QueryFilter = u};
// Tell the PrincipalSearcher what to search for.
// Run the query. The query locates users
// that match the supplied user principal object.
PrincipalSearchResult<Principal> results = ps.FindAll();
foreach (UserPrincipal principal in ((GroupPrincipal)results.FirstOrDefault()).Members)
{
string email = principal.EmailAddress;
string name = principal.Name;
string surname = principal.Surname;
}
答案 1 :(得分:0)
看起来你正在走AD的某个群体的群组成员资格......(猜测上面的成员参考)
无论如何,您需要确定您正在寻找的API类型。你现在使用的那个是一个较低的水平(虽然如果你想要你可以降低:))。如上一个答案所述,上升水平是一个选择。
稍微改掉一下代码(并在你提到它时对你的帮助有所帮助):
请记住跨域问题。确保使用2域林测试代码,其中domain1中的本地域类组具有域2中的成员。这将产生一些额外的工作以获得更多属性,因为您需要连接到另一个中的DC域(如果您关心的少数属性都在GC部分属性集中,则为GC)。
还要记住安全性。如果您无法访问域中某些用户的这些属性,那么代码会做什么?上面的代码会以令人讨厌的方式失败。 :)你可能想要更优雅地处理这个......
希望这会有所帮助。 〜埃里克