我正在查看DirectoryServices
名稱空間,我試圖獲取AD中所有組的列表並將它們加載到列表框中。如何查詢所有組和組成員的Active Directory?
當我選擇一個組時,我希望它填充一個帶有管理員姓名的文本框以及另一個包含所有用戶分配給該組的列表框。我很難在這個過程中纏繞我的頭腦。有人可以幫我嗎?
如果我得到一個完整的例子,我相當肯定,我會更好地理解更大的圖景。 TIA
我正在查看DirectoryServices
名稱空間,我試圖獲取AD中所有組的列表並將它們加載到列表框中。如何查詢所有組和組成員的Active Directory?
當我選擇一個組時,我希望它填充一個帶有管理員姓名的文本框以及另一個包含所有用戶分配給該組的列表框。我很難在這個過程中纏繞我的頭腦。有人可以幫我嗎?
如果我得到一個完整的例子,我相當肯定,我會更好地理解更大的圖景。 TIA
如果你在.NET 3.5或更高版本上運行,你可以使用一個PrincipalSearcher
和「查詢通過例如」主要做你的搜索:如果您尚未
// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
// define a "query-by-example" principal - here, we search for a GroupPrincipal
GroupPrincipal qbeGroup = new GroupPrincipal(ctx);
// create your principal searcher passing in the QBE principal
PrincipalSearcher srch = new PrincipalSearcher(qbeGroup);
// find all matches
foreach(var found in srch.FindAll())
{
GroupPrincipal foundGroup = found as GroupPrincipal;
if(foundGroup != null)
{
// do whatever you need to do, e.g. put name into a list of strings or something
}
}
- 絕對看MSDN文章Managing Directory Security Principals in the .NET Framework 3.5這很好地說明如何使新功能的最佳使用System.DirectoryServices.AccountManagement
當你有一定的團體,你可以很容易地通過使用獲得其所有組成員:
// find the group in question (or load it from e.g. your list)
GroupPrincipal group = GroupPrincipal.FindByIdentity(ctx, "YourGroupNameHere");
// if found....
if (group != null)
{
// iterate over members
foreach (Principal p in group.GetMembers())
{
Console.WriteLine("{0}: {1}", p.StructuralObjectClass, p.DisplayName);
// do whatever you need to do to those members
}
}
我想出了類似的使用System.DirectoryServices.AccountManagement
命名空間marc_s東西:
PrincipalContext context = new PrincipalContext(ContextType.Domain);
GroupPrincipal queryPrincipal = new GroupPrincipal(context);
using (PrincipalSearcher searcher = new PrincipalSearcher(queryPrincipal))
using (PrincipalSearchResult<Principal> allPrincipals = searcher.FindAll())
foreach (GroupPrincipal groupPrincipal in allPrincipals.OfType<GroupPrincipal>())
{
// Process group...
foreach (UserPrincipal userPrincipal in groupPrincipal.Members.OfType<UserPrincipal>())
{
// Process group member...
}
}
的UserPrincipal
class似乎並沒有暴露,將允許您確定用戶是否和/或擁有校董的成員,但你仍然可以做到這一點通過獲取DirectoryEntry
用戶:
DirectoryEntry userEntry = userPrincipal.GetUnderlyingObject() as DirectoryEntry;
if (userEntry != null)
{
bool isManager = userEntry.Properties["directReports"].Count > 0;
bool isManaged = userEntry.Properties["manager"].Count > 0;
// Perform further processing...
}
你需要一些額外的邏輯,不過,以確定用戶是否是公司的經理,你目前正在觀察,而比其他一些組織。也許檢查directReports
屬性以查看包含在其中的任何用戶是否是當前組的成員。
您是否瀏覽過該參考資料:http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C# – Dan 2012-02-28 18:24:31
是的,但我並不完全確定哪個那些適用於我或如何將它們應用於我的目標 – Sinaesthetic 2012-02-28 19:02:23