c# System.DirectoryServices.AccountManagement未知错误(0x80005000
本文关键字:错误 0x80005000 未知 AccountManagement System DirectoryServices | 更新日期: 2023-09-27 18:14:48
类似以下MSDN线程中的问题:http://social.msdn.microsoft.com/Forums/en-MY/csharplanguage/thread/4c9fea6c-1d0a-4733-a8ac-e3b78d10e999
我正试图验证给定用户是否是一个组的成员,我们现有的功能解决方案太慢(13-16秒),我正试图加快速度。我现在有:
public bool IsMemberAD(string userName, string groupName)
{
var pc = new System.DirectoryServices.AccountManagement.PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Domain);
var user = System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(pc, System.DirectoryServices.AccountManagement.IdentityType.SamAccountName,
userName.ToLower());
var group = System.DirectoryServices.AccountManagement.GroupPrincipal.FindByIdentity(pc, groupName);
if (group == null || user == null) return false;
return user.IsMemberOf(group);
}
有趣的是,只有当用户不直接在组中,而是在目标组内的组的成员时,它才返回错误。
例如:Steve和Sam是两个用户,GroupParent和GroupChild是两个组。Steve和GroupChild是grouparent的成员。Sam是GroupChild的成员。如果我在(Steve, grouparent)上调用这个函数,它将返回true。如果我在(Sam, grouparent)上调用它,就会得到一个错误。如果我调用它on ("fdkjskghkf", grouparent),它返回false。
我链接了上面的一篇文章,有类似的问题,但他的解决方案对我不起作用,我仍然得到同样的错误。想法吗?
感谢Jon Theriault,下面的代码为我解决了这个问题。
string strName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; // "MW''dalem"
// This is here because of a .Net error that gets 0x80005000 on "isUser = user.IsMemberOf(groupU);"
string domainName = strName.Split('''')[0];
var pc = new PrincipalContext(ContextType.Domain, domainName);
我记得当我写类似的代码时,我确实遇到了一些奇怪的问题。我不确定为什么你的电话失败,但你可以改变你的问题,做一些像:
return group.GetMembers(true).Contains(user);
你能不能试试这样做:
public bool IsMemberAD(string userName, string groupName)
{
PrincipalContext context = new PrincipalContext(ContextType.Domain, "WM2008R2ENT:389", "dc=dom,dc=fr", "jpb", "pwd");
/* Retreive the user principal
*/
UserPrincipal user = UserPrincipal.FindByIdentity(context, userName);
if (user == null) return false;
/* Retreive the group principal
*/
GroupPrincipal targetGroup = GroupPrincipal.FindByIdentity(context, groupName);
if (targetGroup == null) return false;
/* Look for all the groups a user belongs to
*/
PrincipalSearchResult<Principal> allGroups = user.GetAuthorizationGroups();
var grp = (from g in allGroups
where g.Sid == targetGroup.Sid
select g).FirstOrDefault();
return (!(grp == null));
}
如果有人感兴趣。使用下列过滤器的DirectorySearcher大约快60%。
string filter = string. format ("(&(distinguishedName={1})(memberof:1.2.840.113556.1.4.1941:={0}) ", dnOfUser, dnOfGroup);
过滤器将向上遍历,而不仅仅是用户的父级。
GetAuthorizationGroups()找不到嵌套组。
要真正获得给定用户是包含嵌套组的成员的所有组,请执行以下命令:
using System.Security.Principal
private List<string> GetGroups(string userName)
{
List<string> result = new List<string>();
WindowsIdentity wi = new WindowsIdentity(userName);
foreach (IdentityReference group in wi.Groups)
{
try
{
result.Add(group.Translate(typeof(NTAccount)).ToString());
}
catch (Exception ex) { }
}
result.Sort();
return result;
}
使用Try/Catch,因为我在一个非常大的AD(50万个对象)中有一些异常,200个组中有2个,因为我的一些SID(翻译做SID ->名称转换)不再可用。在我们庞大的广告中,只需要<1秒。