2009-11-05 26 views
5

Tengo varias aplicaciones de larga duración escritas en Delphi que persisten en su configuración en el registro. He usado HKEY_LOCAL_MACHINE para configuraciones 'duras' como las preferencias de configuración y HKEY_CURRENT_USER para información 'suave' como posiciones de ventanas, listas de MRU, etc.Acceso al registro en modo no administrador

Ahora mis usuarios me dicen que en modo no administrador (usuario estándar) las aplicaciones no funcionan Al mirar, veo que no puedo leer una configuración puesta en HKEY_LOCAL_MACHINE cuando la aplicación estaba en modo de administración.

¿Cuáles son mis opciones para esto? Sé poco sobre el modo estándar y cómo esto afecta el acceso al registro en absoluto. Cualquier información apreciada.

+3

Consejo: Es posible que desee para tratar de desarrollar bajo una cuenta no-poder-usuario. Sí, puede ser un poco molesto a veces, pero de esta manera te aseguras de que las "sorpresas" como las que acabas de encontrar no te golpeen en la cara. Es una política corporativa en muchas tiendas de desarrollo por una buena razón. –

+0

¿Cómo se comportaría su aplicación en Windows 2000 o Windows XP como usuario estándar? Eso lo guiará sobre cómo debe comportarse en Windows Vista o Windows 7 como usuario estándar. –

Respuesta

14

Puede leer de HKLM como un usuario que no es administrador; simplemente no puedes escribir.

Use TRegistry.Create (KEY_READ) al construirlo, y configure la RootKey en HKLM.

var 
    Reg: TRegistry; 
begin 
    Reg := TRegistry.Create(KEY_READ) 
    try 
    Reg.RootKey := HKLM; 
    // Read value here 
    finally 
    Reg.Free; 
    end; 
end; 

También puede utilizar TRegistry.OpenKeyReadOnly() al abrir una clave específica del registro; esto también ayuda con el acceso no administrativo a áreas del registro.

+0

Lo más probable es que no esté utilizando solo lectura con su código existente, razón por la cual falla. El uso de la solución de Ken debería arreglarlo para usted con los menores cambios. –

+0

Eso es genial Ken, justo lo que estaba buscando. –

+1

@Brian: Me alegro de poder ayudar. También debería considerar el comentario de Paul-Jan a su pregunta; probablemente deberías probar al menos bajo una cuenta que no sea de administrador para detectar este tipo de cosas. MS comenzó a ajustar cosas (voluntariamente) con XP, y ha estado aplicando más de las restricciones desde el lanzamiento de Vista. –

0

Sus opciones incluyen (a) usar un archivo de configuración INI/XML en una ubicación que no requiere acceso de administrador, o (b) modificar la seguridad en su propia subclave en HKLM usando una herramienta como SetACL (public dominio).

El problema con la opción a es el cambio en los arreglos de carpetas entre XP y Vista/W7. Creo que Vista aumentó el acceso a CSIDL COMMON APPDATA: los usuarios estándar no tienen acceso de escritura si la memoria le sirve. Puede que tenga que almacenarlos en su propia carpeta y organizar los derechos de acceso usted mismo. Molesto.

Un problema interesante con la opción b es que ahora hay pequeñas herramientas oficiosas en uso en entornos corporativos que rastrean el registro y "corrigen" los derechos de acceso que creen que son incorrectos. Todavía no hemos tenido problemas con los clientes que los usan, pero sabemos que existen. Dado el rendimiento del registro, seguimos prefiriendo el enfoque HKLM modificado y continuaremos haciéndolo en el futuro previsible.

+2

El problema con la opción B es que viola los principios básicos de la seguridad de Windows que MS y las aplicaciones han estado tratando de implementar desde la introducción de XP, y se aplican desde el lanzamiento de Vista. Excluirlos cambiando la seguridad en el registro es una mala práctica de programación. Su instalador debe ejecutarse como administrador y, si es necesario, escribir a HKLM en ese momento. Su aplicación debe ejecutarse como no administrador y debe leer (no escribir en) HKLM de la manera adecuada, según sea necesario. Soluciones arriesgadas como cambiar la seguridad son solo eso - hacks - que deberían evitarse. La seguridad de Corp también lo odia. –

+1

