设为首页 收藏本站
查看: 850|回复: 0

[经验分享] Exchange开发(五) ADHelper类

[复制链接]

尚未签到

发表于 2015-9-10 12:31:51 | 显示全部楼层 |阅读模式
  由于Exchange与AD实现了无缝的集成,所以某些对Exchange的开发实际上也是对AD的开发,以下是我在开发过程中的ADHelper类,主要完成AD操作的某些基本功能

在博客堂的Think Different and Think More的blog的文章 http://blog.joycode.com/liuhuimiao/articles/20946.aspx  中有一个ADHelper类,另外在Rainbow中也有一个ADHelper类
  

using System.DirectoryServices;
using System.Net;
using System.Text;
using CDOEXM;

namespace ExchangeMailTest
{
    /// <summary>
    /// 实现AD操作的一些常用功能
    /// </summary>
    public class ADHelper
    {
        private const string LDAP_IDENTITY = "LDAP://";

        #region CreateADAccount

        public static DirectoryEntry CreateADAccount(string userName,string password,string organizeName)
        {
            return CreateADAccount(userName,password,organizeName,string.Empty);
        }

        public static DirectoryEntry CreateADAccount(string userName,string password,string organizeName,string adGroup)
        {
            return CreateADAccount(null,null,userName,password,organizeName,adGroup);
        }

        public static DirectoryEntry CreateADAccount(string adminName,string adminPassword,string userName,
            string password,string organizeName,string adGroup)
        {
            DirectoryEntry entry = null;
            if (adminName == null || adminPassword == null)
            {
                entry = new DirectoryEntry(GetOrganizeNamePath(organizeName));
            }
            else
            {
                entry = new DirectoryEntry(GetOrganizeNamePath(organizeName),adminName,
                adminPassword,AuthenticationTypes.Secure);
            }
            //增加用户到AD域中
            DirectoryEntry user = entry.Children.Add("CN=" + userName,"user");
            user.Properties["sAMAccountName"].Add(userName);
            user.CommitChanges();
            //设置密码
            user.Invoke("SetPassword",new object[]{password});
            user.Properties["userAccountControl"].Value = 0x200;

            user.CommitChanges();

            return user;
        }

        #endregion

        public static string GetDomainPath()
        {
            using (DirectoryEntry root = new DirectoryEntry())
            {
                return root.Path;
            }
        }

        public static DirectoryEntry FindObject(string category,string name)
        {
            return FindObject(null,null,category,name);
        }

        public static DirectoryEntry FindObject(string adminName,string adminPassword,string category,string name)
        {
            DirectoryEntry de = null;
            if (adminName == null || adminPassword == null)
            {
                de = new DirectoryEntry(GetDomainPath(),adminName,adminPassword,AuthenticationTypes.Secure);
            }
            else
            {
                de = new DirectoryEntry();
            }

            DirectorySearcher ds = new DirectorySearcher(de);
            string queryFilter = string.Format("(&(objectCategory=" + category +")(sAMAccountName={0}))", name);
            ds.Filter = queryFilter;
            ds.Sort.PropertyName = "cn";

            DirectoryEntry userEntry = null;
            try
            {
                SearchResult sr = ds.FindOne();
                userEntry = sr.GetDirectoryEntry();
            }
            finally
            {
                if (de != null)
                {
                    de.Dispose();
                }
                if (ds != null)
                {
                    ds.Dispose();
                }
            }
            return userEntry;
        }


        #region 改变AD用户信息,删除AD帐户

        public static void RenameUser(string adminUser,string adminPassword,string oldUserName,string newUserName)
        {
            DirectoryEntry userEntry = FindObject(adminUser,adminPassword,"user",oldUserName);
            userEntry.Rename(newUserName);
            userEntry.CommitChanges();
        }


        public static void SetUserPassword(string userName,string password)
        {
            SetUserPassword(null,null,userName,password);
        }

        public static void SetUserPassword(string adminName,string adminPassword,string userName,string password)
        {
            DirectoryEntry userEntry = FindObject(adminName,adminPassword,"user",userName);
            userEntry.Invoke("SetPassword",new object[]{password});
            userEntry.CommitChanges();
        }


        /// <summary>
        /// 删除AD账户,使用当前上下文的安全信息,一般用于Windows程序
        /// </summary>
        /// <param name="userName">用户名称</param>
        public static void DeleteADAccount(string userName)
        {
            DeleteADAccount(null,null,userName);
        }

        /// <summary>
        /// 删除AD账户,使用指定的用户名和密码来模拟,一般用于ASP.NET程序
        /// </summary>
        /// <param name="adminUser"></param>
        /// <param name="adminPassword"></param>
        /// <param name="userName">用户名称</param>
        public static void DeleteADAccount(string adminUser,string adminPassword,string userName)
        {
            DirectoryEntry user = FindObject(adminUser,adminPassword,"user",userName);
            user.Children.Remove(user);
            user.CommitChanges();
        }



        #endregion

        #region 与OU及组有关的操作

        /// <summary>
        /// 创建OU,需要指定连接到AD的授权信息,一般用于ASPNET程序
        /// </summary>
        /// <param name="adminName"></param>
        /// <param name="adminPassword"></param>
        /// <param name="name"></param>
        /// <param name="parentOrganizeUnit"></param>
        public static DirectoryEntry CreateOrganizeUnit(string adminName,string adminPassword,string name,string parentOrganizeUnit)
        {
            DirectoryEntry parentEntry = null;
            if (adminName == null || adminPassword == null)
            {
                parentEntry = new DirectoryEntry(GetOrganizeNamePath(parentOrganizeUnit));
            }
            else
            {
                parentEntry = new DirectoryEntry(GetOrganizeNamePath(parentOrganizeUnit),adminName,adminPassword,
                    AuthenticationTypes.Secure);
            }
            DirectoryEntry organizeEntry = parentEntry.Children.Add("OU=" + name,"organizationalUnit");
            organizeEntry.CommitChanges();
            //parentEntry.CommitChanges();

            return organizeEntry;
        }

