如何在 Active Directory 用户和组中插入或更新属性

Posted

技术标签:

【中文标题】如何在 Active Directory 用户和组中插入或更新属性【英文标题】:How to insert or update properties in Active Directory Users and Groups 【发布时间】:2017-03-06 08:22:53 【问题描述】:

我正在制作一个将源数据同步到 Active Directory 的 Windows 应用程序。

这个应用程序是这样工作的。

    选择源数据(部门、用户)

    从源数据映射用户或部门属性

    应用程序服务运行时,会在 Active Directory 中创建组和用户

    它还为用户和组设置属性。

当我尝试设置组或用户属性(属性)时,它会抛出这样的异常消息。

在 DirectoryEntry.CommitChanges();阻止

The directory
 service cannot perform the requested operation on the RDN attribute of an object.

我试图解决它,但这对我来说真的很难,因为我不擅长 Active Directory...

代码如下,请分享您的知识。

    //ppk: department key column, pk:user key column, row : Source DataTable's row
        void CreateADUser(string ppk,string pk,DataRow row)
        
            //password
            string pass = GetPass(pk,row,LogSections.AD);
            //OU
            DirectoryEntry addept = adm.FindOU(ppk);
            //principal path
            string sOU = adm.GetPrincipalPath(addept);
            var aduser = adm.CreateNewUser(sOU, pk, pass, pk, null, null, adm.sDomain);
            SetAdUserProperties(pk, pass, row);    
            MoveUser(ppk,pk);
        



        void SetAdUserProperties(string pk,string pass,DataRow row)
        
            if (row == null) return;
            //list of mapped column(AD User attributes)
            List<ADMapping> MappingPatterns = GetAdMappings(Words.User,false);
            //Columns name of Source Data table's row
            var colnames = Tool.GetColNames(row);
            //get user proterties
            var aduser = adm.GetUser(pk);
            //directory entry of users
            var de=aduser.GetUnderlyingObject() as DirectoryEntry;
            //looping mapped column of user attributes
            foreach (var ADMap in MappingPatterns)
            
                string val = ADMap.Mapping;
                //mapped columns value
                val=Util.ReplaceColPattern(val, row);
                SetProperty(de, ADMap.CN, val);
            
            if (!string.IsNullOrWhiteSpace(pass))
            
               var UserPkColumn = AppConfigHelper.GetAppString(Words.SourceUserPKColumn);
               UserPkColumn = Util.GetActualColName(UserPkColumn);
               aduser.SetPassword(pass);
               QueryHelper.Update(QueryHelper.ConnectionString, Words.ShadowUserTable
                            ,new SqlParameter[]  new SqlParameter("@passwd", pass) 
                            , new SqlParameter("@"+UserPkColumn,pk));
            

             aduser.Save();
        

        public void SetProperty(DirectoryEntry oDE, string sPropertyName, object sPropertyValue)
        
            if (sPropertyValue != null && !string.IsNullOrWhiteSpace(sPropertyValue.ToString()))
            
                if (oDE.Properties.Contains(sPropertyName))
                
                    oDE.Properties[sPropertyName].Value = sPropertyValue;
                
                else
                
                    oDE.Properties[sPropertyName].Add(sPropertyValue);
                
                try
                
                    oDE.CommitChanges(); //exception here.
                    oDE.Close();
                 
                catch (Exception)
                   
                
             
        

【问题讨论】:

【参考方案1】:

我也在其他论坛上问过这个问题,终于明白了。

DirectoryEntry.CommitChanges(); 之前将UserPropertyCache 属性设置为true

并调用RefreshCache 方法。

【讨论】:

【参考方案2】:

这里很难看出问题的原因是什么,因为我们没有看到您尝试设置的属性。

也就是说,如果 AD 对象上不存在属性,则不能只添加属性,因此这部分代码肯定存在问题:

if (oDE.Properties.Contains(sPropertyName))

    oDE.Properties[sPropertyName].Value = sPropertyValue;

else

    //The following line will never work in this context
    oDE.Properties[sPropertyName].Add(sPropertyValue);

如果我必须做出有根据的猜测,我会说您要么尝试设置无法设置的属性,要么您添加的用户没有设置所有强制属性。

【讨论】:

以上是关于如何在 Active Directory 用户和组中插入或更新属性的主要内容,如果未能解决你的问题,请参考以下文章

如何将Active Directory ldif文件导入openldap服务器?

Active Directory LDAP 用户输入啥作为用户名来登录 OBIEE 分析?

Active Directory(活动目录)在企业中的运用

如何在 Powershell 中模拟 Active Directory 用户?

如何从 Azure Active Directory 检索用户信息

如何在 SQL Server 中添加 Active Directory 用户组作为登录名