Por extraño que pueda parecer, de hecho estoy de acuerdo contigo. Ojalá no tuviéramos que hacer esto. Estábamos todos listos para cambiar a usar un sistema de archivos cfg a través de Common Appdata cuando MS cambió las reglas de acceso para eso en Vista. Hasta que MS reconozca que hay clases de sistemas que necesitan una aplicación que no sea de administración para cambiar las configuraciones que afectan a otros usuarios, estamos estancados. –

+0

@Bob: Pueden reconocerlo pero la elección no es fácil. Es lo mismo con la ubicación de los archivos de datos comunes. No tener una ubicación que sea de escritura mundial en una instalación predeterminada parece una buena idea cuando se considera la seguridad. Una instalación estándar de un sistema tipo Unix tampoco tiene esa ubicación. root/Administrator puede crear manualmente dicha ubicación y, posiblemente, configurar una cuota para evitar que un usuario malintencionado llene todo el espacio vacío en la partición/unidad. – mghie

1

Una opción, que no me gusta, pero mencionaré, es dar permiso a todos (o un grupo definido, etc.) para acceder a su clave. Hay varias maneras de hacerlo, y hay un código en el JCL que lo hará, o puede usar Regedit. Pero si le das permiso (a esa rama específica de HKLM), funcionará según lo previsto.

+1

Esta es una muy mala idea. Hay razones por las que los que no son administradores pueden escribir en HKLM; pudiendo escribir hay un vector de ataque para virus y malware. Evitarlo porque eres demasiado flojo para hacer las cosas bien y probarlas de la manera correcta simplemente no es una buena idea. –

+0

Estoy de acuerdo, por lo tanto, yo no lo estoy favoreciendo. Pero si esta es una aplicación interna utilizada por tres personas, entonces puede ser aceptable. Y afectaría solo esa aplicación. Ciertamente no es algo que hacer para una nueva aplicación, o cualquier aplicación distribuida en masa. Para ellos, hazlo bien. – mj2008

2

La otra cosa que nadie menciona aquí es el problema de la virtualización del registro en Vista & Win7 (al menos). Puede que no sea un problema en su situación particular, pero pensé que lo mencionaría de todos modos en caso de que fuera relevante.
Incluso si su usuario tiene derechos de administrador, si su aplicación NO se ejecuta "elevada" en Vista/Win7, su aplicación aún no podrá escribir en la clave HKLM "real" que usted cree que es. Se leerá y escribirá en una copia virtualizada de la clave HKLM apropiada que solo ese usuario en particular ve.
Por "elevado", quiero decir que se le habrá preguntado con un aviso de UAC en Vista/Win7. Ejecute Regedit.exe, por ejemplo, en Vista/Win7, y se le preguntará con un aviso de UAC.
Si está en Vista/Win7, es posible que este sea el problema que describe cuando dice que no es posible leer una clave/valor escrito en modo de administrador. De ser así, esto se debe a que su aplicación en algún momento ha escrito lo que ahora es una clave/valor virtualizado; su aplicación ahora solo verá esa clave/valor, incluso si un administrador modifica el valor "real".
Como han dicho otros, su aplicación no debería intentar escribir en HKLM. Si usted siente que necesita escribir en HKLM, a continuación, en Vista/Win7 son sus opciones (y estas opciones se pueden hacer para trabajar bien en XP también):

  • Añadir un manifiesto a la aplicación que requiere derechos de administrador elevados según este example.
  • Divida su funcionalidad requiriendo acceso HKLM en una biblioteca COM separada e instalándola como un objeto COM elevado cuando lo necesite. Esto es más complicado, pero es una forma razonable de refactorizar la funcionalidad existente.

Here es otra pregunta de SO que aborda algunos de estos problemas.

+0

La pregunta era acerca de * reading * from HKLM, no escribir en, por lo que la virtualización de registro no se aplica. –

+0

BTW, no downvoting porque, a pesar de que no tiene nada que ver con la pregunta en cuestión, sigue siendo una buena información. –

+0

@Ken: leyendo entre líneas la pregunta original, mi interpretación razonable fue que la aplicación de OP usa HKLM para almacenar las "preferencias" de configuración, lo que implica leer Y escribir. –

1

