Mi aplicación Vista necesita saber si el usuario la lanzó como "administrador" (elevado) o como un usuario estándar (no elevado). ¿Cómo puedo detectar eso en tiempo de ejecución?¿Cómo puedo detectar si mi proceso se está ejecutando UAC elevado o no?
Respuesta
La siguiente función C++ puede hacer eso:
HRESULT GetElevationType(__out TOKEN_ELEVATION_TYPE * ptet);
/*
Parameters:
ptet
[out] Pointer to a variable that receives the elevation type of the current process.
The possible values are:
TokenElevationTypeDefault - This value indicates that either UAC is disabled,
or the process is started by a standard user (not a member of the Administrators group).
The following two values can be returned only if both the UAC is enabled
and the user is a member of the Administrator's group:
TokenElevationTypeFull - the process is running elevated.
TokenElevationTypeLimited - the process is not running elevated.
Return Values:
If the function succeeds, the return value is S_OK.
If the function fails, the return value is E_FAIL. To get extended error information, call GetLastError().
Implementation:
*/
HRESULT GetElevationType(__out TOKEN_ELEVATION_TYPE * ptet)
{
if (!IsVista())
return E_FAIL;
HRESULT hResult = E_FAIL; // assume an error occurred
HANDLE hToken = NULL;
if (!::OpenProcessToken(
::GetCurrentProcess(),
TOKEN_QUERY,
&hToken))
{
return hResult;
}
DWORD dwReturnLength = 0;
if (::GetTokenInformation(
hToken,
TokenElevationType,
ptet,
sizeof(*ptet),
&dwReturnLength))
{
ASSERT(dwReturnLength == sizeof(*ptet));
hResult = S_OK;
}
::CloseHandle(hToken);
return hResult;
}
Para la función IsVista (y más detalles sobre GetElevationType), consulte la publicación de blog de Andrei: http : //www.softblog.com/2008-02/vista-tools/ –
Para aquellos de nosotros que trabajamos en C#, en el SDK de Windows hay una aplicación "UACDemo" como parte de las "muestras Cruz Technology". Encuentran si el usuario actual es un administrador usando este método:
private bool IsAdministrator
{
get
{
WindowsIdentity wi = WindowsIdentity.GetCurrent();
WindowsPrincipal wp = new WindowsPrincipal(wi);
return wp.IsInRole(WindowsBuiltInRole.Administrator);
}
}
(Nota: Me refactorizado el código original para ser una propiedad, en lugar de un "if")
Pregunta, ¿esto hará la seguridad del dominio? (MYDOMAIN \ Administrators) ¿O solo es la seguridad local? – mattlant
WindowsBuiltInRole.Administrator es el grupo de administración local – Ryan
Si su cuenta de dominio es un administrador local para esa máquina, o un administrador de dominio, estará en ese grupo local de manera predeterminada, afaik. –
No creo que la elevación tipo es la respuesta que desea. Solo quieres saber si es elevado. Utilice TokenElevation en lugar de TokenElevationType cuando llame a GetTokenInformation. Si la estructura devuelve un valor positivo, el usuario es admin. Si es cero, el usuario tiene una elevación normal.
Aquí es una solución Delphi:
function TMyAppInfo.RunningAsAdmin: boolean;
var
hToken, hProcess: THandle;
pTokenInformation: pointer;
ReturnLength: DWord;
TokenInformation: TTokenElevation;
begin
hProcess := GetCurrentProcess;
try
if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then try
TokenInformation.TokenIsElevated := 0;
pTokenInformation := @TokenInformation;
GetTokenInformation(hToken, TokenElevation, pTokenInformation, sizeof(TokenInformation), ReturnLength);
result := (TokenInformation.TokenIsElevated > 0);
finally
CloseHandle(hToken);
end;
except
result := false;
end;
end;
Aquí es una aplicación VB6 de un cheque si un proceso (actual) es elevado
Option Explicit
'--- for OpenProcessToken
Private Const TOKEN_QUERY As Long = &H8
Private Const TokenElevation As Long = 20
Private Declare Function GetCurrentProcess Lib "kernel32"() As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
Private Declare Function GetTokenInformation Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal TokenInformationClass As Long, TokenInformation As Any, ByVal TokenInformationLength As Long, ReturnLength As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Function IsElevated(Optional ByVal hProcess As Long) As Boolean
Dim hToken As Long
Dim dwIsElevated As Long
Dim dwLength As Long
If hProcess = 0 Then
hProcess = GetCurrentProcess()
End If
If OpenProcessToken(hProcess, TOKEN_QUERY, hToken) Then
If GetTokenInformation(hToken, TokenElevation, dwIsElevated, 4, dwLength) Then
IsElevated = (dwIsElevated <> 0)
End If
Call CloseHandle(hToken)
End If
End Function
- 1. Vbscript detectar si UAC-elevated
- 2. No se puede detectar si un usuario se está ejecutando con privilegios elevados, cuando no hay ventanas emergentes UAC
- 3. ¿Cómo detectar si Vista UAC está habilitado?
- 4. ¿Cómo puedo saber si un proceso se está ejecutando?
- 5. ¿Puedo detectar si mi código se está ejecutando en cPython o Jython?
- 6. Comprobar si el proceso se está ejecutando
- 7. ¿Cómo puedo detectar si mi código se está ejecutando en la consola en Rails 3?
- 8. ¿Cómo puedo determinar si mi proceso se está ejecutando de forma interactiva?
- 9. ¿Cómo puedo saber si mi proceso se está ejecutando como administrador?
- 10. OSX: ¿Cómo detectar si se está ejecutando Mission Control?
- 11. Powershell: si un proceso no se está ejecutando, inícielo
- 12. ¿Cómo puedo detectar si mi ensamblado .NET se está ejecutando desde un sitio web o desde una máquina de escritorio?
- 13. Ejecutar proceso de elevado
- 14. iniciando un proceso elevado de UAC desde un servicio no interactivo (win32/.net/powershell)
- 15. ¿Cómo verificar si un proceso se está ejecutando con Delphi?
- 16. Comprobando si mi aplicación de Windows se está ejecutando
- 17. ¿Cómo detectar si mi aplicación se está ejecutando en una máquina virtual?
- 18. ¿Cómo detectar a través de Java si un proceso en particular se está ejecutando en Windows?
- 19. Cómo detectar si el iphone está sincronizado cuando la aplicación no se está ejecutando
- 20. ¿Cómo puede saber mi programa si Delphi se está ejecutando?
- 21. ¿Cómo puede mi programa detectar si se está ejecutando en un dominio en particular?
- 22. Detectar si el programa se está ejecutando con todos los derechos de administrador
- 23. ¿Cómo puedo detectar si Dispatcher.DisableProcessing está activo?
- 24. Comprobando si el proceso aún se está ejecutando?
- 25. ¿Cómo puedo probar si R se está ejecutando como Rscript?
- 26. Detectar si mi aplicación se está ejecutando en el IDE "Delphi 2007 .Net"
- 27. ¿Cómo puedo detectar si Python se está ejecutando como una aplicación de 64 bits?
- 28. ¿Cómo puedo detectar si IE8 se está ejecutando en la vista de compatibilidad?
- 29. ¿Cómo puedo detectar si un programa se está ejecutando desde dentro de valgrind?
- 30. Dentro de un archivo por lotes, ¿cómo puedo saber si se está ejecutando un proceso?
La función IsUserAnAdmin también podría ser útil. http://msdn.microsoft.com/en-us/library/windows/desktop/bb776463%28v=vs.85%29.aspx – jmnben