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(¤tUserSid))
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);