ADEntryj简单的增删改属性设置

namespace SMCManager.Business
{
    public class CTreeManager : ITreeManager
    {
        //private string _dc = Convert.ToString(ConfigurationManager.AppSettings["DC"]);
        //private string _rootLdap = Convert.ToString(ConfigurationManager.AppSettings["RootLDAP"]);
        //private string _domain = Convert.ToString(ConfigurationManager.AppSettings["Domain"]);
        //private string _admin = Convert.ToString(ConfigurationManager.AppSettings["Admin"]);
        //private string _password = Convert.ToString(ConfigurationManager.AppSettings["Password"]);

        //private string GetADPath(string ldap)
        //{
        //    string path = string.Empty;
        //    if (string.IsNullOrEmpty(ldap))
        //        path = string.Format("LDAP://{0}/{1}", _dc, _rootLdap);
        //    else
        //    {
        //        path = string.Format("LDAP://{0}/{1}", _dc, ldap);
        //    }
        //    return path;
        //}

        //private bool GetADEntry(string path, out DirectoryEntry Ad_DC, out string strError)
        //{
        //    bool bResult = false;
        //    strError = string.Empty;
        //    Ad_DC = null;
        //    try
        //    {
        //        Ad_DC = new DirectoryEntry(path);
        //        bResult = true;
        //    }
        //    catch (Exception ex)
        //    {
        //        //日志
        //        strError = "实例化ADEntry失败,Error:" + ex.Message;
        //        bResult = false;
        //    }
        //    return bResult;
        //}

        /// <summary>
        /// 同步数据
        /// </summary>
        /// <param name="item"></param>
        /// <param name="strError"></param>
        /// <returns></returns>
        public bool GetTreeData(out CTreeItem item, out string strError)
        {
            bool bResult = false;
            strError = string.Empty;
            item = new CTreeItem();
            string path = CommonManager.GetRootADPath();
            DirectoryEntry Ad_DC = null;
            if (CommonManager.GetADEntryByPath(path, out Ad_DC, out strError))
            {
                item.ID = Ad_DC.Properties["distinguishedName"].Value == null ? "" : Ad_DC.Properties["distinguishedName"].Value.ToString();
                item.DisplayName = Ad_DC.Properties["name"].Value == null ? "" : Ad_DC.Properties["name"].Value.ToString();
                item.ItemType = SMCEntity.Common.TreeTypeEnum.OU;
                if (Ad_DC != null)
                {
                    Ad_DC.Close();
                    Ad_DC.Dispose();
                    Ad_DC = null;
                }
                bResult = true;
            }
            //ADBase adBase = ADFactoryManager.GetADBase("");
            //if (!adBase.Connect(out strError))
            //{
            //    return false;
            //}
            //try
            //{
            //    item.ID = adBase._adConnect.Entry.Properties["distinguishedName"].Value == null ? "" : adBase._adConnect.Entry.Properties["distinguishedName"].Value.ToString();
            //    item.DisplayName = adBase._adConnect.Entry.Properties["name"].Value == null ? "" : adBase._adConnect.Entry.Properties["name"].Value.ToString();
            //    item.ItemType = SMCEntity.Common.TreeTypeEnum.OU;
            //    bResult = true;
            //}
            //catch (Exception ex)
            //{
            //    strError = ex.Message;
            //    bResult = false;
            //}
            //adBase._adConnect.Dispose();
            //DirectoryEntry root;
            //string ladp = Convert.ToString(ConfigurationManager.AppSettings["RootLADP"]);
            //if (GetRootTreeAd(ladp, out root))
            //{
            //    item.ID = root.Properties["distinguishedName"].Value == null ? "" : root.Properties["distinguishedName"].Value.ToString();
            //    item.DisplayName = root.Properties["name"].Value == null ? "" : root.Properties["name"].Value.ToString();
            //    item.ItemType = SMCEntity.Common.TreeTypeEnum.OU;
            //    bResult = true;

            //    if (root != null)
            //    {
            //        root.Close();
            //        root.Dispose();
            //        root = null;
            //    }
            //}
            //else
            //{
            //    //日志
            //}
            return bResult;
        }

