2010-03-08 39 views
2

我正在使用WCF服務向我們的幫助臺人員公開某些Active Directory管理功能,但未向他們提供直接操作AD所需的組成員資格。將用戶添加到和刪除組中的用戶正在像現有用戶一個冠軍,但每次我創建一個新用戶時,它拋出回到這個有趣的代碼:在創建用戶後向AD安全組添加用戶失敗

The server is unwilling to process the request. (Exception from HRESULT: 0x80072035) 

我用它來將用戶添加到組的代碼是

public bool AddGroupToUser(string userDn, string groupDn) 
    { 
     try 
     { 
      DirectoryEntry groupEntry = LdapTools.GetDirectoryEntry(groupDn); 
      groupEntry.Properties["member"].Add(userDn); 
      groupEntry.CommitChanges(); 
      groupEntry.Close(); 
      return true; 
     } 
     catch (DirectoryServicesCOMException) 
     { 
      return false; 
     } 
    } 

一切我關於這個問題的閱讀是相當模糊的,我似乎無法找出爲什麼異常被觸發。有任何想法嗎?

UPDATE

這是我使用在AD中創建用戶的代碼:

 try 
     { 
      DirectoryEntry container = GetDirectoryEntry(storageOu); 
      DirectoryEntry newUser = container.Children.Add("CN=" + employee.FullName, "user"); 
      newUser.Properties["sAMAccountName"].Value = employee.Username; 
      newUser.Properties["displayName"].Value = employee.FullName; 
      newUser.Properties["givenName"].Value = employee.FirstName; 
      newUser.Properties["sn"].Value = employee.LastName; 
      newUser.Properties["department"].Value = departmentName; 
      newUser.Properties["userPrincipalName"].Value = employee.Username + "@APEX.Local"; 
      newUser.CommitChanges(); 

      newUser.Invoke("SetPassword", new object[] { employee.Password }); 
      newUser.CommitChanges(); 

      AdsUserFlags userSettings = AdsUserFlags.NormalAccount; 
      newUser.Properties["userAccountControl"].Value = userSettings; 
      newUser.CommitChanges(); 

      ldapPath = newUser.Path; 

      newUser.Close(); 
      container.Close(); 
     } 
     catch (DirectoryServicesCOMException e) 
     { 
      // Something went wrong... what??? 
     } 
     catch (Exception e) 
     { 
      // Something else went wrong 
     } 

新的用戶可以登錄,並且可以使用標準的MS工具來操縱。

回答

2

顯然,除非我在這裏錯過了重要的一步,否則問題是時間。在嘗試將組添加到新用戶之前,強制系統進入睡眠狀態8秒鐘時,該過程將起作用。如果我早於8秒標記就會失敗。

我表示這個答案是正確的,除非任何人都可以爲我提供更好的解決方案。

+0

我不認爲DirectoryEntry基元可以保證在內部使用相同的AD綁定,因此完全可以在不同於您添加用戶的域控制器(AD使用多主複製模型)的域控制器上操作該組。 完成複製所需的時間量取決於域控制器的數量,該設置決定了在通知對等方更改和AD事務量之前要等待多長時間。 在一個大的領域,我看到AD花費5分鐘以上來完全複製一個SPN,所以要小心8秒。 –

+0

我已經編寫了一個DirectoryEntry封裝器,旨在解決不知道我連接到的域控制器的問題。我現在每次都連接到同一個DC,並且在8秒鐘的時間過去之前,它仍然無法識別後續呼叫中的DirectoryEntry。幸運的是,至少現在,我只需要擔心兩個區議會。如果我們開始爲每個位置添加一個DC,Heaven會幫助我。 你知道一種方法來找出SPN何時被完全複製嗎? – thaBadDawg

1

嘗試:

public bool AddUserToGroup(string userName, string groupName) 

     { 

      bool done = false; 

      GroupPrincipal group = GroupPrincipal.FindByIdentity(context, groupName); 

      if (group == null) 

      { 

       group = new GroupPrincipal(context, groupName); 

      } 

      UserPrincipal user = UserPrincipal.FindByIdentity(context, userName); 

      if (user != null & group != null) 

      { 

       group.Members.Add(user); 

       group.Save(); 

       done = (user.IsMemberOf(group)); 

      } 

      return done; 

     } 

參考:
http://www.c-sharpcorner.com/UploadFile/dhananjaycoder/activedirectoryoperations11132009113015AM/activedirectoryoperations.aspx

+0

當然,這隻適用於.NET 3.5及以上。 –

0

因爲它在here提到的,你能告訴我們您所設置的新創建的用戶的密碼?在參考文獻中,它說你在做任何事情之前應該先設置用戶的密碼。

+0

您也可以在http://www.experts-exchange.com/Programming/Misc/Q_21962620.html –

+0

查看已接受的soluiton。查看我添加到問題中的代碼更新,我添加了我的用戶創建代碼。 – thaBadDawg

+0

我在我的公司使用相同的代碼,除了我的用戶的userAccountControl屬性也有「密碼不過期」值。 (ActiveDs.ADS_USER_FLAG.ADS_UF_DONT_EXPIRE_PASSWD)你可以嘗試設置這個值嗎? –

0

Active Directory複製問題可能會出現時間問題。

有一次,我給我的客戶提供了一個產品,該產品通過Active Directory創建用戶,該用戶擁有超過10,000條記錄,並在SharePoint表單上提供給定信息,然後程序將用戶添加到SharePoint組。問題是,SharePoint引發了有關新創建的用戶的錯誤,它表示用戶在AD中不存在。

所以,一位外部系統工程師告訴我們有關Active Directory上的複製操作,它可能是問題的根源,它是真的。

對於解決方案,程序嘗試在1秒鐘的睡眠時間內完成10次作業。到目前爲止沒有發生問題。因此,作爲解決方案,我建議您檢查AD是否存在複製方法。

P.S:當我向客戶系統工程師詢問有關複製操作的問題時,他們都拒絕了AD複製操作的存在,並告訴我該程序存在問題。他們相信我,當我們用計算機在AD創建新用戶時,我們無法在另一臺計算機上看到用戶5秒鐘。