2

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

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 上的应用程序池,使用“网络服务”作为帐户

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

发生操作错误。

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

这是我尝试过的,这些都没有奏效:

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

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

4

1 回答 1

3

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

问题通常是进行 Active Directory 调用的上下文是在没有权限的用户下(identity impersonate="true"在 ASP.NET 中也可能发生,因为用户令牌是不能在对来自以下网址的另一台服务器进行身份验证时使用: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代码都在该块内,并且应该在服务/应用程序部署到服务器时修复异常。

于 2013-09-26T19:26:57.333 回答