        /// <summary>
        /// 获取父节点下单层节点数据集
        /// </summary>
        /// <param name="item">父节点</param>
        /// <param name="items">节点数据集</param>
        /// <param name="strError">返回信息</param>
        /// <returns></returns>
        public bool GetTreeData(string itemID, out List<CTreeItem> items, out string strError)
        {
            bool bResult = false;
            strError = string.Empty;
            items = new List<CTreeItem>();
            DirectoryEntry Ad_DC = null;
            if (CommonManager.GetADEntryByLdap(itemID, out Ad_DC, out strError))
            {
                try
                {
                    DirectorySearcher Ad_deSearch = new DirectorySearcher();
                    Ad_deSearch.SearchRoot = Ad_DC;
                    Ad_deSearch.Filter = "(|(objectClass=organizationalUnit)(objectClass=user))";
                    Ad_deSearch.SearchScope = SearchScope.OneLevel;
                    Ad_deSearch.PageSize = 1000;
                    SearchResultCollection results = Ad_deSearch.FindAll();
                    //获取DC下的全部OU
                    if (results != null && results.Count > 0)
                    {
                        DirectoryEntry CN = null;
                        CTreeItem item = null;
                        foreach (SearchResult Result in results)
                        {
                            item = new CTreeItem();
                            CN = Result.GetDirectoryEntry();
                            object[] objectClasses = CN.Properties["objectClass"].Value == null ? new object[] { } : (object[])(CN.Properties["objectClass"].Value);
                            foreach (string objectClass in objectClasses)
                            {
                                if (objectClass == "organizationalUnit")
                                {
                                    item.ItemType = SMCEntity.Common.TreeTypeEnum.OU;
                                    break;
                                }
                                else if (objectClass == "user")
                                {
                                    item.ItemType = SMCEntity.Common.TreeTypeEnum.User;
                                    break;
                                }
                            }
                            item.ID = CN.Properties["distinguishedName"].Value == null ? "" : CN.Properties["distinguishedName"].Value.ToString();
                            item.DisplayName = CN.Properties["name"].Value == null ? "" : CN.Properties["name"].Value.ToString();
                            items.Add(item);
                        }
                        bResult = true;
                    }
                }
                catch (Exception ex)
                {
                    strError = ex.Message;
                    bResult = false;
                }
            }
            //if (string.IsNullOrEmpty(itemID))
            //{
            //    strError = "传入参数不能为空";
            //    return false;
            //}
            //ADBase adBase = ADFactoryManager.GetADBase(itemID);
            //if (!adBase.Connect(out strError))
            //{
            //    return false;
            //}
            //try
            //{
            //    DirectorySearcher Ad_deSearch = new DirectorySearcher();
            //    Ad_deSearch.SearchRoot = adBase._adConnect.Entry;
            //    Ad_deSearch.Filter = "(|(objectClass=organizationalUnit)(objectClass=user))";
            //    Ad_deSearch.SearchScope = SearchScope.OneLevel;
            //    Ad_deSearch.PageSize = 1000;
            //    SearchResultCollection results = Ad_deSearch.FindAll();
            //    //获取DC下的全部OU
            //    if (results != null && results.Count > 0)
            //    {
            //        DirectoryEntry CN = null;
            //        CTreeItem item = null;
            //        foreach (SearchResult Result in results)
            //        {
            //            item = new CTreeItem();
            //            CN = Result.GetDirectoryEntry();
            //            List<string> dsasa = CN.Properties["objectClass"].Value as List<string>;
            //            string objectClass = CN.Properties["objectClass"].Value == null ? "" : CN.Properties["objectClass"].Value.ToString();
            //            if (objectClass == "organizationalUnit")
            //                item.ItemType = SMCEntity.Common.TreeTypeEnum.OU;
            //            else if (objectClass == "user")
            //                item.ItemType = SMCEntity.Common.TreeTypeEnum.User;

            //            item.ID = CN.Properties["distinguishedName"].Value == null ? "" : CN.Properties["distinguishedName"].Value.ToString();
            //            item.DisplayName = CN.Properties["name"].Value == null ? "" : CN.Properties["name"].Value.ToString();
            //            items.Add(item);
            //        }
            //    }
            //}
            //catch (Exception ex)
            //{
            //    //日志
            //    strError = ex.Message;
            //    bResult = false;
            //}
            //adBase._adConnect.Dispose();
            return bResult;
        }
        public bool PwdUserAD(string ldap, string newPwd, out string strError)
        {
            DirectoryEntry ad_DC = null;
            if (CommonManager.GetADEntryByLdap(ldap, out ad_DC, out strError))
            {
                try
                {
                    if (CommonManager.SecurityVerification(out strError))
                    {
                        using (ad_DC)
                        {
                            ad_DC.Invoke("SetPassword", new object[] { newPwd });   //set user's password
                            ad_DC.CommitChanges();
                        }
                    }
                }
                catch (COMException ex)
                {
                    strError = ex.Message;
                    return false;
                }
                return true;
            }
            return false;
        }
        public bool DelUserAD(string ldap, out string strError)
        {
            DirectoryEntry ad_DC = null;
            if (CommonManager.GetADEntryByLdap(ldap, out ad_DC, out strError))
            {
                try
                {
                    if (CommonManager.SecurityVerification(out strError))
                    {
                        using (ad_DC)
                        {
                            ad_DC.DeleteTree();
                        }
                    }
                }
                catch (COMException ex)
                {
                    strError = ex.Message;
                    return false;
                }
                return true;
            }
            return false;
        }
        public bool GreateUserAD(string ldap, CUserEntity userEntity, out string strError)
        {
            DirectoryEntry ad_DC = null;
            if (CommonManager.GetADEntryByLdap(ldap, out ad_DC, out strError))
            {
                try
                {
                    if (CommonManager.SecurityVerification(out strError))
                    {
                        if (!string.IsNullOrEmpty(userEntity.DisplayName))//传值为空报异常
                        {
                            using (ad_DC)
                            {
                                using (DirectoryEntry user = ad_DC.Children.Add("CN=" + userEntity.DisplayName, "user"))
                                {
                                    user.Properties["sAMAccountName"].Add(userEntity.DisplayName);//拼音
                                    user.Properties["displayName"].Add(userEntity.DisplayName);
                                    if (!string.IsNullOrEmpty(userEntity.Account))//传值为空报异常
                                        user.Properties["userPrincipalName"].Add(userEntity.Account);//登陆邮箱
                                    if (!string.IsNullOrEmpty(userEntity.UserBase.FristName))//传值为空报异常
                                        user.Properties["sn"].Add(userEntity.UserBase.FristName);//姓
                                    if (!string.IsNullOrEmpty(userEntity.UserBase.LastName))//传值为空报异常
                                        user.Properties["givenName"].Add(userEntity.UserBase.LastName);//名
                                    if (!string.IsNullOrEmpty(userEntity.UserBase.OfficeName))//传值为空报异常
                                        user.Properties["physicalDeliveryOfficeName"].Add(userEntity.UserBase.OfficeName);//名
                                    if (!string.IsNullOrEmpty(userEntity.UserBase.Discription))//传值为空报异常
                                        user.Properties["description"].Add(userEntity.UserBase.Discription);
                                    if (!string.IsNullOrEmpty(userEntity.UserBase.TelephoneNumber))//传值为空报异常
                                        user.Properties["telephoneNumber"].Add(userEntity.UserBase.TelephoneNumber);
                                    user.CommitChanges();
                                    user.Invoke("SetPassword", new object[] { userEntity.UserBase.Password });   //set user's password
                                    //用户帐户控制 userAccountControl (启用:512,禁用:514, 密码永不过期:66048)
                                    int val = (int)user.Properties["userAccountControl"].Value;//默认值546,val & ~2=544参数:启用且密码可以为空
                                    user.Properties["userAccountControl"].Value = val & ~2;
                                    user.CommitChanges();
                                }

                            }
                        }
                    }
                }
                catch (COMException ex)
                {
                    strError = ex.Message;
                    return false;
                }
                return true;
            }
            return false;
        }
        public bool ModifyUserAD(string ldap, CUserEntity userEntity, out string strError)
        {
            DirectoryEntry ad_DC = null;
            if (CommonManager.GetADEntryByLdap(ldap, out ad_DC, out strError))
            {
                try
                {
                    if (CommonManager.SecurityVerification(out strError))
                    {
                        if (!string.IsNullOrEmpty(userEntity.DisplayName))//传值为空报异常
                        {
                            using (ad_DC)
                            {
                                if (ad_DC.Properties.Contains("displayName"))
                                    ad_DC.Properties["displayName"][0] = userEntity.DisplayName;
                                else
                                    ad_DC.Properties["displayName"].Add(userEntity.DisplayName);
                                if (ad_DC.Properties.Contains("sAMAccountName"))
                                    ad_DC.Properties["sAMAccountName"][0] = userEntity.DisplayName;
                                else
                                    ad_DC.Properties["sAMAccountName"].Add(userEntity.DisplayName);

                                if (ad_DC.Properties.Contains("sn"))
                                    ad_DC.Properties["sn"][0] = userEntity.UserBase.FristName;
                                else
                                    ad_DC.Properties["sn"].Add(userEntity.UserBase.FristName);
                                if (ad_DC.Properties.Contains("givenName"))
                                    ad_DC.Properties["givenName"][0] = userEntity.UserBase.LastName;
                                else
                                    ad_DC.Properties["givenName"].Add(userEntity.UserBase.LastName);
                                if (ad_DC.Properties.Contains("telephoneNumber"))
                                    ad_DC.Properties["telephoneNumber"][0] = userEntity.UserBase.TelephoneNumber;
                                else
                                    ad_DC.Properties["telephoneNumber"].Add(userEntity.UserBase.TelephoneNumber);
                                if (ad_DC.Properties.Contains("physicalDeliveryOfficeName"))
                                    ad_DC.Properties["physicalDeliveryOfficeName"][0] = userEntity.UserBase.OfficeName;
                                else
                                    ad_DC.Properties["physicalDeliveryOfficeName"].Add(userEntity.UserBase.OfficeName);
                                if (ad_DC.Properties.Contains("description"))
                                    ad_DC.Properties["description"][0] = userEntity.UserBase.Discription;
                                else
                                    ad_DC.Properties["description"].Add(userEntity.UserBase.Discription);
                                ad_DC.CommitChanges();
                            }
                        }
                    }
                }
                catch (COMException ex)
                {
                    strError = ex.Message;
                    return false;
                }
                return true;
            }
            return false;
        }
        public bool GetUserPropertyAD(string ldap, out CUserEntity userEntity, out string strError)
        {
            DirectoryEntry ad_DC = null;
            userEntity = null;
            if (CommonManager.GetADEntryByLdap(ldap, out ad_DC, out strError))
            {
                try
                {
                    using (ad_DC)
                    {
                        userEntity = new CUserEntity();
                        CUserBase userBase = new CUserBase();
                        if (ad_DC.Properties.Contains("displayName"))
                            userEntity.DisplayName = ad_DC.Properties["displayName"][0].ToString();
                        if (ad_DC.Properties.Contains("cn"))
                            userBase.FristName = ad_DC.Properties["cn"][0].ToString();
                        if (ad_DC.Properties.Contains("givenName"))
                            userBase.LastName = ad_DC.Properties["givenName"][0].ToString();
                        if (ad_DC.Properties.Contains("telephoneNumber"))
                            userBase.TelephoneNumber = ad_DC.Properties["telephoneNumber"][0].ToString();
                        if (ad_DC.Properties.Contains("physicalDeliveryOfficeName"))
                            userBase.OfficeName = ad_DC.Properties["physicalDeliveryOfficeName"][0].ToString();
                        if (ad_DC.Properties.Contains("description"))
                            userBase.Discription = ad_DC.Properties["description"][0].ToString();
                        userEntity.UserBase = userBase;
                    }
                }
                catch (COMException ex)
                {
                    strError = ex.Message;
                    return false;
                }
                return true;
            }
            return false;
        }
        //private bool GetRootTreeAd(string ladp, out DirectoryEntry Ad_DC)
        //{
        //    bool bResult = true;
        //    Ad_DC = null;
        //    if (string.IsNullOrEmpty(ladp))
        //    {
        //        return false;
        //    }

