web-dev-qa-db-ja.com

.netを介してActiveDirectoryグループのユーザー名を取得する

以下のコードは、グループ内のユーザーを取得しますが、返されます"CN=johnson\,Tom,OU=Users,OU=Main,DC=company,DC=com"

姓名だけを返したいのですが。どうすればこれを達成できますか?

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());
    }
}
13
Eric

System.DirectoryServices.AccountManagementのクラスを使用することをお勧めします。

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

必要なPrincipalが得られるまで、group.Membersプロパティを検索します。次に、次のように名前を抽出します。

foreach (Principal principal in group.Members)
{
   string name = principal.Name;
}
34
Russell McClure

コードを使用して、givenName)およびsn)プロパティは機能するはずです。

System.DIrectoryServices.AccountManagement名前空間UserPrincipalを使用する場合(@ russell-mcclureが提案するように)、GivenNameおよびSurnameプロパティもあります。

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

2
bigtlb

これは、AccountManagementクラスを使用せずに作成したPowerShellスクリプトです。それを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"];
    }
}
0
Vinicius