Personalizando un archivo de manifiesto EXE
Cuando compilas un proyecto para una plataforma de destino Windows, RAD Studio incluye automáticamente un archivo de manifiesto de aplicación. Puedes usar el archivo de manifiesto de aplicación predeterminado como base para tu archivo de manifiesto de aplicación personalizado:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*"/>
</dependentAssembly>
</dependency>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Creando un archivo de manifiesto de aplicación personalizado
Para hacerlo, solo necesitas un programa Resources hacker/inspector que te permita cambiar el manifiesto de un archivo EXE.
Personalmente uso el software de Angus Johnson desde hace mucho tiempo porque es simple y fácil de usar.
Cambiando el nivel de elevación requerido
El manifiesto de aplicación predeterminado declara el nivel de elevación requerido como asInvoker
. Eso significa que tu aplicación tendrá el mismo nivel de elevación que su proceso padre. Si deseas elevar tu aplicación al nivel de privilegio de Administrador en Windows, simplemente cambia el valor del atributo level en la etiqueta requestedExecutionLevel
de asInvoker
a requireAdministrator
.
Puedes agregar eso a la sección TrustInfo
y a la etiqueta <security>
donde agregarás tanto el Level
como el uiAccess
al Nivel de Ejecución Solicitado:
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
-
uiAccess
-
false — La aplicación no necesita enviar entradas a la interfaz de usuario de otra ventana en el escritorio. Las aplicaciones que no proporcionan accesibilidad deben establecer este indicador en false. Las aplicaciones que necesiten enviar entradas a otras ventanas en el escritorio (por ejemplo, teclado en pantalla) deben establecer este valor en true.
-
true — La aplicación puede omitir los niveles de protección de la interfaz para enviar entradas a ventanas con privilegios superiores en el escritorio. Esta configuración debe usarse solo para aplicaciones de accesibilidad de UI.
-
-
Level : Aquí puedes encontrar una tabla que explica el Nivel declarado en el manifiesto de la aplicación y su comportamiento
**
Cambiando la conciencia DPI
Para crear una aplicación consciente del DPI, necesitas declarar la conciencia DPI en el manifiesto de la aplicación. Por ejemplo, para declarar que tu aplicación es consciente del DPI por monitor, añade lo siguiente antes de la etiqueta de cierre </assembly>
:
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>True/PM</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
Probando los privilegios de administrador
El siguiente fragmento de código puede servir como una prueba rápida para verificar si tu aplicación requiere (y tiene concedidos correctamente) privilegios de nivel Administrador. Declara el nivel de elevación requerido de tu aplicación como requireAdministrator
y ejecuta el siguiente procedimiento:
C++:
#include <System.Win.Registry.hpp>
#include <Winapi.Windows.hpp>
void __fastcall isAdmin(TObject *Sender){
TRegistry *reg;
bool openResult;
reg = new TRegistry(KEY_READ);
reg->RootKey = HKEY_LOCAL_MACHINE;
reg->Access = KEY_WRITE;
openResult = reg->OpenKey("Software\\MyCompanyName\\MyApplication\\" , true);
if (openResult != true){
MessageDlg("No se puede escribir en el registro. Su aplicación NO tiene privilegios de nivel Administrador.",
TMsgDlgType::mtError, mbOKCancel, 0);
}else{
MessageDlg("Escritura en el registro permitida. Su aplicación tiene privilegios de nivel Administrador.",
TMsgDlgType::mtInformation, mbOKCancel, 0);
}
reg->CloseKey();
reg->Free;
}
-
La aplicación mostrará uno de los siguientes mensajes:
-
No se puede escribir en el registro. Su aplicación NO tiene privilegios de nivel Administrador.
-
Escritura en el registro permitida. Su aplicación tiene privilegios de nivel Administrador.
-
Esta prueba funciona porque necesitas privilegios de nivel Administrador para escribir en la parte HKEY_LOCAL_MACHINE\Software
del registro.
El fragmento en realidad no escribe nada en el registro, solo solicita el permiso de escritura.
Asegúrate de compilar tu aplicación y luego ejecutarla fuera del IDE, porque el IDE depurará la aplicación con privilegios de nivel Administrador por defecto (sin respetar tu manifiesto de aplicación).
© 2021 - Sofiane Hamlaooui - Haciendo del mundo un lugar mejor 🌎
Discusión
Deja un Comentario
Los comentarios de invitados serán revisados antes de aparecer en el sitio.
Aún no hay comentarios. ¡Sé el primero en iniciar la discusión!