7

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

所以程序假设进入广告并收集所有员工的姓名和他们的电子邮件地址。我的问题是每个用户都分配了大约 60 个属性,但我的程序只提取了 32 个字段,其中一个是 CN,它是我需要的一半。当然,邮件不是要导入的属性之一。我在调试时也注意到,我认为只是从长岛分支机构引入员工,而不是从我不明白为什么的任何地方引入员工。任何帮助将不胜感激!!=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();
        }
    }
}
4

1 回答 1

2

You can use a PrincipalSearcher and a "query-by-example" principal to do your searching:

// 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;
    }
}

If you haven't already - absolutely read the MSDN article Managing Directory Security Principals in the .NET Framework 3.5 which shows nicely how to make the best use of the new features in System.DirectoryServices.AccountManagement. Or see the MSDN documentation on the System.DirectoryServices.AccountManagement namespace.

Of course, depending on your need, you might want to specify other properties on that "query-by-example" user principal you create:

  • DisplayName (typically: first name + space + last name)
  • SAM Account Name - your Windows/AD account name
  • User Principal Name - your "username@yourcompany.com" style name

You can specify any of the properties on the UserPrincipal and use those as "query-by-example" for your PrincipalSearcher.

于 2012-12-03T16:41:10.300 回答