2009-07-31 17 views
14

Warunek SzczegółyJaki jest najlepszy sposób uzyskania identyfikatora SID obecnego użytkownika?

  1. Praca w .NET 2.0.
  2. Kod znajduje się we wspólnej bibliotece, którą można wywołać z ASP.Net, Windows Forms lub aplikacji Konsola.
  3. Działa w domenie Windows w sieci firmowej.

Pytanie

Jaki jest najlepszy sposób, aby uzyskać SID bieżącego użytkownika? Nie mówię o tożsamości wykonującej aplikację, ale o użytkowniku, który uzyskuje dostęp do interfejsu. W aplikacjach działających w tle i aplikacjach na komputerach powinna to być tożsamość faktycznie wykonująca aplikację, ale w ASP.Net (bez impersionacji) powinien to być SID HttpContext.Current.User.

obecna metoda

To co mam teraz. To po prostu wydaje się ... złe. To jest paskudne. Czy istnieje lepszy sposób na to, lub niektóre wbudowane klasy, które robi to za Ciebie?

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; 
    } 
} 

Odpowiedz

3

Nie sądzę, istnieje lepszy sposób na uzyskanie w tym informacji - udało Ci się dostać na WindowsPrincipal jakoś i raczej czyste API .NET za abstrahuje że za obiektem użytkownika. Po prostu zostawiłbym to miłe i zawarłem metodę i nazwałbym to dniem.

Cóż, jest jedna rzecz, którą powinieneś zrobić (chyba, że ​​Twoi internauci to zawsze będzie WindowsIdentity), co powinno polegać na sprawdzeniu zerowej tożsamości i postępowaniu zgodnie z dowolnymi zasadami.

+1

Użytkownik zawsze będzie miał tożsamość (jeśli nie, to jest to znacznie większy problem). Dziękuję za odpowiedź. –

1

Klasa WindowsIdentity to "klasa wbudowana, która robi to za Ciebie". Masz proste rozwiązanie, które otrzymasz naprawdę, o ile masz ważne WindowsIdentity do pracy. Alternatywnie, jeśli masz nazwę użytkownika danego użytkownika i chcesz uzyskać identyfikator SID bezpośrednio z AD, możesz zbudować własną bibliotekę, aby korzystać z przestrzeni nazw DirectoryServices i pobrać obiekt DirectoryEntry dla swojego użytkownika (to jest dość skomplikowany proces, ponieważ DirectoryServices jest trudny). Możesz nawet użyć LDAP, aby go uzyskać, jeśli masz taką potrzebę.

0

Bez korzystania z bibliotek stron trzecich Kod ten podaje poprawne wyniki, jeśli użytkownik zmienił swoją nazwę użytkownika.

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); 
Powiązane problemy