Active Directory DirectorySearcher未返回所有可用属性

Las*_*PEW 7 c# active-directory

我正在为我的老板写一个新的程序,它将取代他们目前正在使用的旧VBS.

所以该程序假设进入AD并收集所有员工的姓名及其电子邮件地址.我的问题是每个用户都有大约60个属性分配给他们,但我的程序只有32个字段,其中一个是CN,这是我需要的一半.当然邮件不是导入的属性之一.我也注意到调试时我认为只是从长岛分支机构带来的emlpoyees,而不是来自我不明白为什么的所有地方.任何帮助将不胜感激!!= d

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 2

您可以使用 aPrincipalSearcher和“按示例查询”主体来进行搜索:

// 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您还没有阅读过 MSDN 文章《在 .NET Framework 3.5 中管理目录安全主体》,该文章很好地展示了如何充分利用 .NET Framework 中的新功能System.DirectoryServices.AccountManagement。或者参阅有关 System.DirectoryServices.AccountManagement 的 MSDN 文档命名空间的 MSDN 文档。

当然,根据您的需要,您可能希望在您创建的“按示例查询”用户主体上指定其他属性:

  • DisplayName(通常:名字 + 空格 + 姓氏)
  • SAM Account Name- 您的 Windows/AD 帐户名
  • User Principal Name- 您的“username@yourcompany.com”风格名称

您可以指定 上的任何属性,UserPrincipal并将它们用作PrincipalSearcher.