C# AD(Active Directory)域信息同步,组织单位、用户等信息查询

Windows Server 2008 R2 配置AD(Active Directory)域控制器

目录
配置环境

Windows版本:Windows Server 2008 R2 Enterprise

Service Pack 1

系统类型:       64 位操作系统

配置DNS服务器

这一步不是必须的,在安装Active Directory 域服务时可以同时装上DNS服务器。

Active Directory 域服务安装向导-->其它域控制服务器,勾上DNS服务器也有同样效果,

鉴于服务器配置容易出现一些未知小错误,还是提前安装上比较省心^_^!


  • 开始菜单-->管理工具-->服务器管理器
  • 选择左侧树形菜单“角色”节点,右键“添加角色”

  

  点击“下一步按钮” 

  

  勾选“DNS 服务器”

  

  点击“下一步”按钮

  

  点击“下一步”按钮

  

点击“安装”按钮

  

  

  点击“关闭”按钮,重启服务器!

  

  DNS服务器安装完成!


配置Active Directory 域服务

  开始菜单-->运行-->输入命令“dcpromo”à点击“确定” 按钮

  

  进入安装界面

  

  弹出 Active Directory 域服务安装向导,并点击“下一步”按钮

  

  点击“下一步”按钮

  

  选择“在新林中新建域”并点击“下一步”按钮

  

  输入域名并点击“下一步”按钮

  

  

  林功能级别选择“Windows Server 2008 R2” 并点击“下一步”按钮

  

  

  点击“下一步”按钮,如果最初没有安装DNS服务器,此处可以勾选并安装

  

  点击“下一步”按钮

  

  弹出DNS提示框,点击“是“按钮,继续安装

  

  点击“下一步”按钮

  

  输入Administrator密码和确认密码,点击“下一步”按钮

  

  点击“下一步”按钮

  

  

  点击“完成”按钮,重启服务器  

  

  到处AD域服务安装完成!

C# AD(Active Directory)域信息同步,组织单位、用户等信息查询

接上篇 Windows Server 2008 R2 配置AD(Active Directory)域控制器

对AD域结合常见需求用C#进行一些读取信息的操作^_^!

目录
示例准备
  • 打开上一篇文章配置好的AD域控制器
  • 开始菜单-->管理工具-->Active Directory 用户和计算机
  • 新建组织单位和用户

   

  • 新建层次关系如下:

  

知识了解

  我们要用C#访问Active Directory非常容易,主要用到

  轻量目录访问协议 (LDAP)

  System.DirectoryServices命名空间下的两个组件类

  DirectoryEntryDirectorySeacher

读取AD域信息示例

  示例在Framework 3.5下用Winform程序编写

   主要结合常见需求读取组织单位(OU)及用户(User)信息,以及同步组织单位和用户的层次关系;