        //    try
        //    {
        //        ladp = string.Format("LDAP://{0}/{1}", dc, ladp);
        //        Ad_DC = new DirectoryEntry(ladp);
        //    }
        //    catch (Exception error)
        //    {
        //        //日志
        //        bResult = false;
        //    }

        //    return bResult;
        //} }
    }
    public class CommonManager
    {
        public static string GetADPathByLdap(string ldap)
        {
            string dc = Convert.ToString(ConfigurationManager.AppSettings["DC"]);
            if (!string.IsNullOrEmpty(ldap) && !string.IsNullOrEmpty(dc))
                return string.Format("LDAP://{0}/{1}", dc, ldap);
            return string.Empty;
        }
        public static string GetRootADPath()
        {
            string dc = Convert.ToString(ConfigurationManager.AppSettings["DC"]);
            string rootLdap = Convert.ToString(ConfigurationManager.AppSettings["RootLDAP"]);
            if (!string.IsNullOrEmpty(rootLdap) && !string.IsNullOrEmpty(dc))
                return string.Format("LDAP://{0}/{1}", dc, rootLdap);
            return string.Empty;
        }

        public static bool GetADEntryByPath(string path, out DirectoryEntry Ad_DC, out string strError)
        {
            bool bResult = false;
            strError = string.Empty;
            Ad_DC = null;
            if (string.IsNullOrEmpty(path))
            {
                strError = "Path路径为空";
                return false;
            }
            try
            {
                Ad_DC = new DirectoryEntry(path);
                bResult = true;
            }
            catch (Exception ex)
            {
                //日志
                strError = "实例化ADEntry失败,实例化Path路径为:" + path + ",Error:" + ex.Message;
                bResult = false;
            }
            return bResult;
        }