Desde la perspectiva del desarrollador, el UAC de Windows puede ser problemático para algunas partes de su aplicación Delphi, si la aplicación no está siendo ejecutada por un administrador. Una de esas operaciones es escribir en la base de datos del Registro.

usted tiene que "solicitar derechos de administrador" mediante la creación de un archivo de manifiesto de aplicación ....

Windows Vista/7 - Control de cuentas de usuario

usuario Control de cuentas es un componente de seguridad en Windows Vista . UAC permite a los usuarios realizar tareas comunes como no administradores, llamados usuarios estándar en Windows Vista y como administradores sin tener que cambiar de usuario, cerrar sesión o usar Ejecutar como. Para ayudar a evitar que el software malicioso se instale silenciosamente y provoque una infección en toda la computadora, Microsoft desarrolló la función UAC.

Desde la perspectiva del desarrollador las siguientes características UAC son importantes:

Todos los procesos se inician como usuario estándar por defecto un usuario estándar no puede: cambiar los archivos en carpetas Archivos de programa cambiar los archivos en las carpetas de Windows o System32 cambio de registro en HKLM \ Software cambiar la fecha y la hora local de máquinas ... la lista continúa ...

programación de edición del registro para ejecutar su aplicación Delphi en Windows Sta rtup

Al editar mediante programación el Registro de Windows, utilizando el objeto TRegistry, puede iniciar programas "automágicamente" cada vez que se inicie Windows. El procedimiento se puede utilizar a la fuerza "auto-run-on-Windows-arranque" para su aplicación podría ser:

procedure RunOnStartup(const sCmdLine: string; bRunOnce: boolean = false; Remove: Boolean = false) ; 
var 
    sKey: string; 
    Section: string; 
const 
    ApplicationTitle = ”Your Application TITLE”; 
begin 
    if (bRunOnce) then 
    sKey := 'Once' 
    else 
    sKey := ''; 

    Section := 'Software\Microsoft\Windows\CurrentVersion\Run' + sKey + #0; 

    with TRegIniFile.Create('') do 
    try 
     RootKey := HKEY_LOCAL_MACHINE; 
     if Remove then 
     DeleteKey(Section, ApplicationTitle) 
     else 
     WriteString(Section, ApplicationTitle, sCmdLine) ; 
    finally 
     Free; 
    end; 
end; 

En Vista/7, si el usuario ejecuta la aplicación no tiene derechos de administrador las el código anterior fallaría, debido a UAC!

Fingiendo UAC Derechos - ¿Cómo Solicitar nivel de ejecución

Incluso si el usuario que ejecuta el código anterior no es un administrador, puede, como desarrollador brazo su aplicación con un tipo especial de recurso incrustado: aplicación archivo de manifiesto Tener el archivo de manifiesto asegurará que el UAC de Vista permita la ejecución de su código.

Estos son los pasos:

crear el archivo XML con el contenido siguiente:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0] 
    <assemblyIdentity version="1.1.1.1" 
    processorArchitecture="X86" 
    name="YourApplicationExeName" 
    type="win32"/> 
    <description>elevate execution level</description> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2] 
    <security> 
    <requestedPrivileges> 
    <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/> 
    </requestedPrivileges> 
    </security> 
    </trustInfo> 
</assembly> 

Nombre este archivo XML como YourApplicationName.manifest Crear un archivo de texto con el siguiente contenido: 1 24 "YourApplicationName. manifiesto "

Nombre este archivo de texto como YourApplicationName.RC usando la línea de comando ejecute el siguiente comando: brcc 32 YourApplicationName.RC -foYourApplicationName.REC

Esto creará un archivo nuevo recurso llamado YourApplicationName.REC

Copiar este archivo YourApplicationName.REC en la ruta del recurso de su aplicación. Integrar este recurso en el DPR de que la aplicación, ya que al igual que: {$R YourApplicationName.REC}

Finalmente generar la aplicación - que ahora está listo para obtener derechos de administrador en Windows Vista. Nota 1: en los pasos anteriores, reemplace "YourApplicationExeName" con su nombre de aplicación real. Nota 2: Los pasos anteriores crean un archivo de recursos para almacenar dentro del archivo EXE de su aplicación. Más sobre Recursos en aplicaciones Delphi.

leer más en http://delphi.about.com/od/delphitips2009/qt/delphi-vista-registry-run-on-startup.htm

Cuestiones relacionadas