我正在编写一个独立的应用程序,在给定AD帐户名称的情况下,需要确定用户是否是特定组的成员。我在.NET(C#)中编写应用程序。 AD中的结构如下所示:
仅列出David的成员资格不会表明他是应用程序A组的成员。
我从Microsoft的文档中了解到(使用主体)我可以简单地使用IsInRole调用,但我找不到任何不需要David登录到计算机或运行执行检查的应用程序的情况。我认为我对安全模型的有限理解也在这里发挥作用。
有人可以指出我正确的方向吗?我正在寻找的是如何在C#中解决上述(参考,提示,片段)的提示,而不依赖于David必须运行任何应用程序。
如果有任何事情可以澄清,请告诉我。
答案 0 :(得分:3)
添加对DirectoryServices.AccountManagement的引用
然后添加一个using语句:
using System.DirectoryServices.AccountManagement;
然后在您的主程序中(或在其他地方,如果需要,请调用Procedure IsMember:
string userName = "David";
string GroupName = "Team 1";
bool test = IsMember(userName, GroupName);
public static bool IsMember(string UserName, string GroupName)
{
try
{
UserPrincipal user = UserPrincipal.FindByIdentity(
new PrincipalContext(ContextType.Domain),
UserName);
foreach (Principal result in user.GetAuthorizationGroups())
{
if (string.Compare(result.Name, GroupName, true) == 0)
return true;
}
return false;
}
catch (Exception E)
{
throw E;
}
}
如果David在Team 1中,则该过程将返回true,否则返回false。
答案 1 :(得分:1)
您可以使用UserPrincipal.FindByIdentity
从目录中获取UserPrincipal
对象。这与您可能找到的其他主要对象不完全相同,但它具有IsMemberOf
方法,允许您查询组成员资格。
答案 2 :(得分:0)
我在AD环境中使用它
var pc = new PrincipalContext(ContextType.Domain);
var group = GroupPrincipal.FindByIdentity(pc, "GROUPNAME");
var existsInGroup = group.GetMembers(true).Where(p => p.UserPrincipalName == "username@domain").Any();
如果您不想查看子群组,请将false
传递给GetMembers
。
不要求给定用户必须登录。希望它有所帮助。