        public static bool GetADEntryByLdap(string ldap, out DirectoryEntry Ad_DC, out string strError)
        {
            bool bResult = false;
            strError = string.Empty;
            Ad_DC = null;
            if (string.IsNullOrEmpty(ldap))
            {
                strError = "ldap为空";
                return false;
            }
            string path = string.Empty;
            try
            {
                path = GetADPathByLdap(ldap);
                Ad_DC = new DirectoryEntry(path);
                bResult = true;
            }
            catch (COMException ex)
            {
                //日志
                strError = "实例化ADEntry失败,实例化Path路径为:" + path + ",Error:" + ex.Message;
                bResult = false;
            }
            return bResult;
        }

        public static bool SecurityVerification(out string strError)
        {
            string admin = Convert.ToString(ConfigurationManager.AppSettings["Admin"]);
            string password = Convert.ToString(ConfigurationManager.AppSettings["Password"]);
            return SecurityVerification(admin, password, out  strError);
            ////模拟身份安全 begin
            //strError = string.Empty;
            //SubmitSecurity subSecurity = new SubmitSecurity();
            //string domain = Convert.ToString(ConfigurationManager.AppSettings["Domain"]);
            //string admin = Convert.ToString(ConfigurationManager.AppSettings["Admin"]);
            //string password = Convert.ToString(ConfigurationManager.AppSettings["Password"]);
            //if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(admin) && !string.IsNullOrEmpty(password))
            //{
            //    if (!subSecurity.impersonateValidUser(admin, domain, password))
            //    {
            //        strError = "用户名或密码错误,验证失败";
            //        return false;
            //    }
            //    else
            //    {
            //        return true;
            //    }
            //}
            //strError = "传值失败";
            //return false;
        }
        public static bool SecurityVerification(string account, string pwd, out string strError)
        {
            //模拟身份安全 begin
            SubmitSecurity subSecurity = new SubmitSecurity();
            string domain = Convert.ToString(ConfigurationManager.AppSettings["Domain"]);
            strError = string.Empty;
            if (!string.IsNullOrEmpty(domain) && !string.IsNullOrEmpty(pwd) && !string.IsNullOrEmpty(account))
            {
                if (!subSecurity.impersonateValidUser(account, domain, pwd))
                {
                    strError = "用户名或密码错误,验证失败";
                    return false;
                }
                else
                {
                    return true;
                }
            }
            strError = "传值失败";
            return false;
        }

