簡體   English   中英

如何在Active Directory用戶和組中插入或更新屬性

[英]How to insert or update properties in Active Directory Users and Groups

我正在制作一個Windows應用程序,將源數據同步到Active Directory。

此應用程序的工作原理如下。

  1. 選擇源數據(部門,用戶)

  2. 從源數據映射用戶或部門屬性

  3. 運行應用程序服務時,它將在Active Directory中創建組和用戶

  4. 並且還將屬性設置為用戶和組。

當我嘗試設置組或用戶的attribute(properties)時,它會拋出這樣的異常消息。

在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)
                {   
                }
             }
        }

很難在這里看到問題的原因,因為我們沒有看到您要設置的屬性。

就是說,如果您的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);
}

如果我不得不做出有根據的猜測,那就是說您正在嘗試設置無法設置的屬性,或者您要添加的用戶沒有設置所有必填屬性。

我也向其他論壇提出了這個問題,終於明白了。

DirectoryEntry.CommitChanges();之前DirectoryEntry.CommitChanges(); UserPropertyCache屬性設置為true

並調用RefreshCache方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM