ant*_*tik 6 c# sharepoint-2007 account-management c#-3.0
我正在尝试使用System.DirectoryServices.AccountManagment确定用户是否是给定组的成员.
我可以实例化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环境中可能会禁止此功能执行的内容有何不同?
我将IIS应用程序池使用的帐户添加到管理员组中,此问题得到解决。