        public static bool GetADEntryByAccount(string path, string account, string pwd, out DirectoryEntry Ad_DC, out string strError)
        {
            bool bResult = false;
            strError = string.Empty;
            Ad_DC = null;
            //AD 身份验证
            //DirectoryEntry用于登陆ad全局只要存在的用户,deSearch.Filter则细化过滤指定ldap下的用户匹配
            if (string.IsNullOrEmpty(path) || string.IsNullOrEmpty(account) || string.IsNullOrEmpty(pwd))
            {
                strError = "传值为空";
                return false;
            }
            try
            {
                DirectoryEntry de = new DirectoryEntry(path, account, pwd, AuthenticationTypes.Secure);
                DirectorySearcher deSearch = new DirectorySearcher(de);
                deSearch.Filter = "(&(objectClass=user)(userPrincipalName=" + account + "))";
                deSearch.SearchScope = SearchScope.Subtree;
                SearchResult resultDE = deSearch.FindOne();
                if (resultDE != null)
                {
                    Ad_DC = resultDE.GetDirectoryEntry();
                    bResult = true;
                }
                else
                {
                    strError = "AD中不存在该用户";
                    bResult = false;
                }
            }
            catch (Exception ex)
            {
                strError = "验证出错,Error:" + ex.Message;
                bResult = false;
            }
            return bResult;
        }
        public static bool GetADEntryByAccount(string account, string pwd, out DirectoryEntry Ad_DC, out string strError)
        {
            string path = GetRootADPath();
            return GetADEntryByAccount(path, account, pwd, out Ad_DC, out strError);
        }

