У меня есть Active Directory с доменом myDomain.local
, под ним существует Distribution Group
, который содержит много групп.
Как я могу прочитать (программно) все эти подгруппы, чтобы получить список их имен?
И как оптимизировать запрос, чтобы отфильтровать результат, чтобы он просто извлекал все группы, которые заканчиваются на слово Region
?
Кстати, я использую C#.Net, ASP.Net и sharepoint, и я м не сталкивался с AD.
Чтение/фильтрация подгрупп группы рассылки активного каталога?
Ответы (2)
Если вы используете .NET 3.5 (или можете перейти на нее), вы можете использовать этот код, используя пространство имен System.DirectoryServices.AccountManagement
:
// create the "context" in which to operate - your domain here,
// as the old-style NetBIOS domain, and the container where to operate in
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", "cn=Distribution Group,dc=YourDomain,dc=local");
// define a "prototype" - an example of what you're searching for
// Here: just a simple GroupPrincipal - you want all groups
GroupPrincipal prototype = new GroupPrincipal(ctx);
// define a PrincipalSearcher to find those principals that match your prototype
PrincipalSearcher searcher = new PrincipalSearcher(prototype);
// define a list of strings to hold the group names
List<string> groupNames = new List<string>();
// iterate over the result of the .FindAll() call
foreach(var gp in searcher.FindAll())
{
// cast result to GroupPrincipal
GroupPrincipal group = gp as GroupPrincipal;
// if everything - grab the group's name and put it into the list
if(group != null)
{
groupNames.Add(group.Name);
}
}
Удовлетворяет ли это ваши потребности?
Дополнительные сведения о пространстве имен System.DirectoryServices.AccountManagement
см. в документе Управление принципами безопасности каталогов в .NET. Статья о Framework 3.5 в журнале MSDN.
person
marc_s
schedule
01.07.2010
Спасибо, Марк, я еще не пробовал ваш код, но в любом случае я опубликую решение, которое я сделал, для тех, кто интересуется этой темой. Большое спасибо.
- person Ashraf Bashir; 02.07.2010
Вот решение, которое я сделал; для интересующихся:
public ArrayList getGroups()
{
// ACTIVE DIRECTORY AUTHENTICATION DATA
string ADDomain = "myDomain.local";
string ADBranchsOU = "Distribution Group";
string ADUser = "Admin";
string ADPassword = "password";
// CREATE ACTIVE DIRECTORY ENTRY
DirectoryEntry ADRoot
= new DirectoryEntry("LDAP://OU=" + ADBranchsOU
+ "," + getADDomainDCs(ADDomain),
ADUser,
ADPassword);
// CREATE ACTIVE DIRECTORY SEARCHER
DirectorySearcher searcher = new DirectorySearcher(ADRoot);
searcher.Filter = "(&(objectClass=group)(cn=* Region))";
SearchResultCollection searchResults = searcher.FindAll();
// ADDING ACTIVE DIRECTORY GROUPS TO LIST
ArrayList list = new ArrayList();
foreach (SearchResult result in searchResults)
{
string groupName = result.GetDirectoryEntry().Name.Trim().Substring(3);
list.Add(groupName);
}
return list;
}
public string getADDomainDCs(string ADDomain)
{
return (!String.IsNullOrEmpty(ADDomain))
? "DC=" + ADDomain.Replace(".", ",DC=")
: ADDomain;
}
person
Ashraf Bashir
schedule
03.07.2010