gpt4 book ai didi

c# - UserPrincipal.FindByIdentity 导致 COM 错误 0x80005000

转载 作者:行者123 更新时间:2023-12-04 17:57:28 26 4
gpt4 key购买 nike

我有一个 MVC Intranet 应用程序,我最近从 .Net 4 升级到 4.6.1。此应用程序从 Active Directory 查询用户详细信息以加载 Controller 的 User.Identity 属性中不可用的详细信息,直到最近才完美地完成了这项工作。代码看起来像这样:

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 框(Windows Server 2008 R2 上的 v6.1 SP1)上运行时,调用 UserPrincipal.FindByIdentity() 时抛出 COMException (0x80005000)

Web 应用程序运行在专用的应用程序池上,其设置如下:

  • .Net Framework Version = v4.0
  • Identity = MyDomain\MyAppServiceUser(非交互式 AD 用户帐户)
  • 加载用户配置文件 = false

所有其他设置均按默认设置。应用程序本身在启用匿名和 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) at System.DirectoryServices.DirectoryEntry.Bind() at System.DirectoryServices.DirectoryEntry.get_AdsObject() at System.DirectoryServices.PropertyValueCollection.PopulateList() at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName) at System.DirectoryServices.PropertyCollection.get_Item(String propertyName) at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer() at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit() at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize() at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx() at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue) at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) at Apollo.Security.ActiveDirectoryUser.Find(String identityName)

最佳答案

谈论一个令人头疼的问题。我花了一天的大部分时间来兜圈子。

感谢 Rahul 提供的所有帮助。最后,根据他的建议,我创建了一个作为网络服务运行的新应用程序池,并且 AD 查找在其下完美运行。不幸的是,因为我的应用程序访问网络资源,它需要以 AD 用户身份运行,所以我只是为了解决这个问题,将凭据更改为我之前一直在使用的 AD 服务帐户,它仍然有效

?!?

我不知道为什么会这样 - 两个应用程序池具有完全相同的设置,但一个可以执行查找而另一个不能。我已将测试和生产实例都切换到新的应用程序池并删除了旧的应用程序池,一切进展顺利。

关于c# - UserPrincipal.FindByIdentity 导致 COM 错误 0x80005000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39102630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com