zoukankan      html  css  js  c++  java
  • C#操作Active Directory(AD)详解

    C#操作Active Directory(AD)详解

     

    .Net提供了专用类操作AD,本文详细介绍使用C#操作AD的方法。

    一、系统环境

    系统环境:Windows Server 2008 R2, VS2010, .Net Framework 4.0

    AD Server:LDAP的server IP

    基本DN:OU=user,DC=Company,DC=com

    用来登录的管理员:Peter

    密码:ab#CD%1234

    二、程序

    1.  引用

    .Net操作AD的类在命名空间System.DirectoryServices下,需要将该类引用进来。

    2.  连接

    要操作AD需首先连接AD,就象要操作数据先要连接数据库一样。

    复制代码
    /// <summary>
            /// 获得DirectoryEntry对象实例,以管理员登陆AD
            /// </summary>
            /// <returns></returns>
            private static DirectoryEntry GetDirectoryObject()
            {
                DirectoryEntry entry = null;
                try
                {
                    entry = new DirectoryEntry("LDAP://10.10.10.16", "Peter", " ab#CD%1234", AuthenticationTypes.Secure);
                }
                catch (Exception ex)
                {
                }
                return entry;
            }
    复制代码

    3.  查询

    根据各种条件获取具体的用户。下例为根据公共名称获取对象。

    复制代码
    /// <summary>
            /// 根据用户公共名称取得用户的 对象
            /// </summary>
            /// <param name="commonName">用户公共名称</param>
            /// <returns>如果找到该用户则返回用户的对象,否则返回 null</returns>
            public static DirectoryEntry GetDirectoryEntry(string commonName)
            {
                DirectoryEntry de = GetDirectoryObject();
                DirectorySearcher deSearch = new DirectorySearcher(de);
                deSearch.Filter = "(&(&(objectCategory=person)(objectClass=user))(cn=" + commonName.Replace("\", "") + "))";
                deSearch.SearchScope = SearchScope.Subtree;
                try
                {
                    SearchResult result = deSearch.FindOne();
                    de = new DirectoryEntry(result.Path);
                    return de;
                }
                catch (Exception ex)
                {
                    return null;
                }
            }
    复制代码

    4.  修改用户

    修改查询到的Entity的值,修改后将修改记录保存到AD。注意有两种保存属性的方式。具体使用哪种请参考帮助。

    1)       直接修改属性

    2)       通过invoke来触发AD的内置函数

    复制代码
    /// <summary>
            /// 修改查询到的用户
            /// </summary>
            /// <param name="CommonName">通用名(displayName,系统中显示的中文字)</param>
            /// <param name="Account">帐户名(如Peter)</param>
            /// <param name="organizeName">组织单元名(资讯中心)</param>
            /// <param name="password">密码</param>
            public static string ChangeADAccount(string CommonName, string Account, string password)
            {
                //获取对应AD实体
                DirectoryEntry user = GetDirectoryEntry( commonName);
                try
                {
                    ADHelper.SetProperty(user, " sAMAccountName ", Account);
                    user.Invoke("SetPassword", new object[] { password });
                    user.CommitChanges();
                }
                catch (Exception e)
                {
                    throw e;
                }
                return user.Path;
            }
     
    /// <summary>
            /// 设置指定的属性值
            /// </summary>
            /// <param name="de"></param>
            /// <param name="propertyName">属性名称?</param>
            /// <param name="propertyValue">属性值</param>
            public static void SetProperty(DirectoryEntry de, string propertyName, string propertyValue)
            {
                if (de.Properties.Contains(propertyName))
                {
                    if (String.IsNullOrEmpty(propertyValue))
                    {
                        de.Properties[propertyName].RemoveAt(0);
                    }
                    else
                    {
                        de.Properties[propertyName][0] = propertyValue;
                    }
                }
                else
                {
                    if (!String.IsNullOrEmpty(propertyValue))
                    {
                        de.Properties[propertyName].Add(propertyValue);
                    }
                }
            }
    复制代码

    5.  修改OU

    1)  获取OU       

    复制代码
     DirectoryEntry OUEntry = new DirectoryEntry(GetOrganizeNamePath(OUName), "Peter", " ab#CD%1234", AuthenticationTypes.Secure);
            /// <summary>
            /// 获得OU的Path
            /// </summary>
            /// <param name="organizeUnit">OU名</param>
            /// <returns></returns>
            public static string GetOrganizeNamePath(string organizeUnit)
            {
                StringBuilder sb = new StringBuilder();
                sb.Append(ADPath);
                sb.Append("/");
                return sb.Append(SplitOrganizeNameToDN(organizeUnit)).ToString();
            }
    复制代码

    2)  修改OU项       

    OUEntry.Rename("OU=" + newOUName);
    
            OUEntry.CommitChanges();

    3)  删除OU       

    DirectoryEntry OUParent = OUEntry.Parent;
    
            OUParent.Children.Remove(OUEntry);
    
            OUParent.CommitChanges();

    6.  修改组

    1)  获取组       

    复制代码
     /// <summary>
            /// 获取AD组
            /// </summary>
            /// <param name="groupName"></param>
            /// <param name="organizeUnit"></param>
            /// <returns></returns>
            public static DirectoryEntry GetADGroupInOU(string groupName, string organizeUnit)
            {
                if (!String.IsNullOrEmpty(groupName))
                {
                    DirectoryEntry de = new DirectoryEntry(GetOrganizeNamePath(organizeUnit) , "Peter", " ab#CD%1234", AuthenticationTypes.Secure); ;
                    DirectorySearcher deSearch = new DirectorySearcher(de);
                    deSearch.Filter = "(&(objectClass=group)(cn=" + groupName.Replace("\", "") + "))";
                    deSearch.SearchScope = SearchScope.Subtree;
                    try
                    {
                        SearchResult result = deSearch.FindOne();
                        if (result != null)
                        {
                            de = new DirectoryEntry(result.Path, adminName, adminPassword);
                        }
                        else
                        {
                            return null;
                        }
                        return de;
                    }
                    catch (Exception ex)
                    {
                        return null;
                    }
                }
                else
                {
                    return null;
                }
            }
    复制代码

    2)  管理组成员

    group.Properties["member"].Add(user.Properties["distinguishedName"].Value);
    
    group.Properties["member"].Remove(user.Properties["distinguishedName"].Value);

    三、查看AD User属性结果

    在程序中修改了User属性后我们要检验一下是否被修改了,有三种方式查看AD中User属性:

    1.  Active Directory Users and Computers

    打开Active Directory Users and Computers,选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。在该属性页只能看到一些常用的属性。 

    2.  Exchange Management Console

    打开Exchange Management Console,选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。单击Customer Attributes按钮可以查看自定义的属性。 

    3.  adsiedit.msc

    以上两种方式所看到的属性都不全,要看到所有属性需使用adsiedit.msc工具。

    在运行窗口中输入adsiedit.msc后打开本工具。选择一个用户,右键单击该用户选择属性显示如下图所示的属性页。 

     
  • 相关阅读:
    java并发容器
    实现个简单的线程池
    【hdu 3501 (数论、欧拉函数)】
    【关于Java学习的几点看法】
    【乘法游戏】
    【hdu 1280 前m大的数】
    【最大因子数】
    【ECJTU_ACM 11级队员2012年暑假训练赛(7) C Fire Net】
    【ACM ICPC Fighting!!!!!!!!!!!!!】
    【firefly 默默最喜欢的歌】
  • 原文地址:https://www.cnblogs.com/ningang/p/4321748.html
Copyright © 2011-2022 走看看