3

職場のWindowsマシンにログインするときは、「CORP\username」を使用します。

ユーザーのSIDとユーザーがログインしたドメインコントローラーを指定して、その文字列を取得するにはどうすればよいですか?次のように、.NET3.5で追加されたDirectoryServicesAPIを使用しています。

PrincipalContext domaincontroller = new PrincipalContext(ContextType.Domain, "192.168.30.115");
UserPrincipal user = UserPrincipal.FindByIdentity(domaincontroller, IdentityType.Sid, "S-1-5-21-293182769-1777760488-2957165303-1798");

私はdomaincontrollerオブジェクトとuserオブジェクトを掘り下げて、次のようなものをたくさん見ました:

user.Name:              john smith
user.DisplayName:       john smith
user.UserPrincipalName: john.smith@corp.mycompany.com
user.SamAccountName:    john.smith

UserPrincipleオブジェクトの私的な内臓を深く掘り下げると、「domainFlatName」と「FlatDomainName」というラベルの付いた2つのフィールドが見つかります。これらのフィールドには、必要なものが正確に含まれています(下のスクリーンショット)。これらはどういう意味ですか、またパブリックインターフェイスを介してどのようにアクセスできますか?

オブジェクトインスペクターのスクリーンショット

4

3 に答える 3

1

したがって、ここにはいくつかの質問があります。Brian Desmondは、「domainFlatName / FlatDomainName」メンバーがドメインのNETBIOS名に対応していること(およびNETBIOS名がDNS名と一致している必要はないこと)についてすでに説明しました。

では、どうやってそれを手に入れるのですか?ブライアンは、ActiveDirectoryのどこに保存されているかを教えてくれました。フラグ付きのDsGetDcName関数でも取得できます。DS_RETURN_FLAT_NAME.NETにはおそらくこの関数のラッパーがありますが、それが何であるかはわかりません。

しかし、あなたの本当の質問は、「CORP\username」文字列を取得する方法でした。ご存知のように、これはから簡単にアクセスできますSystem.Security.Principal.WindowsIdentity.GetCurrent().Name。オブジェクトを取得し、その型に対してメソッドをSecurityIdentifer呼び出して、Valueメソッドから取得することもできます。これは、 or関数をラップしている可能性があります。最後に、この文字列は、構築された属性msDS-PrincipalNameを使用してActiveDirectoryから取得できます。TranslateNTAccountLookupAccountNameDsCrackNames

于 2013-05-10T14:58:46.913 に答える
0

自分のネットワークを使ってもう一度試してみました。最も近い方法は、UserPrincipal.CurrentのSamAccountNameプロパティを使用することでした。

次に、DirectorySearcherのSearchRoot.Nameプロパティを使用して、「DC=CORP」のような結果を取得しました。

   string sFilter = String.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))", u.SamAccountName);
                DirectoryEntry de = new DirectoryEntry(adPath);
                DirectorySearcher ds = new DirectorySearcher(de, sFilter, new string[] { "distinguishedName" });
string dcName = ds.SearchRoot.Name;

DC = CORPからCORPを抽出し、それをu.SamAccountNameと組み合わせることが、私が見つけることができる最良の方法でした。

flatdomainnameを取得する直接的な方法がまだ存在するかどうかを知ることは興味深いでしょう

于 2012-04-21T06:55:28.983 に答える
0

残念ながら、この値を取得することは簡単ではありません。必要な属性は、構成NCのドメインを表すオブジェクトnETBIOSNameに格納されている属性です。crossRef

ドメインのDNがわかっている場合(たとえば、fabrikam.comはDC = fabrikam、DC = com)、構成の名前付けコンテキストを検索して、そこ(&(objectClass=crossRef)(nCName=DC=fabrikam,DC=com))から取得できますnETBIOSName

于 2012-04-21T18:02:18.293 に答える