2012-08-28 9 views
8

次の関数は、現在のWindowsユーザーの名前をdomain \ username形式で返します。username @ domain形式で現在のWindowsユーザーの名前を取得するにはどうすればよいですか?

Convert.ToString(WindowsIdentity.GetCurrent().Name); 

しかし、[email protected]形式でユーザー名を取得するにはどうすればよいですか。

EDIT:

答えた全員が同じ基本的な考え方を持っているように私はこの編集に対応しています。

私が理解したところでは、domain\usernameという形式から名前を解析し、[email protected]という名前で構文解析するのは安全ではないと言われています。私はこれがそうであると信じる2つのドメイン名が異なったフォーマットで同じであるという保証がないので。たとえば、私が働いている会社では、domain\usernameフォーマットのdomainの一部は部門別に基づいていますが、[email protected]では会社名です。それはDNSルックアップを必要とするものです。

このDNSルックアップを実行したAPIがあることを期待していました。私はこの情報を私の元の質問に入れておくべきだったと思う。ごめんなさい。

+0

私のアプリケーションでC#を使用しています。 –

+0

探しているプロパティは、ユーザープリンシパル名(UPN)です。 –

+1

WindowsIdentity.GetCurrent()。Claimsを列挙してみると、UPNが含まれている可能性があります。そうでない場合は、P/Invokeを使用してTranslateName関数を呼び出します。 –

答えて

3

コードのすべてがDomain\user name形式で名前を取り、それがすべての状況では動作しません解析します。答えは、Active Directoryを呼び出してユーザープリンシパル名を取得する必要があることです。多くの警察署は、警察が車に乗っていないうちに盗まれた場合に備えて、ノートブックにディレクトリをインストールしないので、デスクトップにインストールされているActive Directoryに頼ることはできません。 (警察の車からコンピュータを盗んで、勇敢な話をする!)

私たちは私たちの状況に対して私たち自身の解決策を考え出しました。私たちはデータベースにユーザー名をDomain\user name形式で保存します。プログラムが起動すると、現在のWindowsユーザー名(同じ形式)がデータベースにあるかどうかがチェックされます。そうである場合、プログラムはそのユーザーを現在のユーザーとして使用して実行します。現在のWindowsユーザーがデータベースにない場合、プログラムは前のコードに戻ります。

このようにして、ユーザーはユーザー名の任意の形式を使用してコンピュータにログインし、Windowsで認証できます。私たちのプログラムは常に同じ形式のユーザー名を取得し、常にその形式でユーザー名をチェックします。 Windowsはユーザーではなく私たちを認証します。

+1

レコードの場合、Active Directoryはサーバーコンポーネントなので、デスクトップにインストールされることはありません。おそらく、ドメインコントローラーへのネットワーク接続に頼ることができないという問題がありました。 –

+0

はい、そうです。ラップトップは警察の車に乗っている。道路上にいる間は、すべての種類の接続性を備えているわけではなく、信頼性が低い場合もあります。 –

+0

それで、あなたは基本的にこう言っている:「警察は、セキュリティ上の理由からローカルにユーザ名を保存することを望まないが、私のプログラム制作の要件を無視している」と言っている。 – Sam

3

あなたはそうのような順序を逆に、その後、区切り文字として\を使用して名前を分割することができます:

string[] splitName = WindowsIdentity.GetCurrent().Name.Split('\\'); 
//check that splitName contains at least 2 values before using 
string name = (splitName.Length > 1) ? splitName[1] + "@" + splitName[0] : null; 

それは、バックスラッシュが特殊文字であるため、二重のバックスラッシュ\\が必要であることに注意することが重要です。特殊文字をエスケープして通常の文字として使用するには、上記の例の2番目のバックスラッシュを追加します。

このような何かが動作するはず
+0

冗談の答えは申し訳ありません。 – Kevin

+0

心配しないで@ケビン、私はあなたに試してみるために条件付きチェックを追加しなければならなかった:-P。 – Sam

3
var input = WindowsIdentity.GetCurrent().Name ; 
string[] tab = input.Split('\\'); 
var result = tab[1] + "@" + tab[0]; 
+0

tab [1]を2回使用すると、username @ usernameが返されます。 – Sam

+0

コメントありがとうございました。ありがとうございました。ありがとうございました –

9

...

string[] temp = Convert.ToString(WindowsIdentity.GetCurrent().Name).Split('\\'); 
string userName = temp[1] + "@" + temp[0]; 
0

これらの線に沿って何か。

var nameParts = WindowsIdentity.GetCurrent().Name.Split(@"\"); 
string name = nameParts.Length == 1 
    ? nameParts 
    : string.format("{0}@{1}",nameParts[1],nameParts[0]); 
+0

あなたのコードフォーマットが乱れました。また、なぜあなたのコードは、 'nameParts.Length == 1'は**少なくとも**(おそらくはそれ以上)の長さを持つ配列の安全な使用を意味すると仮定していますか?あなたの前提では、 '(nameParts.GetUpperBound(0)== 1)'のようにUpperBoundをチェックするのがより適切です。 – Sam

+0

あなたのコードはコンパイルされません。文字列配列である 'nameParts'を文字列に代入することはできません。また、 'string.format'は存在しません。' string.Format'です。最後に、Splitは文字列を受け入れないため、Split(@ "\")はできません – Sam

+0

コメントのおかげで –

2

使用

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

これは、現在のユーザーのUPNを返します。 System.DirectoryServices.AccountManagementへの参照が必要です。

関連する問題