gpt4 book ai didi

c# - 仅在服务器上查询 Active Directory 时出错

转载 作者:行者123 更新时间:2023-12-04 04:40:06 25 4
gpt4 key购买 nike

我有以下代码块,使用 System.DirectoryServices.AccountManagement 按组名查询用户的 Active Directory :

var domainContext = new PrincipalContext(ContextType.Domain, "company.container.internal");
var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "Lvl1Users");
if (groupPrincipal != null)
{
//Read the values
}

现在该站点使用以下内容:
  • Win2k8 上的 IIS7
  • Windows 身份验证
  • 模仿=真
  • .NET 4.0 上的应用程序池,使用“网络服务”作为帐户

  • 在我的本地机器上(你知道这是怎么回事)一切都很好。我的同龄人在本地尝试它也效果很好。但是,一旦部署到服务器,它会显示以下内容:

    An operations error occurred.



    我研究的所有内容都表明这是一个权限问题。需要注意的一件事,在我的本地机器上,我在 MainNetwork company.container.internal 的父域我正在查询的域。 IIS 机器位于 company.container.internal并且正在查询同一个域。老实说,我认为更具挑战性的情况是在我位于不同域的本地计算机上读取 AD,但它确实有效。在查询同一域的服务器上,它失败了。

    这是我尝试过的, 其中一些已经奏效:
  • 将 AppPool 更改为“LocalSystem”
  • 更改 AppPool 以使用静态 super 管理员帐户
  • 在代码中使用模拟来操作本地 block 中调用的上下文,管理员用户在 MainNetwork 上领域。
  • 在代码中使用模拟来操作本地 block 中调用的上下文,管理员用户在 company.container.internal 上领域。
  • 添加 using (HostingEnvironment.Impersonate())

  • 这里给出了什么?我尝试在两个域上模拟每种类型的电源管理员,并使用了多个 AppPool 设置,但我一直收到相同的错误。代码中是否需要通过域的声明进行更改,或者是否存在我遗漏的权限问题?

    最佳答案

    我想通了,结果发现使用 HostingEnvironment.Impersonate()还是从根本上解决问题。我已经尝试过了,但是我的代码还有另一个问题。

    问题通常是进行 Active Directory 调用的上下文位于没有权限的用户下(也可能发生在 ASP.NET 中的 identity impersonate="true" 时,因为用户 token 是“辅助 token ” ” 在对来自 http://bit.ly/1753RjA 的另一台服务器进行身份验证时无法使用)。

    以下代码将确保运行的代码块在 AppPool 的上下文中运行(即 NETWORKSERVICE )运行 ASP.NET 站点。

    using (HostingEnvironment.Impersonate())
    {
    var domainContext = new PrincipalContext(ContextType.Domain, "myDomain.com");
    var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType.Name, "PowerUsers");
    if (groupPrincipal != null)
    {
    //code to get the infomation
    }

    }

    但是,一个非常重要的细节是调用 Active Directory 的所有代码都必须在该 block 中。我使用了我的一个团队成员编写的一些代码,它返回了 LINQUsers 类型的查询结果(自定义类),但不评估表达式(不好的做法)。因此返回表达式树而不是结果。

    最终发生的是调用代码最终评估了结果, An operations error occurred消息仍然出现。我虽然上面的代码修复不起作用。实际上确实如此,但是有代码在 block 外评估结果。

    简而言之,确保 全部 访问 Active Directory 的代码位于 using 中 block 和异常应该被修复一个服务/应用程序部署到服务器。

    关于c# - 仅在服务器上查询 Active Directory 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19010141/

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