我正在尝试使用 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.
}
以上内容和用户 SAM 的 UserPrincipal.FindByIdentity
都会抛出 DirectoryServicesCOMException
:“登录失败:未知用户名或错误密码”
我尝试将完整的 SAMAccountName 传递给 FindByIdentity
(以 MYDOMAIN\username 的形式)或仅传递用户名,但行为没有任何变化。我尝试使用 HostingEnvironment.Impersonate
和 SPSecurity.RunWithElevatedPrivileges
方法使用其他凭据执行代码,也遇到了相同的结果。
我还尝试用适当的域名实例化我的上下文:
主体上下文 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 环境中有什么变化可能会禁止执行此功能?
最佳答案
我将 IIS 应用程序池使用的帐户添加到管理员组,此问题已解决。
关于c# - 使用 System.DirectoryServices.AccountManagement 时出现 DirectoryServicesCOMException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2904656/