Hen*_*yer 7 c# active-directory
我回到我的Active Directory工具......
我试图在用户的"成员"属性中列出组.以下是我使用的功能:
public static DataTable ListGroupsByUser(string selectedOu)
{
DataTable groupListByUser = new DataTable();
String dom = "OU=" + selectedOu + ",OU=XXX,DC=XXX,DCXXX,DC=XXX,DC=XXX";
DirectoryEntry directoryObject = new DirectoryEntry("LDAP://" + dom);
DataColumn column;
DataRow row;
column = new DataColumn();
column.ColumnName = "ID";
groupListByUser.Columns.Add(column);
column = new DataColumn();
column.ColumnName = "User";
groupListByUser.Columns.Add(column);
column = new DataColumn();
column.ColumnName = "Groups";
groupListByUser.Columns.Add(column);
int i = 1;
foreach (DirectoryEntry child in directoryObject.Children)
{
row = groupListByUser.NewRow();
groupListByUser.Rows.Add(row);
row["ID"] = i++;
if (child.Properties["memberOf"].Value != null)
{
row["User"] = child.Properties["sAMAccountName"].Value.ToString();
row["Groups"] = child.Properties["memberOf"].Value.ToString();
}
else
{
row["Groups"] = "blabla";
}
}
return groupListByUser;
}
Run Code Online (Sandbox Code Playgroud)
它为仅属于一个组的用户返回正确的组.只要有多个组,它就会返回System.Object [].
如何查看所有群组?
问题是你的Properties["memberOf"].Value.ToString().
我做了一点调查,这段代码对我有用:
var memberGroups = child.Properties["memberOf"].Value;
if (memberGroups.GetType() == typeof(string))
{
row["Groups"] = (String)memberGroups;
}
else if (memberGroups.GetType().IsArray)
{
var memberGroupsEnumerable = memberGroups as IEnumerable;
if (memberGroupsEnumerable != null)
{
var asStringEnumerable = memberGroupsEnumerable.OfType<object>().Select(obj => obj.ToString());
row["Groups"] = String.Join(", ", asStringEnumerable);
}
}
else
{
row["Groups"] = "No group found.";
}
Run Code Online (Sandbox Code Playgroud)
它不是很可爱,但它起作用,并为进一步改进提供了空间.;-)
如果您使用的是 .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)
{
var groups = user.GetGroups();
// or there's also:
//var authGroups = userByEmail.GetAuthorizationGroups()
}
Run Code Online (Sandbox Code Playgroud)
GetGroups()对or的调用也GetAuthorizationGroups() 将返回嵌套组成员资格 - 因此您不再需要寻找这些嵌套成员资格!
新的 S.DS.AM 使 AD 中的用户和组的使用变得非常容易!