比较着重的还是用户的信息,特别是帐号、邮箱、SID等信息;

  

  • 下面我们开始连接域,并读取出示例准备中键好的组织单位和用户  

  首先编写代码用LDAP尝试对域进行访问

  形式:LDAP://Domain

  #region## 是否连接到域
  /// <summary>
  /// 功能:是否连接到域
  /// 作者:Wilson
  /// 时间:2012-12-15
  /// http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directoryentry.path(v=vs.90).aspx
  /// </summary>
  /// <param name="domainName">域名或IP</param>
  /// <param name="userName">用户名</param>
  /// <param name="userPwd">密码</param>
  /// <param name="entry">域</param>
  /// <returns></returns>
  private bool IsConnected(string domainName, string userName, string userPwd, out DirectoryEntry domain)
  {
      domain = new DirectoryEntry();
      try
      {
          domain.Path = string.Format("LDAP://{0}", domainName);
          domain.Username = userName;
          domain.Password = userPwd;
          domain.AuthenticationType = AuthenticationTypes.Secure;

          domain.RefreshCache();

          return true;
      }
      catch(Exception ex)
      {
          LogRecord.WriteLog("[IsConnected方法]错误信息:" + ex.Message);
          return false;
      }
  }
  #endregion

  传用参数,调IsConnected方法,结果如下

  

  • 连接上AD域后,接着我们找到根OU

  #region## 域中是否存在组织单位
  /// <summary>
  /// 功能:域中是否存在组织单位
  /// 作者:Wilson
  /// 时间:2012-12-15
  /// </summary>
  /// <param name="entry"></param>
  /// <param name="ou"></param>
  /// <returns></returns>
  private bool IsExistOU(DirectoryEntry entry, out DirectoryEntry ou)
  {
       ou = new DirectoryEntry();
       try
       {
           ou = entry.Children.Find("OU=" + txtRootOU.Text.Trim());

           return (ou != null);
       }
       catch(Exception ex)
       {
           LogRecord.WriteLog("[IsExistOU方法]错误信息:" + ex.Message);
           return false;
       }
   }
   #endregion

  传入以数,调用IsExistOU方法,结果如下

  

  • 下面来开始读取组织单位及用户的信息。

   示例为了看出层次关系及导出信息是类型区分,给OU和User新建了一个实体类和一个类型的枚举 

    #region## 类型
    /// <summary>
    /// 类型
    /// </summary>
    public enum TypeEnum : int
    {
        /// <summary>
        /// 组织单位
        /// </summary>
        OU = 1,

        /// <summary>
        /// 用户
        /// </summary>
        USER = 2
    }
    #endregion

    #region## Ad域信息实体
    /// <summary>
    /// Ad域信息实体
    /// </summary>
    public class AdModel
    {
        public AdModel(string id, string name, int typeId, string parentId)
        {
            Id = id;
            Name = name;
            TypeId = typeId;
            ParentId = parentId;
        }

        public string Id { get; set; }

        public string Name { get; set; }

        public int TypeId { get; set; }

        public string ParentId { get; set; }
    }
    #endregion

   下面读取信息

        private List<AdModel> list = new List<AdModel>();

     #region## 同步
        /// <summary>
        /// 功能:同步
        /// 创建人:Wilson
        /// 创建时间:2012-12-15
        /// </summary>
        /// <param name="entryOU"></param>
        public void SyncAll(DirectoryEntry entryOU)
        {
            DirectorySearcher mySearcher = new DirectorySearcher(entryOU, "(objectclass=organizationalUnit)"); //查询组织单位                 

            DirectoryEntry root = mySearcher.SearchRoot;   //查找根OU

            SyncRootOU(root);

            StringBuilder sb = new StringBuilder();

            sb.Append("\r\nID\t帐号\t类型\t父ID\r\n");

            foreach (var item in list)
            {
                sb.AppendFormat("{0}\t{1}\t{2}\t{3}\r\n", item.Id, item.Name, item.TypeId, item.ParentId);
            }

            LogRecord.WriteLog(sb.ToString());

            MessageBox.Show("同步成功", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);

            Application.Exit();
        }
        #endregion

        #region## 同步根组织单位
        /// <summary>
        /// 功能: 同步根组织单位
        /// 创建人:Wilson
        /// 创建时间:2012-12-15
        /// </summary>
        /// <param name="entry"></param>
        private void SyncRootOU(DirectoryEntry entry)
        {
            if (entry.Properties.Contains("ou") && entry.Properties.Contains("objectGUID"))
            {
                string rootOuName = entry.Properties["ou"][0].ToString();

                byte[] bGUID = entry.Properties["objectGUID"][0] as byte[];

                string id = BitConverter.ToString(bGUID);

                list.Add(new AdModel(id, rootOuName, (int)TypeEnum.OU, "0"));

                SyncSubOU(entry, id);
            }
        }
        #endregion

        #region## 同步下属组织单位及下属用户
        /// <summary>
        /// 功能: 同步下属组织单位及下属用户
        /// 创建人:Wilson
        /// 创建时间:2012-12-15
        /// </summary>
        /// <param name="entry"></param>
        /// <param name="parentId"></param>
        private void SyncSubOU(DirectoryEntry entry, string parentId)
        {
            foreach (DirectoryEntry subEntry in entry.Children)
            {
                string entrySchemaClsName = subEntry.SchemaClassName;

                string[] arr = subEntry.Name.Split(‘=‘);
                string categoryStr = arr[0];
                string nameStr = arr[1];
                string id = string.Empty;

                if (subEntry.Properties.Contains("objectGUID"))   //SID
                {
                    byte[] bGUID = subEntry.Properties["objectGUID"][0] as byte[];

                    id = BitConverter.ToString(bGUID);
                }

                bool isExist = list.Exists(d => d.Id == id);

                switch (entrySchemaClsName)
                {
                    case "organizationalUnit":

                        if (!isExist)
                        {
                            list.Add(new AdModel(id, nameStr, (int)TypeEnum.OU, parentId));
                        }

                        SyncSubOU(subEntry, id);
                        break;
                    case "user":
                        string accountName = string.Empty;

                        if (subEntry.Properties.Contains("samaccountName"))
                        {
                            accountName = subEntry.Properties["samaccountName"][0].ToString();
                        }

                        if (!isExist)
                        {
                            list.Add(new AdModel(id, accountName, (int)TypeEnum.USER, parentId));
                        }
                        break;
                }
            }
        }
        #endregion

  调用SyncAll方法循环输出list,结果如下,很清楚的可以看出层次关系

        //ID                                                 帐号             类型    父ID
        //58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17    acompany        1       0
        //FB-44-91-AE-AC-73-2B-4D-9F-01-B1-E2-16-D3-CB-1B    department01    1       58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17
        //47-9D-5B-91-60-22-D1-46-B0-CD-C7-B2-C7-D3-00-31    department03    1       FB-44-91-AE-AC-73-2B-4D-9F-01-B1-E2-16-D3-CB-1B
        //E3-AD-47-45-38-64-02-4D-B9-83-2C-50-67-50-4F-92    zw              2       47-9D-5B-91-60-22-D1-46-B0-CD-C7-B2-C7-D3-00-31
        //8A-D4-23-18-F3-6F-E1-47-93-7A-CC-07-76-4B-E7-86    zhongw          2       FB-44-91-AE-AC-73-2B-4D-9F-01-B1-E2-16-D3-CB-1B
        //BC-D0-34-85-67-2F-05-4D-B5-77-E3-F4-AD-51-45-02    department02    1       58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17
        //1C-13-FA-66-E4-51-65-49-8B-DC-22-60-32-34-8F-22    wilson          2       BC-D0-34-85-67-2F-05-4D-B5-77-E3-F4-AD-51-45-02
        //84-E8-E5-9A-6B-56-E2-45-9A-87-54-D1-78-6B-D3-56    porschev        2       58-D6-C4-32-6A-A1-99-48-A4-8B-C8-5D-BC-C9-3E-17

