2008-10-30 9 views

Répondre

43

Dans Win32, appelez GetTokenInformation, en passant d'une poignée jeton et la constante TokenUser. Il va remplir une structure TOKEN_USER pour vous. L'un des éléments est le SID de l'utilisateur. C'est un BLOB (binaire), mais vous pouvez le transformer en une chaîne en utilisant ConvertSidToStringSid. Pour obtenir la poignée de jeton actuelle, utilisez ou OpenProcessToken.

Si vous préférez ATL, il a la classe CAccessToken, qui contient toutes sortes de choses intéressantes.

.NET a la propriété Thread.CurrentPrinciple qui renvoie une référence IPrincipal. Vous pouvez obtenir le SID:

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

également dans .NET, vous pouvez utiliser WindowsIdentity.GetCurrent(), qui retourne l'ID utilisateur actuel:

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

CodeProject a quelques méthodes différentes que vous pouvez essayer ... Vous n'avez pas mentionné ce que les langues que vous vouliez une solution.

Si vous souhaitez y accéder via un fichier batch ou quelque chose, vous peut ressembler à PsGetSid par Sysinternals. Il traduit les SID en noms et vice versa.

0

Vous n'avez pas spécifié la langue souhaitée. Mais si vous êtes en mode C#, cet article propose à la fois la méthode WMI et une méthode plus rapide (bien que plus verbeuse) utilisant l'API Win32.

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

Je ne pense pas qu'il y ait actuellement une autre façon de le faire sans utiliser WMI ou l'API Win32.

6

Cela devrait vous donner ce que vous avez besoin:

utilisant System.Security.Principal;

...

var sid = WindowsIdentity.GetCurrent() utilisateur.

La propriété utilisateur de WindowsIdentity renvoie le SID, par MSDN Docs

2

En C#, vous pouvez utiliser

using Microsoft.Win32.Security;

...

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

Sid sidUser = new Sid (username);

Ou ...

using System.Security.AccessControl;

using System.Security.Principal;

...

WindowsIdentity m_Self = WindowsIdentity.GetCurrent();

SecurityIdentifier m_SID = m_Self.Owner;");

1

J'ai trouvé une autre façon d'obtenir SID:

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

Celui-ci est le plus court de tous, je crois.

UserPrincipal.Current.Sid; 

Disponible avec .net> = 3,5

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

C'est très concis. –

0

Et en code natif:

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); 
langage de programmation
Questions connexes