Active Directory DirectoryEntry(SchemaClassName = "user")オブジェクトからWindowsユーザーとドメインを取得するにはどうすればよいですか?
ユーザー名はsAMAccountNameプロパティにありますが、ドメイン名はどこで検索できますか?
(ユーザーはさまざまなサブドメインから来ているため、固定ドメイン名を想定することはできません。)
CN = Partitions、CN = Configurationにすべてのドメインを含むパーティションコンテナが見つかりました。
ユーザーをパーティションに一致させると、nETBIOSName + "\" + sAMAccountNameプロパティから実際のドメイン名を読み取ることができます。
これは、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
DirectoryEntryドメイン名を取得するには、directoryEntry.Parent
で再帰を使用できます。そして、directoryEntry.SchemaClassName == "domainDNS"
の場合、次のようなドメイン名を取得できます。
directoryEntry.Properties["Name"].Value
残念ながら、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サイトを確認してください。
マーク
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 "";
}
System.DirectoryServices ライブラリを使用している場合は、DirectorySearcherからのSearchResultsCollectionが必要です。
各SearchResultのPropertiesコレクション内には、「distinguishedname」プロパティがあります。これには、ディレクトリエントリが属するドメインを構成するすべてのDC部分が含まれます。
私は自分で使用するためにこのコードを書きました(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
@laktakによる以前の回答を拡張して、彼の意味の詳細を提供します。
CN=Partitions,CN=Configuration
には、Netbiosドメイン名であるcn
と、ユーザーがこのドメインにいる場合にユーザーが持つnCName
プレフィックスを含むdistinguishedName
プロパティを提供するすべてのドメインを含むパーティションコンテナがあります。
したがって、LDAPで(objectClass=*)
のCN=Partitions,CN=Configuration
を検索し、各結果の(cn
、nCName
)ペアをマップに保存することから始めます。
次に、(sAMAccountName=USERIDHERE)
を使用してldapにクエリを実行し、ユーザーからdistinguishedName
を取得します。次に、(cn
、nCName
)ペアを調べて、ユーザーからnCName
の前に付けられたdistinguishedName
を見つけます。対応するcn
は目的のドメイン名です。