2011-05-23 18 views
8

Oye, quiero usar variables de entorno de Windows como valor para una entrada de registro. Desafortunadamente no puedo escribir algo como %systemroot%\system32\MyScreensaver.scr.Utilizando variables de entorno de Windows como valores de registro en el Instalador de Visual Studio

Como puede adivinar, quiero apuntar algunos valores de reg a mi propia aplicación, como el inicio automático y el protector de pantalla y algunas otras cosas.

¿Alguna idea?

+0

Otras formas de configurar un programa para el inicio automático y configurar un protector de pantalla particular usando el instalador VS son bienvenidas :) –

+0

Agregué mi respuesta que no requiere ninguna codificación. Mi respuesta es más para alguien que no busca codificar algo en una aplicación, pero que los administradores de red lo usan más. ;) –

Respuesta

8

El registro de Windows lo admite de forma nativa con el tipo de valor de registro REG_EXPAND_SZ.

Simplemente use REG_EXPAND_SZ en lugar de cuando desee incrustar variables de entorno en el valor de clave de registro.

Aquí es un ejemplo de código de C# para acceder a un REG_EXPAND_SZ y la expansión se maneja automáticamente:

var registry = Registry.CurrentUser.OpenSubKey("Environment"); 
var temp = registry.GetValue("TEMP") as string; 

Aquí es un ejemplo de la creación de un valor de registro expansible:

registry.SetValue("TEMP", @"%USERPROFILE%\AppData\Local\Temp", RegistryValueKind.ExpandString); 

otras plataformas o scripting los idiomas tienen otros mecanismos para apoyar esto. Aquí es el bajo nivel de Win32 Descripción del REG_EXPAND_SZ:

5

Puede utilizar el instalador de Windows formatted type. Por ejemplo, su valor de registro puede ser:

[%SystemRoot]\system32\MyScreensaver.scr 

De esta forma, Windows Installer resolverá automáticamente la variable de entorno durante la instalación.

+1

desearía poder marcar dos respuestas como correctas. –

1

Es un poco complicado pero muy fácil de hacer. Este ejemplo le permitiría abrir un cierto tipo de archivo (* .test) con un programa (Notepad ++) que reside en un directorio específico del usuario. Lo usé para un escenario en mi servidor de Windows 2008 ejecutando Remote Desktop (AKA Terminal Server) para permitir que cada usuario use una cuenta de usuario PER instalada en el programa para que se puedan usar diferentes configuraciones por usuario (por ejemplo: * archivos .ini ubicados dentro del directorio de aplicaciones). Nota: No es que importe, pero la carpeta "programas" está oculta para que los usuarios no la vean.

Paths: 
Application (notepad++): Y:\%username%\programs\Notepad++\notepad++.exe 
File To Open (File.test): Y:\%username%\TestFiles\File.test 

Paso 1. si está utilizando perfiles obligatorios asegúrese de cambiar el archivo de nuevo a NTUSER.MAN NTUSER.DAT.

Paso 2. Inicie sesión en el perfil que desee editar utilizando Remote Desktop Client.

Paso 3. Abra regedit y elimine las siguientes claves si existen.

HKEY_CURRENT_USER \ Software \ Classes \ Aplicaciones \ Notepad ++. Exe HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts.test

Paso 4. Crea un nuevo archivo de texto y llámalo "original.reg". Rellenar con el siguiente ...

Windows Registry Editor Version 5.00 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe] 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell] 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell\open] 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell\open\command] 
@="" 

Paso 5. Registro Actualizar (F5) y buscar la nueva clave. Debería ver la tecla "comando" con el valor "(Predeterminado)" en blanco. En la tecla "comando", agregue un nuevo "Valor de cadena expandible" llamado "Nuevo valor n.º 1". Establezca el valor en la ruta de la aplicación "Y: \% username% \ programs \ Notepad ++ \ notepad ++. Exe" "% 1". Luego exporte la clave "comando" al escritorio como "expand.reg".

Paso 6. Editar el archivo "expanded.reg" en el bloc de notas y copiar todos los datos después de la "Nuevo valor # 1". Ejemplo: = hex (2): 22 ...

Windows Registry Editor Version 5.00 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell\open\command] 
@="" 
"New Value #1"=hex(2):22,00,59,00,3a,00,5c,00,25,00,75,00,73,00,65,00,72,00,6e,00,\ 
61,00,6d,00,65,00,25,00,5c,00,70,00,72,00,6f,00,67,00,72,00,61,00,6d,00,73,\ 
00,5c,00,4e,00,6f,00,74,00,65,00,70,00,61,00,64,00,2b,00,2b,00,5c,00,6e,00,\ 
6f,00,74,00,65,00,70,00,61,00,64,00,2b,00,2b,00,2e,00,65,00,78,00,65,00,22,\ 
00,20,00,22,00,25,00,31,00,22,00,00,00 

