我正在使用带有 C# 的 ASP.net,并且对 Active Directory 知之甚少。我的任务是按以下步骤编写程序:
给 ASP.net 应用程序一个用户的用户名。
应用程序应该使用给定的用户名查询用户的所有组。
然后,应用程序应在两个单独的列表中显示这些组,其中一个包含通讯组,另一个列表中包含其余组。
现在,查询所有组很容易。但是如何检查该组是否在通讯组中?
我没有得到更多信息。
任何属性或我可以检查的东西?
我正在使用带有 C# 的 ASP.net,并且对 Active Directory 知之甚少。我的任务是按以下步骤编写程序:
给 ASP.net 应用程序一个用户的用户名。
应用程序应该使用给定的用户名查询用户的所有组。
然后,应用程序应在两个单独的列表中显示这些组,其中一个包含通讯组,另一个列表中包含其余组。
现在,查询所有组很容易。但是如何检查该组是否在通讯组中?
我没有得到更多信息。
任何属性或我可以检查的东西?
您可以从名为Groupe-Type(最后一行)的属性中检索此信息。
(0x00000001) : Specifies a group that is created by the system.
(0x00000002) : Specifies a group with global scope.
(0x00000004) : Specifies a group with domain local scope.
(0x00000008) : Specifies a group with universal scope.
(0x00000010) : Specifies an APP_BASIC group for Windows Server Authorization Manager.
(0x00000020) : Specifies an APP_QUERY group fir Windows Server Authorization Manager.
(0x80000000) :Specifies a security group. If this flag is not set, then the group is a distribution group.
您可以在此答案中或在此另一种不同方法的底部找到用户所属的组。
您可以在此处找到如何检索用户。
由于您使用的是 .NET 3.5 及更高版本,因此您应该查看System.DirectoryServices.AccountManagement
(S.DS.AM) 命名空间。在这里阅读所有相关信息:
基本上,您可以定义域上下文并在 AD 中轻松找到用户和/或组:
// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "SomeUserName");
if(user != null)
{
// get all roles for that user
var roles = user.GetGroups();
// set up two lists for each type of groups
List<GroupPrincipal> securityGroups = new List<GroupPrincipal>();
List<GroupPrincipal> distributionGroups = new List<GroupPrincipal>();
// iterate over groups found
foreach (Principal p in roles)
{
// cast to GroupPrincipal
GroupPrincipal gp = (p as GroupPrincipal);
if (gp != null)
{
// check whether it's a security group or a distribution group
if (gp.IsSecurityGroup)
securityGroups.Add(gp);
else
distributionGroups.Add(gp);
}
}
}
新的 S.DS.AM 使得在 AD 中与用户和组一起玩变得非常容易!
此代码将检索所有启用电子邮件的组,无论它是安全组还是通讯组。(看到您对 marc_s 回答的评论,我猜这实际上是您的经理正在寻找的)。
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
Principal prototype = new GroupPrincipal(ctx);
PrincipalSearcher searcher = new PrincipalSearcher(prototype);
List<string> groupNames = new List<string>();
PropertyValueCollection email;
foreach (var gp in searcher.FindAll()) using (gp)
{
GroupPrincipal group = gp as GroupPrincipal;
using (DirectoryEntry groupEntry = ((DirectoryEntry)group.GetUnderlyingObject())
{
email = groupEntry.Properties["mail"];
if (email.Value != null)
{
groupNames.Add(group.Name);
}
}
}
}