无法获取用户的域成员组列表
Unable to get the list of domain member group for the user
我正在使用下面的 C# 代码来检查用户是否属于所需的域成员组。
传递的用户名是 3 个成员组的一部分,但代码返回第一个域组成员名称并退出 for 循环。请帮助我获取用户的域组的完整列表。
bool bReturn = false;
string sDomainName = System.Environment.UserDomainName;
using (PrincipalContext oContext = new PrincipalContext(ContextType.Domain, sDomainName))
{
if (oContext.ValidateCredentials(sUserName, sPassword))
{
using (PrincipalSearcher oSearcher = new PrincipalSearcher(new UserPrincipal(oContext)))
{
oSearcher.QueryFilter.SamAccountName = sUserName;
Principal oPrincipal = oSearcher.FindOne();
foreach (Principal oPrin in oPrincipal.GetGroups())
{
if (oPrin.Name.Trim().ToString().Equals(sGroupName))
{
bReturn = true;
break;
}
}
}
}
如果我弄错了请告诉我。
我只能看到一个目的,return bool?
顺便说一句,即使不是这种情况,请尝试删除 break;
bool bReturn = false;
string sDomainName = System.Environment.UserDomainName;
using (PrincipalContext oContext = new PrincipalContext(ContextType.Domain, sDomainName))
{
if (oContext.ValidateCredentials(sUserName, sPassword))
{
using (PrincipalSearcher oSearcher = new PrincipalSearcher(new UserPrincipal(oContext)))
{
oSearcher.QueryFilter.SamAccountName = sUserName;
Principal oPrincipal = oSearcher.FindOne();
foreach (Principal oPrin in oPrincipal.GetGroups())
{
if (oPrin.Name.Trim().ToString().Equals(sGroupName))
{
//your stuff here (assign vars, values etc)
bReturn = true; // <--
}
}
}
}
因为根据您使用的逻辑,如果它满足一个条件,它将停止循环。
使用 IsMemberOf
方法代替循环:
bReturn = oPrincipal.IsMemberOf(oContext, IdentityType.Name, sGroupName);
这 可能 适合你。但请记住,只有当该组列在用户的 memberOf
属性中时,此方法(以及您的循环方法)才会起作用。如果:
- 您的 AD 林中有多个域,并且
- 您正在使用的组是全球或本地域,并且
- 该组与用户不在同一个域中
那就不行了
我在我的网站上写的一篇文章中谈到了这一点:Find out if one user is a member of a group
由于权限问题,C# 代码无法获取 AD 成员详细信息。
我已经使用 net group "<GroupName>"
获取作为组一部分的用户列表,然后在列表中检查所需的用户。
验证用户是否为所需组的成员是另一种选择。
我正在使用下面的 C# 代码来检查用户是否属于所需的域成员组。
传递的用户名是 3 个成员组的一部分,但代码返回第一个域组成员名称并退出 for 循环。请帮助我获取用户的域组的完整列表。
bool bReturn = false;
string sDomainName = System.Environment.UserDomainName;
using (PrincipalContext oContext = new PrincipalContext(ContextType.Domain, sDomainName))
{
if (oContext.ValidateCredentials(sUserName, sPassword))
{
using (PrincipalSearcher oSearcher = new PrincipalSearcher(new UserPrincipal(oContext)))
{
oSearcher.QueryFilter.SamAccountName = sUserName;
Principal oPrincipal = oSearcher.FindOne();
foreach (Principal oPrin in oPrincipal.GetGroups())
{
if (oPrin.Name.Trim().ToString().Equals(sGroupName))
{
bReturn = true;
break;
}
}
}
}
如果我弄错了请告诉我。
我只能看到一个目的,return bool?
顺便说一句,即使不是这种情况,请尝试删除 break;
bool bReturn = false;
string sDomainName = System.Environment.UserDomainName;
using (PrincipalContext oContext = new PrincipalContext(ContextType.Domain, sDomainName))
{
if (oContext.ValidateCredentials(sUserName, sPassword))
{
using (PrincipalSearcher oSearcher = new PrincipalSearcher(new UserPrincipal(oContext)))
{
oSearcher.QueryFilter.SamAccountName = sUserName;
Principal oPrincipal = oSearcher.FindOne();
foreach (Principal oPrin in oPrincipal.GetGroups())
{
if (oPrin.Name.Trim().ToString().Equals(sGroupName))
{
//your stuff here (assign vars, values etc)
bReturn = true; // <--
}
}
}
}
因为根据您使用的逻辑,如果它满足一个条件,它将停止循环。
使用 IsMemberOf
方法代替循环:
bReturn = oPrincipal.IsMemberOf(oContext, IdentityType.Name, sGroupName);
这 可能 适合你。但请记住,只有当该组列在用户的 memberOf
属性中时,此方法(以及您的循环方法)才会起作用。如果:
- 您的 AD 林中有多个域,并且
- 您正在使用的组是全球或本地域,并且
- 该组与用户不在同一个域中
那就不行了
我在我的网站上写的一篇文章中谈到了这一点:Find out if one user is a member of a group
由于权限问题,C# 代码无法获取 AD 成员详细信息。
我已经使用 net group "<GroupName>"
获取作为组一部分的用户列表,然后在列表中检查所需的用户。
验证用户是否为所需组的成员是另一种选择。