Paso 7. Cerrar archivo expanded.reg y abrir el archivo "original.reg" vuelva a colocar el comando por defecto (es decir vacía "") con el nuevo valor hexadecimal que tenemos en nuestro portapapeles. El archivo "original.reg" debería tener el siguiente aspecto ahora ...

Windows Registry Editor Version 5.00 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe] 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell] 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell\open] 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell\open\command] 
@=hex(2):22,00,59,00,3a,00,5c,00,25,00,75,00,73,00,65,00,72,00,6e,00,\ 
61,00,6d,00,65,00,25,00,5c,00,70,00,72,00,6f,00,67,00,72,00,61,00,6d,00,73,\ 
00,5c,00,4e,00,6f,00,74,00,65,00,70,00,61,00,64,00,2b,00,2b,00,5c,00,6e,00,\ 
6f,00,74,00,65,00,70,00,61,00,64,00,2b,00,2b,00,2e,00,65,00,78,00,65,00,22,\ 
00,20,00,22,00,25,00,31,00,22,00,00,00 

Paso 8. Ahora que tenemos nuestra lista ampliada variable para ir sólo permite agregar una extensión a asociar a la aplicación. Añadir lo siguiente al archivo "original.reg" dándole un aspecto como el siguiente ...

Windows Registry Editor Version 5.00 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe] 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell] 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell\open] 

[HKEY_CURRENT_USER\Software\Classes\Applications\notepad++.exe\shell\open\command] 
@=hex(2):22,00,59,00,3a,00,5c,00,25,00,75,00,73,00,65,00,72,00,6e,00,\ 
61,00,6d,00,65,00,25,00,5c,00,70,00,72,00,6f,00,67,00,72,00,61,00,6d,00,73,\ 
00,5c,00,4e,00,6f,00,74,00,65,00,70,00,61,00,64,00,2b,00,2b,00,5c,00,6e,00,\ 
6f,00,74,00,65,00,70,00,61,00,64,00,2b,00,2b,00,2e,00,65,00,78,00,65,00,22,\ 
00,20,00,22,00,25,00,31,00,22,00,00,00 

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.test] 

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.test\OpenWithList] 
"a"="notepad++.exe" 
"MRUList"="a" 

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.test\OpenWithProgids] 
"Notepad++_file"=hex(0): 

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.test\UserChoice] 
"Progid"="Applications\\notepad++.exe" 

Paso 9. Abrir regedit y elimine las claves siguientes si existen. (Sí, de nuevo) ... ¡Ahora el registro es como que nunca hicimos nada y tenemos un archivo de registro listo para insertar en el registro!

HKEY_CURRENT_USER \ Software \ Classes \ Aplicaciones \ Notepad ++. Exe HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts.test

Paso 10. Si desea aplicar esta al perfil actual, luego EJECUTAR EL ARCHIVO DE REGISTRO "original.reg" e insertarlo en el registro.

¡Y eso es todo! Ahora todos los archivos * .test se abrirán con "Y: \% username% \ programs \ Notepad ++ \ notepad ++. Exe". Ve a ver el registro y mira la nueva entrada predeterminada.

0

utiliza una cadena expandible

DWORD = dword: cadena expandible = hex (2): String Multi = hex (7):

Una DWORD es un entero sin signo de 32 bits (rango: 0 a 4294967295 decimal) En el registro, un DWORD siempre comienza con 0x. En el registro, DWORDS siempre tiene 8 dígitos que siguen 0x. Puede ser en formato decimal o hexadecimal, 1000 se puede escribir como: 0x00001000 o 0x000003e8

DWORDS solo puede hacer uso de los dígitos 0-9. Las cadenas, de cualquier tipo, siempre usan ASCII, en ACSII 1000 solo se pueden escribir como 31,30,30,30. Para el tipo de datos String, ASCII funciona en segundo plano sin que lo sepas. Tiene que hacerlo porque la computadora solo comprende 1s y 0s.Para los tipos de datos de Cadena ampliable y Cadena múltiple, estos guardan sus entradas como una serie de códigos ASCII en formato hexadecimal, separados por comas y ceros hexadecimales. Entonces, una Cadena Expansible de 1000 sería: hex (2): 31,00,30,00,30,00,30,00

