2011-02-04 46 views
8

Mã dưới đây được cho tôi những thành viên trong nhóm nhưng nó được trả về "CN=johnson\,Tom,OU=Users,OU=Main,DC=company,DC=com"lấy tên người dùng trong Active Directory Group qua .net

Tôi muốn chỉ trả lại và Tên cuối. Làm thế nào tôi có thể thực hiện điều này?

DirectoryEntry ou = new DirectoryEntry(); 
DirectorySearcher src = new DirectorySearcher(); 

src.Filter = ("(&(objectClass=group)(CN=Gname))"); 
SearchResult res = src.FindOne(); 
if (res != null) 
{ 
    DirectoryEntry deGroup = new DirectoryEntry(res.Path); 
    PropertyCollection pcoll = deGroup.Properties; 

    foreach (object obj in deGroup.Properties["member"]) 
    { 
      ListBox1.Items.Add(obj.ToString()); 
    } 
} 
+0

Sau đây không thực sự là câu trả lời, chỉ cần cảnh báo: bọc DirectoryEntry, DirectorySearcher và đặc biệt là bất kỳ SearchResultCollections nào (ví dụ: từ gọi [DirectorySearcher.FindAll] (http : //msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx)) trong một tuyên bố sử dụng, hoặc một thử/cuối cùng với một cuộc gọi Dispose. SearchResultCollections không thể được thu thập rác. Tôi săn lùng một rò rỉ bộ nhớ trong nhiều ngày sau khi sử dụng một ví dụ tôi tìm thấy trực tuyến mà không vứt bỏ bất cứ điều gì. Kiểm tra tài liệu MS kỹ lưỡng để xem những lớp nào liên quan đến việc tìm kiếm Active Directory hav –

Trả lời

22

Tôi thích sử dụng các lớp trong System.DirectoryServices.AccountManagement:

PrincipalContext principalContext = new PrincipalContext(ContextType.Domain); 
GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, "GName"); 

Tìm kiếm thông qua các tài sản group.Members đến khi bạn có một Principal mà bạn muốn. Sau đó trích xuất các tên như thế này:

foreach (Principal principal in group.Members) 
{ 
    string name = principal.Name; 
} 
+4

Bạn cần thêm một tham chiếu đến ** System.DirectoryServices.AccountManagement ** dự án của bạn. – bigtlb

+1

Câu trả lời hay! Cảm ơn – Eric

2

Sử dụng mã của bạn, các givenName (đầu tiên tên) và sn (tên cuối cùng) thuộc tính nên làm việc.

Nếu bạn sử dụng không gian tên System.DIrectoryServices.AccountManagement UserPrincipal (như @ russell-McClure gợi ý), bạn sẽ tìm thấy GivenNameHọ tính cũng có.

AccountManagement rất tiện lợi trừ khi bạn phải đi qua một khu rừng đáng tin cậy và cần danh mục chung để tìm người dùng.

+0

Tôi đặt cược anh ta cũng cần đặt PropertiesToLoad http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.propertiestoload.aspx –

+0

Trong mã của tôi nhấn Windows Server 2008 DC trong .Net 4.0 , Tôi nhận được 24 thuộc tính mặc định mà không sửa đổi PropertiesToLoad trong DirectorySearcher của tôi, bao gồm givenName và sn ... – bigtlb

+0

Tôi dường như không thể sử dụng quản lý tài khoản vì nó không tồn tại trong không gian tên directoryservices của tôi. – Eric

0

Đây là tập lệnh PowerShell mà tôi đã thực hiện để làm điều đó mà không cần sử dụng các lớp AccountManagement. Sẽ đủ dễ dàng để dịch nó sang C#:

[void][System.Reflection.Assembly]::LoadWithPartialName("System.DirectoryServices"); 

$groupName = "Grupo Domain"; 

$directoryEntry = New-Object System.DirectoryServices.DirectoryEntry; 
$directorySearcher = New-Object System.DirectoryServices.DirectorySearcher($directoryEntry, "(&(objectClass=group)(CN=$groupName))"); 
[void]$directorySearcher.PropertiesToLoad.Add("objectSid"); 
[void]$directorySearcher.PropertiesToLoad.Add("member"); 
$result = $directorySearcher.FindOne(); 

if ($result -eq $null) { return; } 

# Try get the group members through the "member" property. 
if ($result.Properties["member"].Count -gt 0) { 
    foreach ($member in $result.Properties["member"]) { 
     $memberSearcher = New-Object System.DirectoryServices.DirectorySearcher($directoryEntry, "(&(objectClass=*)(distinguishedName=$member))"); 
     [void]$memberSearcher.PropertiesToLoad.Add("msDS-PrincipalName"); 
     $memberResult = $memberSearcher.FindOne(); 
     if ($memberResult -eq $null) { continue; } 
     Write-Output $memberResult.Properties["msDS-PrincipalName"]; 
    } 
    return; 
} 
if ($result.Properties["objectSid"].Count -gt 0) { 
    # The group might be an AD primary group. Try get the members by the PrimaryGroupID. 
    $groupSid = New-Object System.Security.Principal.SecurityIdentifier($result.Properties["objectSid"][0], 0); 
    # Hacky way to get only the last RID. 
    $primaryGroupSid = $groupSid.Value.Replace($groupSid.AccountDomainSid.ToString(), [String]::Empty).TrimStart('-'); 
    $memberSearcher = New-Object System.DirectoryServices.DirectorySearcher($directoryEntry, "(&(objectClass=*)(primaryGroupId=$primaryGroupSid))"); 
    [void]$memberSearcher.PropertiesToLoad.Add("msDS-PrincipalName"); 
    $memberResult = $memberSearcher.FindAll(); 
    if ($memberResult -eq $null) { continue; } 
    foreach ($member in $memberResult) { 
     Write-Output $member.Properties["msDS-PrincipalName"]; 
    } 
} 
Các vấn đề liên quan