C# Active Directory DirectorySearcher未返回所有可用属性
我正在为我的老板编写一个新的程序,它将取代他们目前使用的旧VBS 因此,这个程序应该进入广告,收集所有员工的姓名和他们的电子邮件地址。我的问题是,每个用户都有大约60个属性分配给他们,但我的程序只拉入32个字段,其中一个是CN,这是我需要的一半。当然,邮件不是要导入的属性之一。我还注意到,在调试过程中,我认为这只是从长岛分公司引进的员工,而不是从任何地方引进的员工,我不明白为什么。任何帮助都将不胜感激=DC# Active Directory DirectorySearcher未返回所有可用属性,c#,active-directory,C#,Active Directory,我正在为我的老板编写一个新的程序,它将取代他们目前使用的旧VBS 因此,这个程序应该进入广告,收集所有员工的姓名和他们的电子邮件地址。我的问题是,每个用户都有大约60个属性分配给他们,但我的程序只拉入32个字段,其中一个是CN,这是我需要的一半。当然,邮件不是要导入的属性之一。我还注意到,在调试过程中,我认为这只是从长岛分公司引进的员工,而不是从任何地方引进的员工,我不明白为什么。任何帮助都将不胜感激=D using System; using System.IO; using System.C
using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using System.DirectoryServices;
using Microsoft.Office.Interop.Excel;
using System.DirectoryServices.ActiveDirectory;
namespace EmailListing
{
class Program
{
static void Main(string[] args)
{
DirectoryEntry adFolderObject = new DirectoryEntry("LDAP://OU=PHF Users,DC=phf,DC=inc");
DirectorySearcher adSearchObject = new DirectorySearcher(adFolderObject);
adSearchObject.SearchScope = SearchScope.Subtree;
adSearchObject.Filter = "(&(ObjectClass=user)(!description=Built-in*))";
foreach (SearchResult adObject in adSearchObject.FindAll())
{
//mail = adObject.Properties["mail"].ToString();
Console.Write(adObject.Properties["cn"][0]);
Console.Write(". ");
//Console.WriteLine(mail);
}
Console.WriteLine();
Console.ReadLine();
}
}
}
您可以使用
PrincipalSearcher
和“示例查询”主体进行搜索:
// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// define a "query-by-example" principal - here, we search for a UserPrincipal
UserPrincipal qbeUser = new UserPrincipal(ctx);
// create your principal searcher passing in the QBE principal
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);
// find all matches
foreach(var found in srch.FindAll())
{
// do whatever here - "found" is of type "Principal" - it could be user, group, computer.....
UserPrincipal foundUser = found as UserPrincipal;
if (foundUser != null && !foundUser.Description.StartsWith("Built-In"))
{
string firstName = foundUser.GivenName;
string lastName = foundUser.Surname;
string email = foundUser.EmailAddress;
}
}
如果您还没有-请阅读MSDN文章,这篇文章很好地展示了如何最好地利用System.DirectoryServices.AccountManagement
中的新功能。或者查看名称空间
当然,根据您的需要,您可能希望在您创建的“示例查询”用户主体上指定其他属性:
(通常为:名字+空格+姓氏)DisplayName
-您的Windows/AD帐户名SAM帐户名
-您的”username@yourcompany.com“样式名用户主体名称
您可以在
UserPrincipal
上指定任何属性,并将其用作PrincipalSearcher
的“示例查询”首先,我想说我爱您!我到处都在搜索,在论坛上,youtube上,什么都没有。这成功了!获取电子邮件地址和姓名。非常感谢。最后一个问题是,我如何过滤它,使其只包含用户。当我添加if语句时,我得到了错误,if语句是否是过滤器?@user1873179:通过指定UserPrincipal
类作为您的“搜索参数”(qbeUser
),您告诉S.DS.AM只搜索用户。是否有方法获取具有电子邮件地址的帐户。我看到的是姓名,没有电子邮件地址。我只想让有电子邮件地址的用户显示。想好了,你只需要在if statame中放入你想过滤的内容,即foundUser.EmailAddress!=null@user1873179:完全正确-这就是为什么它被称为示例查询-您只需提供一个示例(或模板)来说明您正在寻找的内容。。。