2012-08-28 30 views
8

Tôi biết rằng hàm sau trả về tên người dùng Windows hiện tại ở định dạng tên miền \ tên người dùng.Làm cách nào để nhận tên người dùng cửa sổ hiện tại ở định dạng tên miền @ tên miền?

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

Nhưng làm cách nào để lấy tên của người dùng ở định dạng [email protected]?

EDIT:

Tôi đang phản hồi trong chỉnh sửa này vì mọi người đã trả lời đều có cùng ý tưởng cơ bản.

Từ những gì tôi đã được hiểu, phân tích tên từ định dạng domain\username và xây dựng nó là [email protected] không an toàn hoặc được khuyên. Tôi tin rằng điều này là như vậy bởi vì không có đảm bảo rằng hai tên miền là như nhau trong các định dạng khác nhau. Ví dụ: trong công ty tôi làm việc, phần domain của định dạng domain\username được dựa trên deparment, nhưng trong [email protected], đó là tên công ty. Đó là loại điều yêu cầu tra cứu DNS.

Tôi đã hy vọng rằng có một API đã thực hiện tra cứu DNS này. Tôi đoán tôi nên đưa thông tin này vào câu hỏi ban đầu của mình. Lấy làm tiếc.

+0

Tôi đang sử dụng C# trong đơn đăng ký của mình. –

+0

Thuộc tính bạn đang tìm kiếm là tên chính của người dùng (UPN). –

+1

Hãy thử liệt kê WindowsIdentity.GetCurrent() .Các xác nhận quyền sở hữu, UPN có thể được bao gồm. Nếu không, hãy sử dụng P/Invoke để gọi hàm TranslateName. –

Trả lời

3

Tất cả các mã để lấy tên ở định dạng Domain\user name và phân tích nó sẽ không hoạt động trong mọi tình huống. Câu trả lời là bạn phải thực hiện cuộc gọi đến Active Directory để lấy Tên người dùng chính. Nó chỉ ra rằng tôi không thể dựa vào Active Directory đang được cài đặt trên máy tính để bàn, vì nhiều sở cảnh sát không cài đặt thư mục trên máy tính xách tay của họ trong trường hợp nó bị đánh cắp trong khi cảnh sát không có trong xe. (Nói về sự can đảm, đánh cắp máy tính ra khỏi xe cảnh sát!)

Chúng tôi đã đưa ra giải pháp riêng cho tình huống của mình. Chúng tôi lưu trữ tên người dùng trong cơ sở dữ liệu của chúng tôi ở định dạng Domain\user name. Khi chương trình khởi động, nó sẽ kiểm tra xem liệu tên người dùng cửa sổ hiện tại (có cùng định dạng) có nằm trong cơ sở dữ liệu hay không. Nếu có, chương trình sẽ sử dụng người dùng đó làm người dùng hiện tại và chạy. Nếu người dùng Windows hiện tại không có trong cơ sở dữ liệu của chúng tôi, chương trình sẽ quay trở lại mã trước của chúng tôi.

Bằng cách này, người dùng có thể đăng nhập vào máy bằng bất kỳ định dạng nào cho tên người dùng của họ và họ xác thực bằng Windows. Chương trình của chúng tôi luôn nhận được tên người dùng ở cùng định dạng và luôn kiểm tra tên người dùng ở định dạng đó. Windows xác thực người dùng chứ không phải chúng tôi.

+1

Đối với hồ sơ, Active Directory là một thành phần máy chủ vì vậy nó là không bao giờ "cài đặt trên máy tính để bàn". Có lẽ vấn đề là bạn không thể dựa vào việc có kết nối mạng với bộ điều khiển miền. –

+0

Vâng, đó là chính xác. Các máy tính xách tay là trong xe cảnh sát. Không phải tất cả chúng đều có bất kỳ loại kết nối nào khi đang trên đường và những người có thể không đáng tin cậy. –

+0

Vì vậy, bạn đang nói với chúng tôi về cơ bản: 'sở cảnh sát không muốn tên người dùng được lưu trữ cục bộ vì lý do bảo mật, nhưng tôi bỏ qua yêu cầu đó để làm cho chương trình của tôi hoạt động'? – Sam

3

Bạn có thể chia tên sử dụng \ như delimiter, sau đó đảo ngược thứ tự như sau:

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; 

Điều quan trọng cần lưu ý là một dấu chéo ngược đôi \\ là cần thiết vì một dấu gạch chéo là một nhân vật đặc biệt. Chúng tôi thêm dấu gạch chéo ngược thứ hai trong ví dụ trên để thoát ký tự đặc biệt và sử dụng ký tự đó làm ký tự thông thường.

+0

Xin lỗi vì câu trả lời dupe - bạn đã gõ một cách thận trọng cùng lúc với tôi. – Kevin

+0

Đừng lo lắng @Kevin, mặc dù tôi phải thêm kiểm tra có điều kiện để thử và một lần bạn :-P. – Sam

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

Bạn sử dụng tab [1] hai lần, tên này sẽ trả về tên người dùng @ username. – Sam

+0

Cảm ơn Sam cho nhận xét, cảm ơn –

9

Something như thế này nên làm việc ...

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

cái gì đó dọc những dòng này.

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

Định dạng mã của bạn đã bị rối tung lên. Ngoài ra, tại sao mã của bạn giả định rằng 'nameParts.Length == 1' biểu thị sử dụng an toàn của một mảng có độ dài ** ít nhất ** (và có thể không nhiều hơn) 2. Theo giả định của bạn, nó có thể là thích hợp hơn để kiểm tra UpperBound như vậy '(nameParts.GetUpperBound (0) == 1)' – Sam

+0

Mã của bạn sẽ không biên dịch. bạn không thể gán 'nameParts' là một mảng chuỗi vào một chuỗi. Ngoài ra, 'string.format' không tồn tại, nó là' string.Format'. Cuối cùng, 'Split (@" \ ")' là không thể như Split không chấp nhận một chuỗi (tuy nhiên nó chấp nhận một chuỗi []) – Sam

+0

cảm ơn cho nhận xét –

2

Sử dụng

System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName 

này trả về UPN của người sử dụng hiện nay. Yêu cầu tham chiếu đến System.DirectoryServices.AccountManagement.

Các vấn đề liên quan