gho*_*ago 27 .net c# com exception active-directory
当我尝试使用方法GroupPrincipal.FindByIdentity查询Active Directory时,我收到间歇性COM异常" 发生操作错误(0x80072020) "(如下所示)
这是我的代码:
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, Environment.UserDomainName);
GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(ctx, IdentityType.Name, "Group to find");
Run Code Online (Sandbox Code Playgroud)
我收到例外:
Inner Exception: System.Runtime.InteropServices.COMException (0x80072020): An operations error occurred.
at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
at System.DirectoryServices.DirectoryEntry.Bind()
at System.DirectoryServices.DirectoryEntry.get_AdsObject()
at System.DirectoryServices.PropertyValueCollection.PopulateList()
at System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry entry, String propertyName)
at System.DirectoryServices.PropertyCollection.get_Item(String propertyName)
at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate)
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue)
at System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue)
Run Code Online (Sandbox Code Playgroud)
代码从Windows 2003 SP2服务器上的Windows 服务运行.
我已经发现了另一个堆栈溢出问题,Active Directory中,列举用户群体,COM异常,这表明启用Kerberos作为PrincipalContext构造一个选项,将解决这个问题,但我收到一个不同的十六进制代码比这个问题.
我的问题是:
atc*_*way 41
问题通常是Active Directory调用的上下文是在没有权限的用户下(identity impersonate="true"
在ASP.NET中也可能发生,因为用户令牌是"辅助令牌"而不能用于从另一台服务器进行身份验证时使用:https://social.technet.microsoft.com/Forums/en-US/f188029c-51cf-4b50-966a-eee7160d0353/an-operations-error-occured).
下面的代码将确保您正在运行的代码块,是的环境下运行说,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
}
}
Run Code Online (Sandbox Code Playgroud)
但是,一个非常重要的细节是调用Active Directory的所有代码都必须在该块中.我使用了一些我的团队成员编写的代码,它返回了LINQ
类型Users
(自定义类)的查询结果,但没有评估表达式(不良做法).因此返回表达式树而不是结果.
最终发生的是调用代码最终评估结果并且An operations error occurred
消息仍然出现.我虽然上面的代码修复不起作用.事实上它确实如此,但是有代码评估了块外的结果.
简而言之,确保访问Active Directory的所有代码都在该using
块内,并且应修复异常,将服务/应用程序部署到服务器.
gho*_*ago 19
我现在找到了另一个答案无法在Dynamics CRM中添加用户使用CrmService API,其中指出0x80072020确实是一个权限问题.我已经将我的服务更改为在域级帐户而不是本地系统帐户下运行,这似乎已经解决了我的问题.
这是2年后,我碰到了这个,发现以下问题解决了我的问题:
using System.Web.Hosting;
...
...
// Code here runs as the logged on user
using (HostingEnvironment.Impersonate()) {
// This code runs as the application pool user
DirectorySearcher searcher ...
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
52102 次 |
最近记录: |