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

C# 仅在服务器上查询Active Directory时出错,c#,active-directory,directoryservices,adsi,C#,Active Directory,Directoryservices,Adsi,我有以下代码块,它使用System.DirectoryServices.AccountManagement按组名查询Active Directory中的用户: var domainContext = new PrincipalContext(ContextType.Domain, "company.container.internal"); var groupPrincipal = GroupPrincipal.FindByIdentity(domainContext, IdentityType

我有以下代码块,它使用
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上的应用程序池
在我本地的机器上(你知道这是怎么回事),一切都很好。我的同龄人在当地试用过,效果也很好。但是,一旦部署到服务器,它将显示以下内容:

发生操作错误

我所研究的一切都表明这是一个权限问题。需要注意的一点是,在我的本地计算机上,我位于
MainNetwork
域上,该域是我正在查询的
company.container.internal
域的父域。IIS计算机位于
company.container.internal
上,正在查询同一域。所以老实说,我认为更具挑战性的情况是在我的本地机器上阅读广告,这是在一个不同的领域,但它的工作。在查询同一域的服务器上,它失败

以下是我尝试过的,但没有一个有效:

  • 将AppPool更改为“LocalSystem”
  • 将AppPool更改为使用静态超级复制器管理员帐户
  • 在代码中使用模拟来操纵本地块中与
    MainNetwork
    域上的管理员用户的调用上下文
  • 在代码中使用模拟来操纵本地块中调用的上下文,该本地块具有
    company.container.internal
    域上的管理员用户
  • 使用(HostingEnvironment.Impersonate())添加

这里有什么?我尝试在两个域上模拟每种类型的power admin,并使用了多个AppPool设置,但我一直收到相同的错误。在声明域的代码中是否有任何需要更改的地方,或者是否存在我缺少的权限问题?

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

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

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

最终发生的是调用代码最终评估了结果,并且出现了
操作错误
消息。我认为上面的代码修复程序不起作用。事实上是这样,但代码在块外评估结果

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