Convertiremos% PROGRAMFILES% en una cadena expansible. Primero, descargue esto: https://hotfile.com/dl/244097278/55aa086/ASCII_2_HEX_Conversion_Tool.7z.html

Ahora abra eso en cualquier navegador moderno. Coloque% PROGRAMFILES% en el cuadro ASCII y seleccione codificarlo. Le dará% 25% 50% 52% 4F% 47% 52% 41% 4D% 46% 49% 4C% 45% 53% 25 Copie y pegue en un editor de texto, mueva el primer% hasta el final. Seleccione el comando de reemplazo, encuentre todo el "%" y reemplace con ", 00". Retire la coma al final. Debe obtener: 25,00,50,00,52,00,4F, 00,47,00,52,00,41,00,4D, 00,46,00,49,00,4C, 00,45, 00,53,00,25,00 Y finalmente, hex (2): 25,00,50,00,52,00,4F, 00,47,00,52,00,41,00,4D, 00,46 , 00,49,00,4C, 00,45,00,53,00,25,00

Hecho.

Alguna vez ha intentado convertir una curiosa entrada de registro hexadecimal en ASCII y ha fallado miserablemente. Esta lección contiene todo el conocimiento requerido para realizar ingeniería inversa de cualquier entrada de registro codificada hexadecimal que no esté encriptada. ¡Que te diviertas!

1

Esta expansión en la respuesta de Rick Sladkey:

Había respondido REG_EXPAND_SZ le permitirá utilizar las variables ambientales que es correcta pero también se debe tener en cuenta que algunas funcionalidades de registro sólo funcionará con la entrada predeterminada de una tecla. Por ejemplo, supongamos que desea configurar un comando para el menú de contexto en el shell de Windows llamada Ejemplo (accesible cuando clic derecho en el fondo de una carpeta):

[HKEY_CLASSES_ROOT\Directory\Background\shell\Example\command] 

y el comando que desea introducir es:

cmd.exe /s /c echo Your home path is located at %homedrive%%homepath% & pause 

Esto solo funcionará si la entrada predeterminada es REG_EXPAND_SZ, mientras que las entradas predeterminadas creadas por Regedit al crear una clave son REG_SZ. Si está utilizando Regedit, tendrá que hacer algunas acrobacias para convertir la entrada predeterminada de REG_SZ a REG_EXPAND_SZ, ya que Regedit no puede hacerlo por sí mismo. Aquí está el trabajo necesario para hacer esto:

Volviendo a mi ejemplo, dentro de la clave de comando, crea una entrada REG_EXPAN_SZ. Haga doble clic en él e ingrese su comando de elección. Por ejemplo:

cmd.exe /s /c echo Your home path is located at %homedrive%%homepath% & pause 

La entrada que acaba de crear no será la entrada por defecto y en este punto de la cáscara no puede ejecutarlo. Para solucionar esto, haga clic con el botón derecho en la clave de registro del comando y expórtela como command.reg. El archivo de registro exportado debe tener el siguiente aspecto:

Windows Registry Editor Version 5.00 

[HKEY_CLASSES_ROOT\Directory\Background\shell\Example] 

[HKEY_CLASSES_ROOT\Directory\Background\shell\Example\command] 
@="" 
"New Value #1"=hex(2):63,00,6d,00,64,00,2e,00,65,00,78,00,65,00,20,00,2f,00,73,\ 
    00,20,00,2f,00,63,00,20,00,65,00,63,00,68,00,6f,00,20,00,59,00,6f,00,75,00,\ 
    72,00,20,00,68,00,6f,00,6d,00,65,00,20,00,70,00,61,00,74,00,68,00,20,00,69,\ 
    00,73,00,20,00,6c,00,6f,00,63,00,61,00,74,00,65,00,64,00,20,00,61,00,74,00,\ 
    20,00,20,00,25,00,68,00,6f,00,6d,00,65,00,64,00,72,00,69,00,76,00,65,00,25,\ 
    00,25,00,68,00,6f,00,6d,00,65,00,70,00,61,00,74,00,68,00,25,00,20,00,26,00,\ 
    20,00,70,00,61,00,75,00,73,00,65,00,00,00 

Obviamente, el hash variará si está utilizando un comando diferente.Para convertir la entrada REG_EXPAND_SZ en la entrada por defecto, basta con borrar el @ = "" línea y cambiar el nombre

"New Value #1"=hex(2)....etc...etc 

a

@=hex(2)....etc...etc 

(tenga en cuenta que no hay comillas alrededor del @ aquí).

Una vez que haya realizado su mod, simplemente fusione command.reg y la entrada predeterminada ahora estará en formato REG_EXPAND_SZ.

Cuestiones relacionadas