web-dev-qa-db-ja.com

ADDirectoryEntryからDOMAIN \ USERを取得するにはどうすればよいですか?

Active Directory DirectoryEntry(SchemaClassName = "user")オブジェクトからWindowsユーザーとドメインを取得するにはどうすればよいですか?

ユーザー名はsAMAccountNameプロパティにありますが、ドメイン名はどこで検索できますか?

(ユーザーはさまざまなサブドメインから来ているため、固定ドメイン名を想定することはできません。)

15
laktak

CN = Partitions、CN = Configurationにすべてのドメインを含むパーティションコンテナが見つかりました。

ユーザーをパーティションに一致させると、nETBIOSName + "\" + sAMAccountNameプロパティから実際のドメイン名を読み取ることができます。

3
laktak

これは、resultsがDirectorySearcherから取得したSearchResultCollectionであることを前提としていますが、DirectoryEntryからオブジェクトIDを直接取得できるはずです。

SearchResult result = results[0];
var propertyValues = result.Properties["objectsid"];
var objectsid = (byte[])propertyValues[0];

var sid = new SecurityIdentifier(objectsid, 0);

var account = sid.Translate(typeof(NTAccount));
account.ToString(); // This give the DOMAIN\User format for the account
26
lintmachine

DirectoryEntryドメイン名を取得するには、directoryEntry.Parentで再帰を使用できます。そして、directoryEntry.SchemaClassName == "domainDNS"の場合、次のようなドメイン名を取得できます。

directoryEntry.Properties["Name"].Value
7
tchimev

残念ながら、DirectoryEntryで探しているものが見つかりません。

sAMAccountNameがあります。これは通常、myuser(ドメインなし)のようなものです。 LDAP://cn=joe myuser,cn=Users,dc=yourCompany,dc=comのようなdistinguishedNameがあります。 userPrincipalNameもありますが、これは通常、[email protected]の形式の名前です。

ただし、残念ながら、domain\MyUserを含む属性は見つかりません。ドメイン名に関する情報とDirectoryEntryのsAMAccountNameからそれをまとめる必要があります。

System.DirectoryServicesのすべてのLDAPおよびWinNTプロパティに関する詳細といくつかの優れたExcelシートについては、ADSI MVP Richard Muellerによる Hilltop Lab Webサイトを確認してください。

マーク

7
marc_s
public static string GetDomainNameUserNameFromUPN(string strUPN)
{

    try
    {
        WindowsIdentity wi = new WindowsIdentity(strUPN);
        WindowsPrincipal wp = new WindowsPrincipal(wi);

       return wp.Identity.Name;



    }
    catch (Exception ex)
    {

    }

    return "";
}
4
WWC

System.DirectoryServices ライブラリを使用している場合は、DirectorySearcherからのSearchResultsCollectionが必要です。

各SearchResultのPropertiesコレクション内には、「distinguishedname」プロパティがあります。これには、ディレクトリエントリが属するドメインを構成するすべてのDC部分が含まれます。

2
joshua.ewer

私は自分で使用するためにこのコードを書きました(VB.netでは簡単に翻訳できます):

 <System.Runtime.CompilerServices.Extension()>
Public Function GetDomainFQDN(ByVal Entry As DirectoryServices.DirectoryEntry) As String

    Try

        While Entry.SchemaClassName <> "domainDNS"
            Entry = Entry.Parent
        End While

        Dim DN As String = Entry.Properties("DistinguishedName").Value
        Return DN.Replace("DC=", "").Replace(",", ".")

    Catch ex As Exception
        Debug.WriteLine(ex.ToString)
        Return String.Empty
    End Try

End Function

<System.Runtime.CompilerServices.Extension()>
Public Function GetDomainNetbiosName(ByVal Entry As DirectoryServices.DirectoryEntry) As String

    Try

        While Entry.SchemaClassName <> "domainDNS"
            Entry = Entry.Parent
        End While

        Return Entry.Properties("Name").Value

    Catch ex As Exception
        Debug.WriteLine(ex.ToString)
        Return String.Empty
    End Try

End Function
0
Epervier 666

@laktakによる以前の回答を拡張して、彼の意味の詳細を提供します。

CN=Partitions,CN=Configurationには、Netbiosドメイン名であるcnと、ユーザーがこのドメインにいる場合にユーザーが持つnCNameプレフィックスを含むdistinguishedNameプロパティを提供するすべてのドメインを含むパーティションコンテナがあります。

したがって、LDAPで(objectClass=*)CN=Partitions,CN=Configurationを検索し、各結果の(cnnCName)ペアをマップに保存することから始めます。

次に、(sAMAccountName=USERIDHERE)を使用してldapにクエリを実行し、ユーザーからdistinguishedNameを取得します。次に、(cnnCName)ペアを調べて、ユーザーからnCNameの前に付けられたdistinguishedNameを見つけます。対応するcnは目的のドメイン名です。

0