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的所有代码都在该块中,并且在将服务/应用部署到服务器时应修复异常