2009-07-31 39 views
14

Điều kiện tiên quyết chi tiếtCách tốt nhất để lấy SID của người dùng hiện tại là gì?

  1. Làm việc trong .NET 2.0.
  2. Mã nằm trong một thư viện chung có thể được gọi từ ASP.Net, Windows Forms hoặc ứng dụng Bảng điều khiển.
  3. Chạy trong Miền Windows trên mạng công ty.

Các Câu hỏi

cách tốt nhất để có được SID của người dùng hiện nay là gì? Tôi không nói về danh tính đang thực thi ứng dụng, nhưng người dùng đang truy cập vào giao diện. Trong các ứng dụng nền và các ứng dụng dựa trên máy tính để bàn, điều này sẽ là danh tính thực sự thực thi ứng dụng, nhưng trong ASP.Net (không có sự can thiệp), đây phải là SID HttpContext.Current.User.

Phương pháp hiện tại

Đây là những gì tôi đã có ngay bây giờ. Có vẻ như ... sai. Thật khó chịu. Có cách nào tốt hơn để làm điều này, hoặc một số lớp được xây dựng trong đó có nó cho bạn?

public static SecurityIdentifier SID 
{ 
    get 
    { 
     WindowsIdentity identity = null; 

     if (HttpContext.Current == null) 
     { 
      identity = WindowsIdentity.GetCurrent(); 
     } 
     else 
     { 
      identity = HttpContext.Current.User.Identity as WindowsIdentity; 
     } 

     return identity.User; 
    } 
} 

Trả lời

3

Tôi không nghĩ rằng có một cách tốt hơn lúc nhận được thông tin này tại - you've có để có được tại WindowsPrincipal bằng cách nào đó và API khá sạch NET của tóm tắt rằng đằng sau các đối tượng người dùng. Tôi chỉ để điều này tốt đẹp và gói gọn trong một phương pháp và gọi nó là một ngày. Vâng, ok, có một điều bạn nên làm (trừ khi người dùng web của bạn là luôn luôn sẽ là WindowsIdentity), sẽ là để kiểm tra danh tính rỗng và xử lý nó theo bất kỳ quy tắc nào bạn có.

+1

Người dùng sẽ luôn có nhận dạng (nếu không thì đó là vấn đề lớn hơn nhiều). Cảm ơn câu trả lời. –

1

Lớp WindowsIdentity là "được xây dựng trong lớp mà nó cho bạn". Bạn đã có một giải pháp đơn giản như bạn sẽ thực sự có được, miễn là bạn có một WindowsIdentity hợp lệ để làm việc cùng. Ngoài ra, nếu bạn có tên người dùng của người dùng được đề cập và bạn muốn nhận SID trực tiếp từ AD, bạn có thể xây dựng thư viện của riêng bạn để sử dụng không gian tên DirectoryServices và truy xuất DirectoryEntry cho người dùng của bạn (đây là một cách khá công bằng). quá trình phức tạp như DirectoryServices là khó khăn). Bạn thậm chí có thể sử dụng LDAP để có được nó nếu bạn có nhu cầu.

0

Nếu không sử dụng thư viện của bên thứ ba Mã này sẽ cho kết quả chính xác, nếu người dùng đã thay đổi tên người dùng của mình.

String SID = ""; 
string currentUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString(); 

RegistryKey regDir = Registry.LocalMachine; 

      using (RegistryKey regKey = regDir.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\SessionData", true)) 
      { 
       if (regKey != null) 
       { 
        string[] valueNames = regKey.GetSubKeyNames(); 
        for (int i = 0; i < valueNames.Length; i++) 
        { 
         using (RegistryKey key = regKey.OpenSubKey(valueNames[i], true)) 
         { 
          string[] names = key.GetValueNames(); 
          for (int e = 0; e < names.Length; e++) 
          { 
           if (names[e] == "LoggedOnSAMUser") 
           { 
            if (key.GetValue(names[e]).ToString() == currentUserName) 
             SID = key.GetValue("LoggedOnUserSID").ToString(); 
           } 
          } 
         } 
        } 
       } 
      }MessageBox.Show(SID); 
Các vấn đề liên quan