        /// <summary>
        /// 创建OU,不需要指定连接到AD的授权信息,用于Windows程序
        /// </summary>
        /// <param name="name"></param>
        /// <param name="parentOrganizeUnit"></param>
        public static DirectoryEntry CreateOrganizeUnit(string name,string parentOrganizeUnit)
        {
            return CreateOrganizeUnit(null,null,name,parentOrganizeUnit);
        }

        /// <summary>
        /// 将用户加入到用户组中
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="organizeName">组织名</param>
        /// <param name="groupName">组名</param>
        /// <exception cref="InvalidObjectException">用户名或用户组不存在</exception>
        public static void AddUserToGroup(string userName,string groupName)
        {
            AddUserToGroup(null,null,userName,groupName);
        }



        /// <summary>
        /// 将用户加入到用户组中
        /// </summary>
        /// <param name="adminName"></param>
        /// <param name="adminPassword"></param>
        /// <param name="userName">用户名</param>
        /// <param name="groupName">组名</param>
        /// <exception cref="InvalidObjectException">用户名或用户组不存在</exception>
        public static void AddUserToGroup(string adminName,string adminPassword,string userName,string groupName)
        {

            DirectoryEntry rootUser = null;
            if (adminName == null || adminPassword == null)
            {
                rootUser = new DirectoryEntry(GetUserPath(),adminName,adminPassword,AuthenticationTypes.Secure);
            }
            else
            {
                rootUser = new DirectoryEntry(GetUserPath());
            }

            DirectoryEntry group = null;
            DirectoryEntry user = null;
            
            try
            {
                group = rootUser.Children.Find("CN=" + groupName);
            }
            catch (Exception)
            {
                throw new InvalidObjectException("在域中不存在组&#8220;" + groupName + "&#8221;");
            }

            try
            {
                user = FindObject(adminName,adminPassword,"user",userName);
            }
            catch (Exception)
            {
                throw new InvalidObjectException("在域中不存在用户&#8220;" + userName + "&#8221;");
            }

            //加入用户到用户组中
            group.Properties["member"].Add(user.Properties["distinguishedName"].Value);
            group.CommitChanges();
        }

        #endregion

        #region Method 与AD的DN解析有关

        /// <summary>
        /// 获取所有用户所在的安全组
        /// </summary>
        /// <returns></returns>
        private static string GetUserPath()
        {
            return GetUserPath(null);
        }

        /// <summary>
        /// 获取所有没有在AD组织中的用户DN名称
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        private static string GetUserPath(string userName)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(LDAP_IDENTITY);
            if (userName != null && userName.Length > 0)
            {
                sb.Append("CN=").Append(userName).Append(",");
            }
            sb.Append("CN=Users,").Append(GetDomainDN());
            return sb.ToString();
        }

        /// <summary>
        /// 根据用户所在的组织结构来构造用户在AD中的DN路径
        /// </summary>
        /// <param name="userName">用户名称</param>
        /// <param name="organzieName">组织结构</param>
        /// <returns></returns>
        public static string GetUserPath(string userName,string organzieName)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(LDAP_IDENTITY);
            sb.Append("CN=").Append(userName).Append(",").Append(SplitOrganizeNameToDN(organzieName));
            return sb.ToString();
        }


        /// <summary>
        /// 获取域的后缀DN名,如域为ExchangeTest.com,则返回"DC=ExchangeTest,DC=Com"
        /// </summary>
        /// <returns></returns>
        public static string GetDomainDN()
        {
//            return "DC=ExchangeTest,DC=Com";

            //
            DirectoryEntry domain = new DirectoryEntry();
            return domain.Name;
        }

        public static string GetOrganizeNamePath(string organizeUnit)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(LDAP_IDENTITY);
            return sb.Append(SplitOrganizeNameToDN(organizeUnit)).ToString();
        }



        /// <summary>
        /// 分离组织名称为标准AD的DN名称,各个组织级别以"/"或"\"分开。如"总部/物业公司/小区",并且当前域为
        /// ExchangeTest.Com,则返回的AD的DN表示名为"OU=小区,OU=物业公司,OU=总
        /// 部,DC=ExchangeTest,DC=Com"。
        /// </summary>
        /// <param name="organizeName">组织名称</param>
        /// <returns>返回一个级别</returns>
        public static string SplitOrganizeNameToDN(string organizeName)
        {
            StringBuilder sb = new StringBuilder();

            if (organizeName != null && organizeName.Length > 0)
            {
                string[] allOu = organizeName.Split(new char[]{'/','\\'});
                for (int i = allOu.Length - 1; i >= 0; i--)
                {
                    string ou = allOu;
                    if (sb.Length > 0 )
                    {
                        sb.Append(",");
                    }
                    sb.Append("OU=").Append(ou);
                }
            }

            //如果传入了组织名称,则添加,
            if (sb.Length > 0)
            {
                sb.Append(",");
            }
            sb.Append(GetDomainDN());
            return sb.ToString();
        }

        #endregion
    }
}

  
以上代码会有一些异常需要自已定义

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-111948-1-1.html 上篇帖子: Exchange数据库维护 下篇帖子: Exchange 2007 队列数据库、队列事务日志文件超过临界值(阈值)导致无法接受邮件解决方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表