我有一個MVC Intranet應用程序,我最近從.Net 4升級到4.6.1。此應用程序從Active Directory中查詢用戶詳細信息,以加載控制器的User.Identity屬性中不可用的詳細信息,直到最近才完美無瑕地完成。該代碼看起來是這樣的:UserPrincipal.FindByIdentity導致COM錯誤0x80005000
public static void foo()
{
var usr = LookupUser("MyDomain", "jbloggs");
...
}
private static UserPrincipal LookupUser(string domain, string username)
{
Console.WriteLine($"Lookup {domain}\\{username}");
using (var ctx = new PrincipalContext(ContextType.Domain, domain))
{
using (var user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, username))
{
if (user == null)
{
Console.WriteLine("User not found");
return;
}
Console.WriteLine($"Found {domain}\\{username}");
Console.WriteLine($"DisplayName = {user.DisplayName}");
Console.WriteLine($"Office = {user.GetString("physicalDeliveryOfficeName")}");
Console.WriteLine("");
return user;
}
}
}
的代碼在Visual Studio 2015年調試時,運行正常,但是當它在IIS箱(V6.1 SP1的Windows Server 2008 R2上)運行,拋出一個收到COMException(0x80005000 )調用UserPrincipal.FindByIdentity時()
的Web應用程序是在一個專用的應用程序池運行時,設置,內容如下:
- 支持.Net Framework Version = V4.0
- 身份= MYDOMAIN \ MyAppServiceUser (非交互式AD用戶帳戶)
- 加載用戶資料=假
所有其他設置是按照默認值。應用程序本身在啓用匿名和Windows身份驗證的情況下運行。該服務器安裝了.NET 4.6.1,並且Intranet應用程序的所有其他元素似乎都運行良好。
已將此Google搜索結果導致死亡,大多數答案似乎表明這是服務帳戶查詢AD的權限問題。爲了確認應用程序池運行的服務帳戶可以訪問Active Directory,我已經在控制檯應用程序中使用了上述代碼,並將其作爲服務器上的自己和服務帳戶運行 - 兩種它工作的實例很好。它只在IIS下運行時彈出。
我已經嘗試過創建PrincipalContext(包括OU容器路徑等)的衆多變體,但結果總是相同的。
我正在做這個堅果,所以任何幫助將不勝感激。
更新 - 附加細節
- 異常類型信息:System.Runtime.InteropServices.COMException
- 異常消息:未知錯誤(0x80005000)
- 堆棧跟蹤:
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail) 在System.DirectoryServices.DirectoryEntry.Bind()處 System.DirectoryServices.PropertyValueCollection.PopulateList() System.DirectoryServices.DirectoryEntry.get_AdsObject()在 System.DirectoryServices.PropertyValueCollection..ctor(的DirectoryEntry 條目,字符串propertyName的)在 System.DirectoryServices.PropertyCollection.get_Item(字符串 propertyName的)在 System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() 在 System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() 在 System.DirectoryServices.AccountManagement .PrincipalContext。初始化() 在 System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() 在 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext 上下文中,類型principalType,Nullable`1 identityType,字符串 identityValue,日期時間refDate)在 System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext 上下文中,類型principalType,identityType identityType,字符串 identityValue)在 System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext 上下文,identityType identityType,字符串identityValue)在 鴨ollo.Security.ActiveDirectoryUser.Find(String identityName)
這是否對你的工作? :http://stackoverflow.com/a/1722429/3709746 –
可惜不是 - 它調用DirectorySearcher.FindOne()時相同的錯誤炸燬 - 在接下來的評論 – Pete
VAR DE =新的DirectoryEntry(「LDAP代碼:// MyDC.MyDomain.com/DC=MyDomain,DC=com「,」MyDomain \\ ServiceUser「,」password「); \t var ds = new DirectorySearcher(de); (&(objectClass = user)(objectCategory = user)(sAMAccountName = {userName}))「; \t ds.PropertiesToLoad.Add(「physicalDeliveryOfficeName」); \t var result = ds.FindOne(); //在這裏爆炸 – Pete