DirectorySearcher.Filter属性扩充说明

DirectorySearcher mySearcher = new DirectorySearcher(entryOU, "(objectclass=organizationalUnit)"); //查询组织单位

  第二个参数是一个filter,也可以根据需求输入其它筛选条件,下面列出几个常用的

筛选条件
用户 (&(objectCategory=person)(objectClass=user))
计算机 (objectCategory=computer)
(objectCategory=group)
联系人 (objectCategory=contact)
共享文件夹 (objectCategory=volume)
打印机 (objectCategory=printQueue)

更多高级筛选请查看:http://msdn.microsoft.com/zh-cn/library/system.directoryservices.directorysearcher.filter(v=vs.80).aspx

用户属性扩充说明(含图文属性对照)

  示例中只对用户进行了读取了几个属性,用过AD域的应该都知道,用户的属性较多也比较常用。

  下面通过AD域的用户详细信来对照一下相应的属性名

  • 常项选项卡

  

对应编号 选项卡对应项名 属性名
姓(L) sn                                     
名(F) givenName                              
显示名称(S) displayName                            
描述(D) description                            
办公室(C) physicalDeliveryOfficeName             
英文缩写(I) initials                               
电话号码(T) telephoneNumber                        
电子邮件(M) mail                                   
网页(W) wWWHomePage                            
电话号码-其它(O)... otherTelephone                         
? 网页-其它(R)... url                                    

  

  • 地址选项卡

  

对应编号 选项卡对应项名 属性名
国家/地区(O) co                                      
省/自治区(V) st                                      
市/县(C) l
街道(S) streetAddress
邮政信箱(B) postOfficeBox
邮政编码(Z) postalCode

  

  • 帐户选项卡

  

对应编号 选项卡对应项名 属性名
用户登录名(U) userPrincipalName
用户登录名(Windows 2000 以前版本)(W) sAMAccountName

  

  • 电话选项卡

  

对应编号 选项卡对应项名 属性名
 家庭电话(M) homePhone                               
寻呼机(P) pager
移动电话(B) mobile
传真(F) facsimileTelephoneNumber
IP电话(I) ipPhone
注释 info
家庭电话-其它(O)  otherHomePhone                          
寻呼机-其它(T) otherPager                              
移动电话-其它(B) otherMobile                             
传真-其它(E) otherFacsimileTelephoneNumber           
? IP电话-其它(R) otherIpPhone                            
  • 组织选项卡

  

对应编号 选项卡对应项名 属性名
公司(C)                               company                                  
部门(D)    department            
职务(J)                         title
经理-姓名(N)        manager                   
直接下属(E) directReports

  

  还有一些属性没有列出来,可以循环输出DirectoryEntry.Properties.PropertyNames来找

  比如用objectsid这也是个用户比较重要的属性,在设置Windows共享时会用到!

示例下载

示例下载:http://files.cnblogs.com/zhongweiv/SynchronousAD.zip

示例代码,写得比较简陋,有需要就下载了将就着看一下吧^_^!

时间: 2024-10-12 12:36:28

C# AD(Active Directory)域信息同步,组织单位、用户等信息查询的相关文章

Windows Server 笔记(六):Active Directory域服务:组织单位

