2017-03-06 18 views
0

我正在制作一个将源数据同步到Active Directory的Windows应用程序。如何在Active Directory用户和组中插入或更新属性

此应用程序的工作原理与此类似。

  1. 选择源数据(系用户)

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

  3. 当运行应用服务,它创建组和用户在Active Directory中

  4. 而且它将属性设置为用户和组。

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

in DirectoryEntry.CommitChanges();阻止

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

我试图解决它,但它真的很难,因为我我真的不擅长的活动目录中...

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

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

回答

0

我也向其他论坛提出过这个问题,终于搞定了。

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

,并调用RefreshCache方法。

0

很难看出问题的原因,因为我们没有看到您要设置的属性。

这就是说,你不能只添加属性,如果你的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); 
} 

如果我不得不做出一个受过教育的猜测,我想说你要么设置一个无法设置的属性,要么你添加的用户没有全部设置强制属性。

相关问题