.net

2011-02-04 14 views
8

Aşağıdaki kod grubunda bana kullanıcıları alır aracılığıyla Active Directory Grubunda kullanıcı adları almak ama ben sadece ad ve soyadı dönmek istiyorum "CN=johnson\,Tom,OU=Users,OU=Main,DC=company,DC=com".net

döndürülür. Bunu nasıl başarabilirim? İstediğiniz bir Principal sahip olana kadar group.Members özelliği üzerinden

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

Arama:

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

aşağıdaki gerçekten değil bir cevap, sadece bir uyarı: C# diline çevirmek yeterince kolay olmalı ([DirectorySearcher.FindAll] aramasını http mesela senin DirectoryEntry, DirectorySearcher ve özellikle herhangi SearchResultCollections (wrap : //msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx)) bir kullanma deyiminde veya bir/son olarak bir Dispose çağrısı ile deneyin. SearchResultCollections toplanan çöp olamaz. İnterneti bir şey atmadığı bir örneği kullandıktan sonra günlerce bir bellek sızıntısı aldım. Active Directory'de arama yapma ile ilgili hangi sınıfları görmek için MS belgelerini iyice kontrol edin –

cevap

22

Ben System.DirectoryServices.AccountManagement sınıfları kullanmayı tercih ediyoruz. Kodunuzu, verilenAd (ilk isim) ve sn özellikler çalışması gerekir (soyadı) kullanarak

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

** Projenize ** System.DirectoryServices.AccountManagement ** 'ya bir başvuru eklemeniz gerekir. – bigtlb

+1

Harika cevap! Teşekkürler – Eric

2

: Sonra böyle adını ayıklamak. Eğer System.DirectoryServices.AccountManagement ad UserPrincipal kullanırsanız

(@ russell-mcclure önerildiği gibi), ayrıca GivenName ve Soyadı özelliklerini bulacaksınız.

Güvenilir bir ormanı geçmeniz gerekmediği ve kullanıcıyı bulmak için genel kataloğa ihtiyaç duymadığınız sürece AccountManagement çok kullanışlıdır.

+0

Bahis o da ınsageToLoad http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.propertiestoload.aspx –

+0

ayarlamak gerekir. Benim kod içinde bir Windows Server 2008 DC altında. Net 4.0 , Ben includeName ve sn dahil olmak üzere benim DirectorySearcher benim PropertySearcher içinde değiştirmeden 24 varsayılan özellikleri alıyorum ... – bigtlb

+0

Benim adminyservices ad alanı içinde mevcut olmadığından, accountmanagement kullanmak için görünmüyor. – Eric

0

Bu, AccountManagement sınıflarını kullanmadan yapmak için yaptığım bir PowerShell betiğidir.

[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"]; 
    } 
}