组织单位(Organization Unit,OU)是Active Directory中的一个容器,把域中的对象组成一个逻辑组,可以包含:用户.组.计算机和其他OU等,如下图所示,但不限于下图所示:OU只能包含自己域中的对象,并且OU的嵌套(OU下面包含OU)建议不要超过十层: OU通常是基于管理需求,将具有"相同属性(同一部门.同一小组等等)"的对象集中在一起管理.默认的容器中,除了Domain Controllers之外其他的容器都不属于OU: 一.创建组织单位: 1.打开Acti

cmd 执行Dcpromo错误:在该 SKU 上不支持 Active Directory 域服务安装向导,Windows Server 2008 R2 Enterprise 配置AD(Active Directory)域控制器

今天,要安装AD域控制器,运行dcpromo结果提示:在该 SKU 上不支持 Active Directory 域服务安装向导. 以前弄的时候直接就通过了,这次咋回事?终于搞了大半天搞定了. 主要原因:我的Windows 2008 R2的版本是WEB版.不支持AD角色,只有DNS和IIS两个角色,醉了......,安装的时候说明是:web版也支持全部的角色. 只能重新安装一个Enterprise版的了: 主要说下选版本这一步: Enterprise=旗舰版,功能较全 Standard=标准版 D

Active Directory 域服务 安装

本文不详细介绍  AD DS  服务器角色,只介绍AD DS安装: 有关 AD DS概述请参阅:Active Directory 域服务概述 有关 Windows Server 2012 中 AD DS 新增功能 请参阅:Active Directory 域服务 (AD DS) 中的新增功能 在服务器管理器中,单击"管理",再单击"添加角色和功能"以启动添加角色向导: 在"开始之前"页上,单击"下一步". 在"选择安

您真的会修改Active Directory域控制器计算机名称吗

从我开始做微软这行开始,就经常听说某某公司由于什么原因需要修改Active Directory域控制器计算机名称,但发现好多公司都是直接修改,导致了各种奇葩的问题,今天就给大家推荐一个修改Active Directory域控制器计算机名称的方式. 往往有很多朋友会直接在计算机属性里修改计算机的FQDN名称,如图所示:会报出如下警告信息: 通过以上方式修改,有时候会莫名其妙的出现各种奇葩问题,所以强烈不建议这么玩. 建议修改方式如下: 1.我们可以看到我这环境中这台AD的名称是ADSrv01,如图

Windows Server 笔记(六):Active Directory域服务:额外域控制器

额外域控制器: 额外域控制器是指除了第一台安装的域控制器(主域控制器)意外的所有域控制器: 那么额外域控制器有什么好处呢? 1.可以提供容错.即一台DC出问题后,另一台仍可以可以继续工作,提供服务: 2.提高用户登录效率.多台域控可以分担用户审核,加快用户登录速度: 3.备份.域控制器之间会相互复制,就等于多了一份备份: 1.首先设置好IP配置:这里首选DNS指向自己,备用DNS指向主域:将服务器加入域: 2.选择"添加角色和功能": 3.选择"下一步": 4.选择

Active Directory 域服务安装与测试

实验原理: 安装域服务并创建用户,把另一个电脑加入域中,然后用域账户登录以及用本地账户登录测试 实验条件:windows server 2008(域控制器),  win7(加入域的pc) 实验步骤: 一.安装域服务以及配置信息 1.打开"服务管理器",进入"角色",选择"Active Directory 域服务" 2.点击"下一步",然后进行安装 3.安装完毕后,点击"Active Directory 域服务安装向导

Windows Server 2012中安装Active Directory域服务

1.登陆Windows Server 2012,打开服务器管理器,选择"添加角色和功能" 2.在"开始之前"页面,直接点击"下一步" 3.选择"基于角色或基于功能的安装",点击"下一步" 4.选择"从服务器池中选择服务器",选中当前服务器,点击"下一步" 5.在角色列表中,选择"Active Directory 域服务",点击"下一步&q

Ldap登陆AD(Active Directory)进行认证的Java示例

原文地址:http://hi.baidu.com/js2007/item/24efbb0fae1c9b90a3df432a package LdapTest; import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.AuthenticationExc

修改Active Directory域控制器IP地址

在企业中,部署微软Active Directory域控制器时,常常因为以下几个原因需要重新配置DC服务器的IP地址: a) 管理员配置了错误的DC服务器的IP地址: b) 因网络变更,重新规划企业IP地址. 这两种现象常常在企业中出现,也经常会出现域中资源与DC服务器无法正常通信,而造成一些未知的错误.今天给大家演示当修改企业Active Directory域控制器IP地址时,需要注意的相关事项以及验证修改IP地址后是否可以正常工作. 1)登陆DC服务器,查看当前DC服务器的IP地址.点击服务器