Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Privilegios en Aplicacion Delphi (https://www.clubdelphi.com/foros/showthread.php?t=75239)

gersojn 07-08-2011 14:52:26

Privilegios en Aplicacion Delphi
 
Hola, les cuento que estoy haciendo una aplicacion la cual necesita permisos de administrador para que algunas funciones sirvan, como leer el nombre del procesador por medio de un Registry, etc.

He estado investigando y encontre un hilo que explicaba como hacerlo, no agrego el link porque aun no puedo agregar, pero cito textualmente la solucion a la que llegan:

Cita:

Empezado por Chris (Mensaje 390584)
El XPManifiest (declarado en la unidad XPMan) lo único que hace es incluir un archivo de recursos llamado WindowsXP.res (este archivo está en la carpeta de recursos de Delphi).

Lo que tienes que hacer, es hacer una modificación del archivos WindowsXP.res y con un editor de registros cambia el único recurso #24 con el siguiente contenido:
Código:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="Delphi 7"
    version="7.1.0.0"
    processorArchitecture="*"/>
  <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="requireAdministrator"
          uiAccess="false"/>
        </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

Guarda en un archivo separado la nueva versión del archivo de recursos. Talvez le puedes nombrar vista_RequireAdministrator_manifiest.res. Luego en el proyecto quita toda referencia a XPManifiest y la unidad XPMan (es muy importante que hagas esto). Cuando ya lo hallas hecho, en cualquier parte del código de tu aplicación incluye una directiva de compilación {$R vista_RequireAdministrator_manifiest.res} indicando que adjunte el archivo manifiesto que has creado con el código que anteriormente te proporcione.

Saludos,
Chris

Bueno, el problema que yo tengo es que trabajo con Windows 7, y con Embarcadero2010, y bueno lo unico que tengo dentro de la carpeta de mi aplicacion es un Project1.res, no tengo ninguno mas, intente inicialmente modificar ese archivo agregandole el codigo anterior y luego no me ejecuto la aplicacion, despues cree un archivo_prueba.res pero no logre adjuntarlo, el codigo del Project1.res es:

Código:

        ÿÿ  ÿÿ                  ¨      ÿÿ ÿÿ    
        (      @                                                                    U_U €€€ ª €€€ €€€ €€€ €€€ ¤  U?U U_U U?U U_* U_U U?U U_U U_U U?U U_U U?U U_U U?U U_U                                €€€ U_U €€€ U_U €€€ €€€ ª €€€ ªŸª U_U ÿ ªU ª_U ª_U ª_U ª_U U?U U¿Ô UŸª UŸÿ  ¿Ô U¿ÿ UŸª U_U                        €€€ ª U ªU U?U €€€ U_U ª_ U ª €€€ U_U ªU ¤  ªU ª_U ª_U ªU U?U UŸª Uª  ßÔ Ußÿ  ¿Ô U¿Ô U?U                    €€€ €€€ ªŸ €€€ €€€ U_U U_U €€€ U_U ª U ÿ¿ª U_ ¤  ÿŸ ª_U ª_U ª_U ª_* U_U UŸª UŸÔ  ¿ÿ U¿Ô Ußÿ  ŸÔ U_U                €€€ €€€ ªŸ ª ª €€€ ª U_U U_U U_U U €€€ ª¿Ô U_U ÿ ªŸ ªU ª_* ª_U ª_U U?U ªŸª UŸª ª¿Ô  ¿ÿ  ¿ÿ UßÔ U?U            U €€€ ÿŸ ªŸª ªŸ ªŸ ª €€€ €€€ €€€ ªŸª UŸÔ ª¿Ô ÿÿÿ U_ ªŸU ÿŸª ª_U ª_U ª_U ª_U U_U U¿ª  ŸÔ Ußÿ ªßÔ Ußÿ  ŸÔ U_U        €€€ ªŸ ªŸ ¤  ÿŸ ªŸ ¤  €€€ ªª UŸª Uª UŸª ªŸª UŸÔ ª¿Ô UU U?U U?U U_U U?U U_U U_* U?U U?U U_U U?U U_U  ?U U?U U_U        €€€ ÿŸª ª¿ ÿŸ ªŸ ÿŸª €€€ UŸª UŸª Uª U_ª  ?  ?U U?U ªŸÔ U_U UŸÔ UŸÿ  ª U?Ô  ?Ô ÿ  _U ª¿ª UU UŸU U¿ U¿ª U¿U U?U    €€€ ¤  ¤  ÿŸª ÿ¿ ¤  ¤  €€€ UŸÔ UÔ U? ÀÜÀ €€€ ªŸª ªª ÀÜÀ ª_U  ÿ UÔ U_Ô  ?ª U?Ô  ?ª U?U UŸU UŸU U¿ U¿ª U¿ UŸU U?U    €€€ ÿŸª ÀÜÀ ÿŸª ¤  ÿ¿ª €€€ UÔ UŸª U_ª  ? ÀÜÀ ÿ¿Ô UŸª ªŸª ÀÜÀ U_ UÔ UŸÔ  Ô U?Ô  _Ô Uª U_U ª¿ª  U U¿ U¿ª U¿ UŸ U_U ª ªŸª ÀÜÀ ðʦ ÀÜÀ ÿ¿ª ¤  Uª  Ô UÔ  _ª  ?U ÿÌÿ ÀÜÀ U_  ?U ¤  U_ UŸÔ  Ô U_Ô  ?Ô  ?Ô ªª U?U U¿ª UŸU UŸU U¿ª U¿ U¿ U?U €€€ ¤  ÿßÔ ÿ¿Ô ðʦ ÀÜÀ ªŸª  _ª UÔ  _Ô U_ª  ?U ÿßÔ ª¿Ô U_  ? ª¿Ô U_U UŸÔ UÔ  Ô U?ª U_Ô  ?Ô U_U €€€ UU U¿ U¿ U¿ª U¿ U_* €€€ ÀÜÀ ÿÿÿ ÿßÔ ÀÜÀ ÿßÿ €€€  _Ô  _ª U_ª  _ª   ÀÜÀ ª¿Ô U?U U_ª ª¿Ô ªŸª U_ U_U U_U U_ U_U U_U U_ U_U U_U U_ U_U U_U U_U ªŸª €€€ ÿÿÿ ÿßÔ ÀÜÀ ÿ¿Ô ÀÜÀ U_ª  _ª U_Ô  _ª U?ª  ?U ÿßÔ ¤    _  ? UÔ ªßÔ ª¿Ô ªŸÔ ÀÜÀ ÿßÿ ª¿Ô ªŸª ª¿Ô ªßÿ ÿÿÿ ÀÜÀ ÿ¿Ô ªŸª ªŸ ªŸª U ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿßÔ  ?ª U?ª  _ª  _ª  _ª UU ªßÿ ¤  U?U U_ª  _ª UÔ UÔ  €€ U_ª ÀÜÀ €€€ U?U UÔ U¿Ô ªŸÔ UŸª €€€ ªŸ ¤  €€€ ª ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÀÜÀ  _ª  ?ª U?ª  ?ª  ?ª  ?U ÿßÔ ª¿ª  ?  ? UÔ U_ª  Ô U? U_ ÀÜÀ ªŸª  ?U Uª ªŸÔ U¿Ô ªª €€€ ªŸ €€€ ªŸª U ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÀÜÀ U?  ?ª  _ª U_ª U_ª  U ÀÜÀ ªŸÔ U_U  ?ª U_ª  Ô U_ª  _ U_ª ÀÜÀ ªª  ? Uª UŸÔ UŸÔ €€€ €€€ €€€ ªª €€€ ª ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ  _ª U_  _ª Uª  ?  ? ÿßÔ ¤    ? U?  _ª  _Ô U_ª  ? €€€ ª¿Ô €€€ U?  ª UŸÔ UŸÿ €€€ U_U €€€ €€€ €€€ U ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ªŸª U_ª U_Ô ªŸÔ U_ª  U ÿßÔ ¤  U?  ?  _ª U_ª  ?ª  U ªÔ ÀÜÀ U  ?U UÔ UÔ €€€ U €€€ ªU €€€ €€€ €€€ ÿßÔ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÀÜÀ UŸª ÀÜÀ Uª U_ª  U ÀÜÀ ªŸª U?U  €  _ª  ?  ?U U_ ÀÜÀ ªŸÔ U?  ?ª Uª  Ô Uª U?U U_U U_ UU ª €€€ ÀÜÀ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÌÿ ª¿ª U_ª  ?  U ÿÌÿ ÀÜÀ  ?  U  U  U U_ª ÿ¿Ô ÀÜÀ €€€  ?U  _ª  Ô U_Ô €€€ €€€ U_U U_U ª_ UU €€€ €€€ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ UŸÔ Uª U_  U ÀÜÀ ÀÜÀ ªŸª €€€ Uª ÿ¿ª ª¿Ô ÀÜÀ ªª    ?ª U_ª  _ª Uª €€€ UU ª_U U_ €€€ €€€    €€€ ÀÜÀ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ª¿ª U_ª  ?  U ÿÿÿ ÿßÔ ÿÌÿ ÀÜÀ ÿßÔ ª¿Ô ªŸª U?  U  ? U_ª  _ª Uª €€€ ªŸ ª_ €€€ U_U €€€        €€€ €€€ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ªŸª  ?  ?U  U  U  U  U  U  U  U  ?  ?  ?ª  ?ª  _ª ªª ªŸ €€€ ªŸ ª €€€ UU            €€€ ¤  ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ªŸª U?  ?    ?U    ?U    ?  ?  ?ª  ?ª U_ ªŸª ªŸ ªŸ ªŸ €€€ ªŸ €€€                €€€ €€€ ÿßÔ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÀÜÀ €€€  _ U?  ?  ?  ?  ? U?ª U_ €€€ ª¿Ô ÿŸ ªŸª ÿŸ ªŸª ª €€€ €€€                    €€€ €€€ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿßÿ ÀÜÀ ª¿ª ªŸª ¤  ªŸÔ ª¿ª ÀÜÀ ÀÜÀ ÿŸª ª¿ ÿŸ ªŸ ªŸ ªŸ €€€                            €€€ €€€ ÿßÔ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿßÔ ÀÜÀ ÿÌÿ ðʦ ðʦ ª¿ª ÿŸª ª¿ª ÿŸ €€€ €€€                                    €€€ €€€ ¤  ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿßÔ ÿßÔ ÀÜÀ ÿÌÌ ÿ¿ª ª¿ª ÿŸ €€€ €€€                                            €€€ €€€ €€€ ÀÜÀ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÀÜÀ ÿ¿Ô ÀÜÀ ÿ¿ª ªŸª €€€ €€€                                                        €€€ €€€ €€€ ¤  ÀÜÀ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÿÿ ÿÌÌ ÀÜÀ ¤  €€€ €€€                                                                        €€€ €€€ €€€ €€€ €€€ €€€ €€€ €€€ €€€ €€€ €€€ €€€                                        ÿÀ  ÿ  ü  ø  ð  à  À  À  €  €                                                  €  €  À  À  à  ð  ø  ü  ?ÿ  ÿÿÀÿ  0  ÿÿ M A I N I C O N        
                 ¨   R      ÿÿ ÿÿ    
        <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <assemblyIdentity
    type="win32"
    name="CodeGear RAD Studio"
    version="14.0.3513.24210"
    processorArchitecture="*"/>
  <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>

Copiado con Bloc de notas, alguien me puede ayudar con este problema, ya intente varias cosas, pero no logro hacerlo.

De antemano muchas gracias por la ayuda.

escafandra 07-08-2011 22:52:28

Tal vez te interese leer esto.

Saludos.

Chris 07-08-2011 23:47:54

Cita:

Empezado por gersojn (Mensaje 408776)
Hola, les cuento que estoy haciendo una aplicacion la cual necesita permisos de administrador para que algunas funciones sirvan, como leer el nombre del procesador por medio de un Registry, etc.

Para leer el nombre del procesador no es necesario que tu aplicación tenga privilegios de administrador. Simplemente establece la propiedad ReadOnly de TRegistry a True y dicho componente no te producirá problemas al leer cualquier clave/valor del registro.

Saludos,
Chris

gersojn 08-08-2011 00:09:29

Hola, gracias por las respuestas
 
Bueno, veran tengo el siguiente codigo

Código Delphi [-]
function NombreProcesador:string;
var
Registro:TRegistry;
begin

  Result:='';
  Registro:= TRegistry.Create;
  try
    Registro.RootKey:= HKEY_LOCAL_MACHINE;
    if Registro.OpenKey('\Hardware\Description\System\CentralProcessor\0', True) then
     Result:= Registro.ReadString('ProcessorNameString');
  finally
  Registro.Free;
  end;
end;

No se como colocar el TRegistry a true, tampoco puedo colocarlo a Readonly.

En cuanto a compilar con brcc35 el archivo.RC, pues, lo compile todo bien, y me genero el archivo.RES (Nota: no se si habra problema con la extension, si sea necesario, archivo.res, ya que yo tengo archivo.RES) despues agrego
Código Delphi [-]
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, ComCtrls, Registry;{$r win7.RES}

No me genera ningun tipo de error, solo unos warning
Código:

[DCC Warning] W1056 Warning: Duplicate resource:  Type 24 (user-defined), ID 1; File C:\Users\gersojn\Documents\RAD Studio\Projects\Tarea\Nombre_Procesador\Project1.res resource kept; file C:\Users\gersojn\Documents\RAD Studio\Projects\Tarea\Nombre_Procesador\win7.RES resource discarded.
Pero no me presenta el nombre del procesador, debo de integrar el RES al proyecto desde el Embarcadero, porque solo lo he agregado a la carpeta del proyecto , tambien hize una prueba agregandolo a Project -> Resources, pero tampoco.

Que puedo hacer al respecto? de antemano muchas, gracias.

escafandra 08-08-2011 00:20:52

En Win7 es mas complicado ejecutar como administrador que usar un archivo de recursos.

Para tu caso la función puedes hacerla así:

Código Delphi [-]
function NombreProcesador:string;
var
Registro:TRegistry;
begin

  Result:='';
  Registro:= TRegistry.Create;
  Registro.Access:= KEY_READ;
  try
    Registro.RootKey:= HKEY_LOCAL_MACHINE;
    if Registro.OpenKey('\Hardware\Description\System\CentralProcessor\0', True) then
     Result:= Registro.ReadString('ProcessorNameString');
  finally
  Registro.Free;
  end;
end;

Saludos.

Chris 08-08-2011 00:25:12

Utiliza este código:
Código Delphi [-]
function NombreProcesador:string;
var
Registro:TRegistry;
begin

  Result:='';
  Registro:= TRegistry.Create;
  try
    Registro.ReadOnly := True; // esto es lo que te intente decir
    Registro.RootKey:= HKEY_LOCAL_MACHINE;
    if Registro.OpenKey('\Hardware\Description\System\CentralProcessor\0', True) then
     Result:= Registro.ReadString('ProcessorNameString');
  finally
  Registro.Free;
  end;
end;

Saludos,
Chris

gersojn 08-08-2011 00:28:40

Gracias
 
muchas gracias por las respuestas, ya funciona excelente el programa con la funcion anterior

Código Delphi [-]
function NombreProcesador:string; 
var 
  Registro:TRegistry; 
begin    
  Result:= '';   
  Registro:= TRegistry.Create;   
  Registro.Access:= KEY_READ;   
  try     
    Registro.RootKey:= HKEY_LOCAL_MACHINE;     
    if Registro.OpenKey('\Hardware\Description\System\CentralProcessor\0', True) then      
      Result:= Registro.ReadString('ProcessorNameString');   
   finally   
     Registro.Free;   
  end; 
end;

Muchas gracias por la ayuda.


La franja horaria es GMT +2. Ahora son las 18:38:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi