2012-04-20 32 views
3

職場のWindowsマシンにログインするときは、「CORP \ username」を使用します。.NET 3.5+でユーザーの「フラット」ドメイン名を取得する方法

ユーザーのSIDと、ログインしたドメインコントローラがある場合、その文字列はどのようにして派生しますか?

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"); 

私はドメインコントローラオブジェクトとユーザオブジェクトの周りに掘ってきており、このようなものの多くを参照してください:私はこのように、DirectoryServices APIは、.NET 3.5の中に追加使用してい

user.Name:    john smith 
user.DisplayName:  john smith 
user.UserPrincipalName: [email protected] 
user.SamAccountName: john.smith 

UserPrincipleオブジェクトのプライベートな勇気を掘り下げてみると、「domainFlatName」と「FlatDomainName」の2つのフィールドがあります。これらの意味はどういう意味ですか、そして私はパブリックインターフェイスを介してどのようにそれらにアクセスできますか?

Object Inspector Screenshot

+0

プログラム環境とは何ですか?それはWindowsフォームかAsp.netですか? –

+0

これはWPFアプリケーションです。 – Mud

+0

あなたは反射を知っていますか?それは自由に民間/内部のフィールドを読むことができます、http://www.techrepublic。com/article/applied-reflection-dynamic-accessible-at-class-at-runtime/6099345 –

答えて

0

をflatdomainnameを取得するための直接的な方法が存在するかどうかを知るのは興味深いだろう

を見つけることができる最善の方法でした。必要な属性はnETBIOSNameであり、コンフィグレーションNCのドメインを表すcrossRefオブジェクトに格納されています。あなたがドメインのDNを知って考える

、あなたが(&(objectClass=crossRef)(nCName=DC=fabrikam,DC=com))のための構成名前付けコンテキストの検索を行うと、そこのオフnETBIOSNameをつかむことができます(たとえば、fabrikam.comは、DC = Fabrikam社、DC = comのです)。

0

私は自分のネットワークを使用して再度試してみました。私は達することができる最も近い= UserPrincipal.Current

のSAMアカウントプロパティを使用していたし、その後、私に 『DC = CORP』 DCから

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; 

抽出CORPのような結果を与えたDirectorySearcherのSearchRoot.Nameプロパティを使用しましたCORPとu.SamAccountNameと組み合わせることは、私はまだ、この値が、残念ながら非自明で取得

+2

残念ながら、ボトムレベルのDNSラベル(ここではDC = corp)がドメインのNetBIOS名(CORP)と一致することを要求する技術的な理由はありません。それらが発散するのは非常に一般的です。 –

1

ここにいくつかの質問があります。 Brian Desmondはすでに、「domainFlatName/FlatDomainName」のメンバーがドメインのNETBIOS名に対応していることを示しています(NETBIOS名はDNS名と一致する必要はありません)。

どうやってそれを手に入れますか? BrianはActive Directoryに格納されている場所を教えてくれました。また、DS_RETURN_FLAT_NAMEフラグを持つDsGetDcName関数で取得することもできます。おそらく.NETのこの関数のラッパーがありますが、私はそれが何であるか分かりません。

しかし本当に問題は "CORP \ username"文字列を取得する方法でした。見つけたので、これはSystem.Security.Principal.WindowsIdentity.GetCurrent().Nameから簡単にアクセスできます。また、SecurityIdentiferオブジェクトを取得し、TranslateメソッドをNTAccountタイプに呼び出して、Valueメソッドから取得することもできます。これは、LookupAccountNameまたはDsCrackNames機能をラップする可能性が最も高いです。最後に、この文字列は、作成された属性msDS-PrincipalNameを使用してActive Directoryから取得できます。

関連する問題