使用System.DirectoryServices.AccountManagement时的DirectoryServicesCOMException

时间:2010-05-25 12:44:28

标签: c# sharepoint-2007 c#-3.0 account-management

我正在尝试使用System.DirectoryServices.AccountManagment确定用户是否是给定组的成员。

  • 我在64位系统上的SharePoint 2007中的SharePoint WebPart中执行此操作。
  • 项目目标是.NET 3.5
  • 在web.config中启用了模拟。
  • 有问题的IIS网站正在使用IIS应用程序池,并将域用户配置为标识。

我可以实例化PrincipalContext

PrincipalContext pc = new PrincipalContext(ContextType.Domain)

接下来,我试着抓住校长:

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
{
   GroupPrincipal group = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\somegroup");
   // snip: exception thrown by line above.
}

以上和UserPrincipal.FindByIdentity用户SAM都会抛出DirectoryServicesCOMException:“登录失败:未知用户名或密码错误”

我尝试将完整的SAMAccountName传递给FindByIdentity(以MYDOMAIN \用户名的形式)或只是用户名而行为没有变化。我尝试使用HostingEnvironment.ImpersonateSPSecurity.RunWithElevatedPrivileges方法使用其他凭据执行代码,并且也会遇到相同的结果。

我还尝试使用域名实例化我的上下文:

Principal Context pc = new PrincipalContext(ContextType.Domain, "MYDOMAIN");

这会抛出PrincipalServerDownException:“无法联系到服务器。”

我正在研究一台合理硬化的服务器。我没有锁定系统,所以我不确定它到底做了什么。如果我需要为我的池标识用户或域安全策略分配凭据以使这些凭据有效,我可以相应地配置域。是否有任何设置会阻止我的代码运行?我在代码本身中遗漏了什么吗?这在SharePoint网站中是不可能的吗?

编辑: 在进一步测试的情况下,我的代码在面向.NET 4.0的控制台应用程序中进我针对不同的框架,因为在出​​于某种原因针对.NET 3.5时,我在控制台应用程序中没有可用的AccountManagement。

using (PrincipalContext pc = new PrincipalContext(ContextType.Domain))
using (UserPrincipal adUser = UserPrincipal.FindByIdentity(pc, "MYDOMAIN\joe.user"))
using (GroupPrincipal adGroup = GroupPrincipal.FindByIdentity(pc, "MYDOMAIN\user group"))
{
   if (adUser.IsMemberOf(adGroup))
   {
       Console.WriteLine("User is a member!");
   }
   else
   {
       Console.WriteLine("User is NOT a member.");
   }
}

我的SharePoint环境中可能会阻止此功能执行的内容有何不同?

1 个答案:

答案 0 :(得分:1)

我将IIS应用程序池使用的帐户添加到Administrators组,此问题已解决。