使用System.DirectoryServices.AccountManagement时的DirectoryServicesCOMException

ant*_*tik 6 c# sharepoint-2007 account-management c#-3.0

我正在尝试使用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.
}
Run Code Online (Sandbox Code Playgroud)

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

我已经尝试将完整的SAMAccountName传递给FindByIdentity(以MYDOMAIN \用户名的形式)或只是用户名而行为没有变化.我已尝试使用其他凭据HostingEnvironment.Impersonate和SPSecurity.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.");
   }
}
Run Code Online (Sandbox Code Playgroud)

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

ant*_*tik 1

我将IIS应用程序池使用的帐户添加到管理员组中,此问题得到解决。

  • 您可能应该注意,这是“正义的铁拳”方法,而不是面向生产或面向互联网的系统的推荐解决方案。 (3认同)
  • @Burly - 好点。这适用于我的环境:断开网络上的内部系统。这不是一个我满意的解决方案,但它是一个解决方案,所以现在就可以了。我真的希望得到一些指导,以了解管理员拥有哪些权限可以使代码正确执行。我很乐意删除该用户的管理员权限,并授予更安全的权限,同时根据需要继续操作。 (2认同)