我有一个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