2017-03-06 9 views
0

ソースデータをActive Directoryに同期するWindowsアプリケーションを作成しています。Active Directoryユーザーとグループのプロパティを挿入または更新する方法

このアプリケーションは、このように動作します。

  1. アプリケーションサービスを実行すると、それは

  2. Active Directory内のグループとユーザーを作成

    ソースデータ(部門、ユーザー)

  3. マッピングユーザーや部門が、ソースデータから属性

  4. を選択します。
  5. また、ユーザーおよびグループに属性を設定します。

グループまたはユーザーの属性(プロパティ)を設定しようとすると、このような例外メッセージがスローされます。

DirectoryEntry.CommitChanges();私はそれを解決しようとしたが、I`mは、Active Directoryで良い...

コードは以下ではありませんので、それは私には本当に難しいことは、あなたの知識を共有してください。

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();true

UserPropertyCacheプロパティを設定し、RefreshCacheメソッドを呼び出します。

0

設定しようとしている属性が表示されないため、ここで問題の原因を確認するのは難しいです。

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); 
} 

私が教育を受けなければならなかった場合:あなたのコードのこの部分は間違いなく問題を持っているので、それはあなたのADオブジェクトに存在しない場合、あなただけの属性を追加することはできません、と述べた

あなたが設定できない属性を設定しようとしているか、または追加しているユーザーにすべての必須属性が設定されていないとします。

関連する問題