我試圖確定用戶是否是使用System.DirectoryServices.AccountManagment的給定組的成員。DirectoryServicesCOMException使用System.DirectoryServices.AccountManagement時
- 我在64位系統上的SharePoint 2007中的SharePoint WebPart內部執行此操作。
- 項目目標.NET 3.5
- 模擬在web.config中啓用。
- 有問題的IIS站點使用配置爲域用戶身份的IIS應用程序池。
我能夠實例化一個PrincipalContext
這樣:
PrincipalContext pc = new PrincipalContext(ContextType.Domain)
接下來,我試圖抓住主:
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
{
GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\somegroup");
// snip: exception thrown by line above.
}
上述兩個和UserPrincipal.FindByIdentity
與用戶SAM拋出一個DirectoryServicesCOMException
:「登錄失敗:未知用戶名或密碼錯誤」
我試着將一個完整的SAMAccountName傳遞給FindByIdentity
(以MYDOMAIN \ username的形式)或只是沒有改變行爲的用戶名。我已經嘗試使用HostingEnvironment.Impersonate
和SPSecurity.RunWithElevatedPrivileges
兩種方法與其他憑據一起執行代碼,並且也經歷了相同的結果。
我也試過我的實例上下文中有域名到位:
Principal Context pc = new PrincipalContext(ContextType.Domain, "MYDOMAIN");
這將引發PrincipalServerDownException
:「服務器無法聯繫」
我正在合理的強化服務器上工作。我沒有鎖定系統,所以我不確定對它做了什麼。如果我需要爲我的池身份的用戶或域安全策略分配憑證以使這些憑據可用,則可以相應地配置域。是否有任何設置會阻止我的代碼運行?我在代碼本身中遺漏了什麼?這在SharePoint網站中是不可能的嗎?
編輯: 考慮到進一步的測試,我的代碼在以.NET 4.0爲目標的控制檯應用程序中測試時運行正常。我定位了一個不同的框架,因爲我在控制檯應用程序中無法使用AccountManagement,因爲某些原因導致了.NET 3.5的定位。
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
using (UserPrincipal adUser = UserPrincipal.FindByIdentity(pc, "MYDOMAIN\joe.user"))
using (GroupPrincipal adGroup = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\user group"))
{
if (adUser.IsMemberOf(adGroup))
{
Console.WriteLine("User is a member!");
}
else
{
Console.WriteLine("User is NOT a member.");
}
}
在我的SharePoint環境中,可能禁止執行此功能的有哪些不同?
您應該記下這是「正義的鐵拳」方法,而不是面向生產或面向互聯網的系統的推薦解決方案。 – 2010-05-27 12:47:49
@伯利 - 好點。這適用於我的環境:斷開網絡上的內部系統。這不是我很滿意的解決方案,但它是一種解決方案,因此它現在可以做到。我真的希望得到一些指導,指出管理員擁有什麼特權,使代碼無誤地執行。我很想刪除該用戶的管理員權限,並在繼續操作時授予安全性,因爲我需要。 – antik 2010-05-27 12:51:02
@antik你最終刪除管理員權限,並能夠執行此沒有例外? – FMFF 2013-10-11 14:55:00