2013-05-06 48 views
0

我有一個應用程序在C#中,我試圖通過冒充另一個用戶來更新AD。試圖冒充另一個用戶來更新Active Directory

我正在閱讀廣告,以便讓用戶更新非關鍵字段,例如任何AD帳戶的電話號碼。爲了做到這一點,我們創建了一個具有更新任何AD條目權限的新用戶。我通過登錄我的機器來驗證用戶的權限,並以他身份啓動程序,並且我可以更新任何用戶的輸入。

我使用的是Uwe Keim's Impersonator class,模擬似乎成功發生,即沒有例外。

但是,測試表明,我實際上仍然使用我自己的登錄用戶更新AD,儘管冒用了模仿。我可以更新自己的AD條目,但不是模擬用戶或其他AD條目。所以似乎沒有模仿發生?

我試圖通過使用錯誤的憑據來驗證Impersonator實際嘗試做任何事情,並收到相應的錯誤消息。所以用戶憑據是正確的,並且實際上是針對AD進行檢查的。

這裏是我的相關代碼,不相關的或敏感份塗黑[...]:

private void SaveToAD() 
{ 
    try 
    { 
     [...] 
     using (new Impersonator(@"<user>", @"<domain>", @"<password>")) 
     { 
      foreach ([...]) 
      { 
       DirectoryEntry entry = [...]; 

       entry.Properties[...].Value = [...]; 
       entry.CommitChanges(); 
      } 
     } 
     [...] 
    } 
    catch (UnauthorizedAccessException ex) 
    { 
     // Handling 
    } 
    catch (Win32Exception ex) 
    { 
     // Handling 
    } 
    finally 
    { 
     Cursor = Cursors.Arrow; 
    } 
} 

誰能告訴我什麼錯或點我的方向?

回答

1

爲什麼不只是使用DirectoryEntry構造函數將ADSI連接建立爲想要模擬的用戶(假設您擁有自己的憑據)。

例如

 using (var dirRoot = new DirectoryEntry("LDAP://cn=user object, dc=domain, dc=com", @"<domain>\<user>", "<password>")) 
     { 
      dirRoot.Properties["l"].Value = "yada"; 
      dirRoot.CommitChanges(); 
     } 
+0

我沒有所有用戶的憑據,只有一個用戶有權限更新任何其他用戶的數據。 – Deathmic 2013-05-06 07:00:15

+0

這應該是你所需要的。如果您擁有「上帝」帳戶的憑據,請在DirectoryEntry的構造函數中提供它們以建立對象的安全上下文。然後,您可以進行所有您想要的更改。我希望你有一個很好的機制來安全地存儲你的輔助\神帳戶的憑據。 – CaptDialup 2013-05-06 07:15:30

+0

我通過SearchResult.GetDirectoryEntry()獲取我的DirectoryEntry項目,所以我不認爲我可以通過這種方式實例化它們。 – Deathmic 2013-05-06 13:17:50

相關問題