Vi el método IsInRole pero no puedo encontrar información sobre cómo usarlo con C++.¿Cómo puedo verificar si mi programa es ejecutado por el usuario como administrador (Vista/Win7, C++)
6
A
Respuesta
2
Hay un fragmento de código de C++ en this old answer tomado del proyecto UACHelpers en CodePlex.
-1
Puede probar este trozo de código. Se da un esbozo de lo que hay que hacer:
const HANDLE hProcess = GetCurrentProcess();
if (hProcess==NULL)
return FAILURE;
HANDLE hToken;
const BOOL lR = OpenProcessToken(hProcess, TOKEN_QUERY, &hToken);
if (lR == NULL)
return FAILURE;
PSID psidAdministrators;
SID_IDENTIFIER_AUTHORITY x = SECURITY_NT_AUTHORITY;
if (!AllocateAndInitializeSid(
&x, 2,
SECURITY_BUILTIN_DOMAIN_RID, DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0,
&psidAdministrators))
return FAILURE;
bool isAdmin = false; //dummy init
DWORD size;
GetTokenInformation(hToken, TokenGroups, NULL, 0, &size);
char* buffer = new char[size];
DWORD notUsed;
if (!GetTokenInformation(hToken, TokenGroups, (void*)buffer, size, ¬Used))
return FAILURE;
TOKEN_GROUPS* ptgGroups = (TOKEN_GROUPS*)buffer;
isAdmin = false; //until proven otherwise
for (UINT32 i=0; i<ptgGroups->GroupCount; ++i)
{
if (EqualSid(psidAdministrators, ptgGroups->Groups[i].Sid))
{
isAdmin = true;
break;
}
}
FreeSid(psidAdministrators);
return isAdmin;
1
La documentación de IsUSerAnAdmin
explica que es obsoleta desde Vista, pero que apunta a CheckTokenMembership
. Eso debería hacer el trabajo por ti.
2
Este código resuelve su problema. Sientase libre de usarlo. Funciona con SE_GROUP_USE_FOR_DENY_ONLY.
/**
IsGroupMember determines if the current thread or process has a token that contais a given and enabled user group.
Parameters
dwRelativeID: Defines a relative ID (par of a SID) of a user group (e.g. Administrators DOMAIN_ALIAS_RID_ADMINS (544) = S-1-5-32-544)
bProcessRelative: Defines whether to use the process token (TRUE) instead of the thread token (FALSE). If FALSE and no thread token is present
the process token will be used though.
bIsMember: Returns the result of the function. The value returns TRUE if the user is an enabled member of the group; otherwise FALSE.
Return Value
If the function succeeds, the return value is TRUE; otherwise FALSE. Call GetLastError for more information.
*/
BOOL IsGroupMember(DWORD dwRelativeID, BOOL bProcessRelative, BOOL* pIsMember)
{
HANDLE hToken, hDupToken;
PSID pSid = NULL;
SID_IDENTIFIER_AUTHORITY SidAuthority = SECURITY_NT_AUTHORITY;
if (!pIsMember)
{
SetLastError(ERROR_INVALID_USER_BUFFER);
return FALSE;
}
if (bProcessRelative || !OpenThreadToken(GetCurrentThread(), TOKEN_QUERY | TOKEN_DUPLICATE, TRUE, &hToken))
{
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_DUPLICATE, &hToken))
{
return FALSE;
}
}
if (!DuplicateToken(hToken, SecurityIdentification, &hDupToken))
{
CloseHandle(hToken);
return FALSE;
}
CloseHandle(hToken);
hToken = hDupToken;
if (!AllocateAndInitializeSid(&SidAuthority, 2,
SECURITY_BUILTIN_DOMAIN_RID, dwRelativeID, 0, 0, 0, 0, 0, 0,
&pSid))
{
CloseHandle(hToken);
return FALSE;
}
if (!CheckTokenMembership(hToken, pSid, pIsMember))
{
CloseHandle(hToken);
FreeSid(pSid);
*pIsMember = FALSE;
return FALSE;
}
CloseHandle(hToken);
FreeSid(pSid);
return TRUE;
}
BOOL IsUserAdministrator(BOOL* pIsAdmin)
{
return IsGroupMember(DOMAIN_ALIAS_RID_ADMINS, FALSE, pIsAdmin);
}
Cuestiones relacionadas
- 1. ¿Cómo puedo verificar si mi programa tiene datos conectados
- 2. ¿Cómo depuro un programa ejecutado por un usuario diferente?
- 3. ¿Cómo puedo verificar si este usuario es anónimo o realmente un usuario en mi sistema?
- 4. C# ¿Cómo puedo verificar si existe una URL/es válida?
- 5. ¿Puedo utilizar un usuario existente como administrador de Django al habilitar el administrador por primera vez?
- 6. Cómo verificar C# si la cuenta de usuario está activa
- 7. ¿Cómo puedo verificar si el Android Market está instalado en el dispositivo de mi usuario?
- 8. C# Comprobar si se ejecuta como administrador
- 9. ¿Cómo puedo verificar si mi aplicación tiene foco?
- 10. C++: ¿cómo puedo verificar si el buffer cin está vacío?
- 11. ¿Cómo el administrador de tareas mata mi programa?
- 12. ¿Cómo forzar a que mi programa C# Winforms se ejecute como administrador en cualquier computadora?
- 13. ¿Por qué mi programa C++ Builder es mucho más pequeño que mi programa Delphi?
- 14. Cómo eliminar el requisito "Ejecutar como administrador" en C#
- 15. Evitando que el código sea ejecutado por el usuario
- 16. Cómo saber si OpenMP funciona en mi programa C++
- 17. ¿Cómo puedo verificar si existe un nombre de usuario dado?
- 18. ¿Cómo puedo saber si mi proceso se está ejecutando como administrador?
- 19. ¿Cómo puedo verificar si mi modelo es válido desde el interior de la vista de afeitar?
- 20. cómo puede un ejecutivo cambiar el comportamiento del programa ejecutado
- 21. ¿Cómo puedo verificar si el usuario es anónimo o ha iniciado sesión desde javascript?
- 22. ¿Cómo puedo verificar si un programa se está ejecutando por primera vez?
- 23. Escribiendo un programa para verificar si un gráfico es bipartito
- 24. Ejecutando como administrador, ¿cómo puedo verificar si alguna cuenta de Windows tiene permisos para leer un directorio?
- 25. ¿Cómo puedo verificar si un número (tipo doble) almacenado como una cadena es un número doble válido en C++?
- 26. ¿Por qué no puedo verificar si un 'DateTime' es 'Nothing'?
- 27. ¿Cómo puedo acelerar mi programa Perl?
- 28. ¿Cómo verificar si existe un usuario postgres?
- 29. Google App Engine: averigüe si un usuario es administrador
- 30. ¿Puedo verificar C (++) si una matriz es 0 (o falsa)?
Este código es la forma NT4 de comprobar si un SID forma parte de un token de usuario, no funciona correctamente en los sistemas más nuevos y no debe utilizarse. Vea el enlace SO de Rup para mi respuesta y a qué función llamar ... – Anders
@Anders: Funciona en Windows XP, Windows Vista y Windows 7 con seguridad. Este código fue probado bastante extensamente en estos tres sistemas. ¿Por qué crees que no funcionaría? –
SÉ que está roto, por lo que simplemente no se realizó la prueba correctamente. Hay una cosa llamada SID de denegación exclusiva y su código actual no los maneja; se supone que debe usar CheckTokenMembership. – Anders