2008-10-30 5 views
26

Ich suche nach einer einfachen Möglichkeit, die SID für das aktuelle Windows-Benutzerkonto zu erhalten. Ich weiß, dass ich es über WMI machen kann, aber ich möchte diesen Weg nicht gehen.Wie kann ich die SID des aktuellen Windows-Kontos abrufen?

Entschuldigung an alle, die in C# geantwortet haben, weil sie nicht C++ angegeben haben.

:-)
+0

Programmiersprache/Umwelt? –

Antwort

43

In Win32, rufen GetTokenInformation, einen Token Griff und die TokenUser konstant verläuft. Es wird eine TOKEN_USER Struktur für Sie ausfüllen. Eines der Elemente darin ist die SID des Benutzers. Es ist ein BLOB (binär), aber Sie können es in eine Zeichenfolge umwandeln, indem Sie ConvertSidToStringSid verwenden.

Um das aktuelle Token-Handle zu erhalten, verwenden Sie OpenThreadToken oder OpenProcessToken.

Wenn Sie ATL bevorzugen, hat es die CAccessToken Klasse, die alle Arten von interessanten Dingen enthält.

.NET verfügt über die Eigenschaft Thread.CurrentPrinciple, die eine IPrincipal-Referenz zurückgibt. Sie können die SID erhalten:

IPrincipal principal = Thread.CurrentPrincipal; 
WindowsIdentity identity = principal.Identity as WindowsIdentity; 
if (identity != null) 
    Console.WriteLine(identity.User); 

auch in .NET können Sie verwenden WindowsIdentity.GetCurrent(), die den aktuellen Benutzer-ID zurückgibt:

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
if (identity != null) 
    Console.WriteLine(identity.User); 
2

CodeProject hat ein paar verschiedene Methoden können Sie versuchen ... Sie nicht erwähnt, welche Sprachen Sie eine Lösung in gesucht.

Wenn Sie es über eine Batch-Datei oder etwas zugreifen möchten, können Sie kann als PsGetSid von Sysinternals aussehen. Es übersetzt SIDs in Namen und umgekehrt.

0

Sie haben nicht angegeben, welche Sprache Sie möchten. Aber wenn Sie für C# bereit sind, bietet dieser Artikel sowohl die WMI-Methode als auch eine schnellere (wenn auch ausführlichere) Methode unter Verwendung der Win32-API.

http://www.codeproject.com/KB/cs/processownersid.aspx

Ich glaube nicht, dass es noch eine andere Möglichkeit, dies zu tun, ohne WMI oder die Win32-API.

6

Dies sollte Sie geben, was Sie brauchen:

System.Security.Principal verwendet wird;

...

var sid = WindowsIdentity.GetCurrent() Benutzer.

Die User-Eigenschaft von Windows gibt den SID, pro MSDN Docs

2

In C# können Sie entweder

using Microsoft.Win32.Security;

...

string username = Environment.UserName + "@" + Environment.GetEnvironmentVariable("USERDNSDOMAIN");

Sid sidUser = new Sid (username);

Or ...

using System.Security.AccessControl;

using System.Security.Principal;

...

WindowsIdentity m_Self = WindowsIdentity.GetCurrent();

SecurityIdentifier m_SID = m_Self.Owner;");

1

ich einen anderen Weg gefunden SID zu erhalten:

System.Security.Principal.WindowsIdentity id = System.Security.Principal.WindowsIdentity.GetCurrent(); 
string sid = id.User.AccountDomainSid.ToString(); 
0

Dieser ist der kürzeste von allen, glaube ich.

UserPrincipal.Current.Sid; 

Erhältlich mit .net> = 3,5

5
ATL::CAccessToken accessToken; 
ATL::CSid currentUserSid; 
if (accessToken.GetProcessToken(TOKEN_READ | TOKEN_QUERY) && 
    accessToken.GetUser(&currentUserSid)) 
    return currentUserSid.Sid(); 
+0

Dies ist sehr kurz gefasst. –

0

Und in nativen Code:

function GetCurrentUserSid: string; 

    hAccessToken: THandle; 
    userToken: PTokenUser; 
    dwInfoBufferSize: DWORD; 
    dw: DWORD; 

    if not OpenThreadToken(GetCurrentThread, TOKEN_QUERY, True, ref hAccessToken) then 
     dw <- GetLastError; 
     if dw <> ERROR_NO_TOKEN then 
      RaiseLastOSError(dw); 

     if not OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, ref hAccessToken) then 
      RaiseLastOSError; 
    try 
     userToken <- GetMemory(1024); 
     try 
      if not GetTokenInformation(hAccessToken, TokenUser, userToken, 1024, ref dwInfoBufferSize) then 
       RaiseLastOSError; 
      Result <- SidToString(userToken.User.Sid); 
     finally 
      FreeMemory(userToken); 
    finally 
     CloseHandle(hAccessToken);