.NET

2011-02-04 9 views
8

以下のコードは、グループ内の私のユーザーを取得経由でActive Directoryグループにユーザー名を取得しますが、それは私は最初と最後の名前を返すようにしたい"CN=johnson\,Tom,OU=Users,OU=Main,DC=company,DC=com".NET

が返されます。どうすればこれを達成できますか?あなたが欲しい校長を持つまでgroup.Membersプロパティを通じて

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

検索:

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

次は実際に答え、単なる警告ではありません://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.findall.aspx))を使用するか、Dispose呼び出しを使用してtry/finallyを呼び出します。 SearchResultCollectionsはガベージコレクションできません。私は何かを廃棄しなかったオンラインで見つかった例を使用した後、数日間メモリリークを捜した。 Active Directoryの検索に含まれるクラスを確認するには、MSのドキュメントを完全にチェックしてください。 –

答えて

22

私はSystem.DirectoryServices.AccountManagementのクラスを使用して好みます。あなたのコード、givenName属性最初の名前)とSNプロパティ動作するはずです(が姓)を使用して

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

** System.DirectoryServices.AccountManagement **への参照をプロジェクトに追加する必要があります。 – bigtlb

+1

偉大な答え!ありがとう – Eric

2

:次に、このような名前を抽出します。

(@ラッセル・マクルーアが示唆されているように)あなたがSystem.DIrectoryServices.AccountManagement名前空間のUserPrincipalを使用する場合は、GIVENNAME性質があります。

信頼できるフォレストを通過する必要があり、グローバルカタログが必要なユーザーを見つける必要がない限り、AccountManagementは非常に便利です。

+0

私は彼がまた、PropertiesToLoad http://msdn.microsoft.com/en-us/library/system.directoryservices.directorysearcher.propertiestoload.aspxを設定する必要があることを賭ける –

+0

私のコードでは、Windows Server 2008のDCの下で打つ。ネット4.0私はgivenNameとsnを含む、DirectorySearcherのPropertiesToLoadを変更せずに24のデフォルトプロパティを取得しています。 – bigtlb

+0

私のdirectoryservices名前空間に存在しないため、accountmanagementを使用できないようです。 – Eric

0

これはAccountManagementクラスを使用せずに行うためのPowerShellスクリプトです。 C#にそれを翻訳するのに十分な簡単なはず:あなたのDirectoryEntry、たDirectorySearcherと(HTTP [DirectorySearcher.FindAll]呼び出すことから、特に任意のSearchResultCollections(例えばラップ:

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