        public static bool OperateLogger(SystemLogEntity logEntity, out string strError)
        {
            strError = string.Empty;
            DBUtility.Logger.Info(string.Format("用户:{0}操作信息:{1}时间:{2}", logEntity.User, logEntity.ErrorContext, logEntity.CreateTime));
            return false;
        }
        public static bool OperateLogger(OperateLoggerEntity logEntity, out string strError)
        {
            strError = string.Empty;
            DBUtility.Logger.Info(string.Format("用户:{0}操作类型:{1}操作信息:{2}被操作者:{3}操作结果(成功与否):{4}时间:{5}", logEntity.Account, logEntity.OperateType, logEntity.OperateContent, logEntity.OperateAccount, logEntity.OperateResult, logEntity.OperateTime));
            return false;
        }
        public static bool OperateLogger(string account, string operateAccount, string operateContent, out string strError)
        {
            strError = string.Empty;
            OperateLoggerEntity logEntity = new OperateLoggerEntity();
            logEntity.OperateContent = operateContent;
            logEntity.OperateAccount = operateAccount;
            logEntity.Account = account;
            logEntity.OperateResult = true;
            logEntity.OperateType = "AD用户操作";
            logEntity.OperateTime = DateTime.Now;
            DBUtility.Logger.Info(string.Format("用户:{0}操作类型:{1}操作信息:{2}被操作者:{3}操作结果(成功与否):{4}时间:{5}", logEntity.Account, logEntity.OperateType, logEntity.OperateContent, logEntity.OperateAccount, logEntity.OperateResult, logEntity.OperateTime));
            return false;
        }
    }
}

  

原文地址:https://www.cnblogs.com/wangfengderizi/p/2834025.html