【问题标题】:Getting Error Querying Active Directory On The Server Only仅在服务器上查询 Active Directory 时出错
【发布时间】:2013-09-25 16:16:49
【问题描述】:

我有以下代码块,它使用 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 上的应用程序池使用“NETWORK SERVICE”作为帐户

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

发生操作错误。

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

这是我尝试过的,没有一个奏效:

  • 将 AppPool 更改为“LocalSystem”
  • 将 AppPool 更改为使用静态超级管理员帐户
  • 在代码中使用 Impersonation 来操作本地块中调用的上下文,其中管理员用户在 MainNetwork 域上。
  • 在代码中使用 Impersonation 在本地块中与 company.container.internal 域上的管理员用户一起操作调用的上下文。
  • 添加using (HostingEnvironment.Impersonate())

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

【问题讨论】:

    标签: c# active-directory directoryservices adsi


    【解决方案1】:

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

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

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

    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 的代码都必须在该块中。我使用了我的团队成员编写的一些代码,该代码返回了 LINQ 类型为 Users(自定义类)的查询结果,但没有评估表达式(不好的做法)。因此返回的是表达式树而不是结果。

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

    简而言之,确保访问 Active Directory 的所有代码都在 using 块内,并且应该在将服务/应用部署到服务器时修复异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 1970-01-01
      • 2014-04-09
      • 2020-07-02
      • 1970-01-01
      相关资源
      最近更新 更多