c++ windows sid

c++ - ¿Cómo puedo obtener el SID de la cuenta actual de Windows?



(9)

En C # puedes usar cualquiera

using Microsoft.Win32.Security;

...

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

Sid sidUser = new Sid (username);

O...

using System.Security.AccessControl;

using System.Security.Principal;

...

WindowsIdentity m_Self = WindowsIdentity.GetCurrent();

SecurityIdentifier m_SID = m_Self.Owner;");

Estoy buscando una manera fácil de obtener el SID para la cuenta de usuario de Windows actual. Sé que puedo hacerlo a través de WMI, pero no quiero ir por esa ruta.

Disculpas a todos los que respondieron en C # por no especificar que es C ++. :-)


Esto debería darle lo que necesita:

usando System.Security.Principal;

...

var sid = WindowsIdentity.GetCurrent (). Usuario;

La propiedad del usuario de WindowsIdentity devuelve el SID, según MSDN Docs


No especificó qué idioma quiere. Pero si está preparado para C #, este artículo ofrece tanto el método WMI como un método más rápido (aunque más detallado) que utiliza la API de Win32.

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

No creo que haya otra forma de hacerlo sin usar WMI o la API de Win32.


CodeProject tiene algunos métodos diferentes que puedes probar ... No mencionaste en qué idiomas querías una solución.

Si desea acceder a él a través de un archivo por lotes o algo así, puede ver como PsGetSid de Sysinternals . Traduce SID a nombres y viceversa.


Encontré otra forma de obtener SID:

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


Este es el más corto de todos ellos, creo.

UserPrincipal.Current.Sid;

Disponible con .net> = 3.5


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


En Win32, llame a GetTokenInformation , pasando un identificador de token y la constante TokenUser . Completará una estructura TOKEN_USER para usted. Uno de los elementos allí es el SID del usuario. Es un BLOB (binario), pero puede convertirlo en una cadena utilizando ConvertSidToStringSid .

Para obtener el control del token actual, use OpenThreadToken u OpenProcessToken .

Si prefiere ATL, tiene la clase CAccessToken , que tiene todo tipo de cosas interesantes.

.NET tiene la propiedad Thread.CurrentPrinciple , que devuelve una referencia IPrincipal. Puedes obtener el SID:

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

También en .NET, puede usar WindowsIdentity.GetCurrent (), que devuelve el ID de usuario actual:

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


Y en código nativo:

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