2012-08-28 51 views
8

我知道以下函數以域\用戶名格式返回當前Windows用戶的名稱。如何以username @ domain格式獲取當前windows用戶的名稱?

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

但是,如何獲取[email protected]格式的用戶名?

編輯:

我回應在此編輯爲大家誰也說有相同的基本思想。

從我已經知道的,解析從domain\username格式的名稱並將其構建爲[email protected]不安全或建議。我相信這是因爲不能保證這兩個域名在不同格式中是相同的。例如,在我工作的公司中,domain\username格式的domain部分基於部署,但在[email protected]中,它是公司名稱。這是需要DNS查找的事情。

我希望有一個API做了這個DNS查找。我想我應該把這些信息放到我原來的問題中。抱歉。

+0

我在我的應用程序中使用C#。 –

+0

您正在查找的屬性是用戶主體名稱(UPN)。 –

+1

嘗試枚舉WindowsIdentity.GetCurrent()。聲明,可能包含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; 

需要注意的是一個雙反斜線\\是必需的,因爲反斜槓是一個特殊字符是非常重要的。我們在上面的例子中添加第二個反斜槓來轉義特殊字符並將其用作常規字符。

+0

對不起,這個複製答案 - 你在我的同一時間出現在輸入文字上。 – Kevin

+0

不用擔心@凱文,雖然我不得不添加條件檢查來嘗試和你一起:-P。 – Sam

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

您使用tab [1]兩次,這將返回username @ username。 – Sam

+0

感謝Sam的評論,謝謝 –

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'表示安全使用一個數組,該數組的長度至少爲**(可能不超過)。2.在你的假設中,它可能是更適合像這樣檢查UpperBound'(nameParts.GetUpperBound(0)== 1)' – Sam

+0

您的代碼不會編譯。你不能將'nameParts'作爲一個字符串數組賦給一個字符串。另外,'string.format'不存在,它是'string.Format'。最後,'Split(@「\」)'是不可能的,因爲Split不接受一個字符串(它接受一個字符串[]) – Sam

+0

感謝您的評論 –

2

使用

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

這將返回當前用戶的UPN。需要對System.DirectoryServices.AccountManagement的引用。

相關問題