.GetDirectoryEntry在尝试绑定到对象时抛出COM异常,代码:0x800720720

时间:2014-06-17 18:56:34

标签: asp.net iis-7 active-directory comexception

我的应用程序在IIS 7.0上运行,它应该模拟经过身份验证的用户并解锁或重置其他用户帐户。当我在我的工作站上开发它时它工作正常,但是当我将它上传到服务器时,模拟停止工作,它不会绑定到AD对象并继续抛出相同的异常。我之前使用PrincipalContext遇到了同样的问题,但是我能够使用using(HostingEnvironment.Impersonate())解决这个问题,因为我并不需要经过身份验证的用户来执行该操作。但是现在我这样做了,我无法使用这种解决方法。我需要对问题进行实际修复,我真的很感激一些意见。我一直在寻找解决问题的方法,到目前为止,他们都没有工作过。以下是我使用的代码,它不断抛出异常。

using (DirectorySearcher search = new DirectorySearcher(directoryEntries[counter]))
{
    //Sets the filter to find a user object with the target user username
    search.Filter = "(&(objectClass=user)(sAMAccountName=" + username + "))";
    //Sets the searchscope to search the whole AD
    search.SearchScope = SearchScope.Subtree;
    //Executes the search for one result and stores it in result.
    SearchResult result = search.FindOne();
    //Creates a directory entry from the result.

    using (DirectoryEntry targetUser = result.GetDirectoryEntry())
    {
        //This if-else statement checks if the user is locked, if it is then
        //the unlock is performed, and the unlockPerformed variable is set to
        //true, if it isn't then unlockPerformed is set to false.
        if (Convert.ToBoolean(targetUser.InvokeGet("IsAccountLocked")))
        {
            targetUser.InvokeSet("IsAccountLocked", false);
            targetUser.CommitChanges();
            unlockPerformed = true;
        }
        else
        {
            unlockPerformed = false;
        }
    }
}

这段代码在我上传之前完美无缺,任何建议都非常感谢,我会对此进行监控,以便尽快得到解决方案。 提前谢谢。

更新:修复问题

根据这篇文章显然,从托管计算机运行而不是从远程计算机运行的程序实际上是一个非常明显的症状:http://msdn.microsoft.com/en-us/library/vstudio/ms730088(v=vs.100).aspx。 根据那篇文章,问题是模仿设置被设置为模仿导致这种行为,我想要DELEGATION。为了做到这一点,我使用了this页面来获取有关委派和模仿的不同方法的信息,我暂时使用了"冒充原始来电者"部分。

在web.config文件中:

 <identity impersonate="false"/>

如果将其设置为false,则会尝试模拟用户的每个操作,这可能会导致我遇到的问题,而不是我想要实现的问题。

在代码中:

using System.Security.Principal;
...
// Obtain the authenticated user's Identity
WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;
WindowsImpersonationContext ctx = null;
try
{
  // Start impersonating
  ctx = winId.Impersonate();
  // Now impersonating
  // Access resources using the identity of the authenticated user
}
// Prevent exceptions from propagating
catch
{
}
finally
{
  // Revert impersonation
  if (ctx != null)
    ctx.Undo();
}
// Back to running under the default ASP.NET process identity

这个解决方案相当容易,但它几乎不可能找到关于这个主题的明确信息,我希望有一天会发现这个有用,我不能成为唯一遇到这些问题的人。

1 个答案:

答案 0 :(得分:1)

根据这篇文章显然,从托管计算机运行而不是从远程计算机运行的程序实际上是一个非常明显的症状:http://msdn.microsoft.com/en-us/library/vstudio/ms730088(v=vs.100).aspx。根据那篇文章,问题是模仿设置被设置为模仿导致这种行为,我想要DELEGATION。为了做到这一点,我使用此页面获取有关委派和模拟的不同方法的信息,我使用了“暂时模仿原始来电者”部分。

在web.config文件中:

<identity impersonate="false"/>

如果将其设置为false,则会尝试模拟用户的每个操作,这可能会导致我遇到的问题,而不是我想要实现的问题。

在代码中:

using System.Security.Principal;
...
// Obtain the authenticated user's Identity
WindowsIdentity winId = (WindowsIdentity)HttpContext.Current.User.Identity;
WindowsImpersonationContext ctx = null;
try
{
  // Start impersonating
  ctx = winId.Impersonate();
  // Now impersonating
  // Access resources using the identity of the authenticated user
}
// Prevent exceptions from propagating
catch
{
}
finally
{
  // Revert impersonation
  if (ctx != null)
    ctx.Undo();
}
// Back to running under the default ASP.NET process identity

这个修复相当容易,但是这个主题几乎不可能找到关于这个主题的明确信息,我希望有一天会发现这个有用,我不可能是唯一遇到这些问题的人。