Использование переменных среды Windows в качестве значений реестра в установщике Visual Studio - PullRequest
8 голосов
/ 23 мая 2011

Эй, я хочу использовать переменные среды Windows в качестве значения для записи в реестре. К сожалению, я не могу просто написать что-то вроде %systemroot%\system32\MyScreensaver.scr.

Как вы можете догадаться, я хочу указать некоторые значения reg для моего собственного приложения, такие как автозапуск и заставка и некоторые другие вещи.

Есть идеи?

Ответы [ 6 ]

8 голосов
/ 24 мая 2011

Реестр Windows поддерживает это изначально с типом значения реестра REG_EXPAND_SZ.

Просто используйте REG_EXPAND_SZ вместо REG_SZ, если вы хотите встроить переменные среды в значение ключа реестра.

Вот пример доступа кода C # к REG_EXPAND_SZ, и расширение обрабатывается автоматически:

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

Вот пример создания расширяемого значения реестра:

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

Другие платформы или языки сценариев имеют другие механизмы для поддержки этого.Вот низкоуровневое описание Win32 REG_EXPAND_SZ:

5 голосов
/ 24 мая 2011

Вы можете использовать установщик Windows в формате .Например, значение вашего реестра может быть:

[%SystemRoot]\system32\MyScreensaver.scr

Таким образом установщик Windows автоматически разрешит переменную среды во время установки.

1 голос
/ 27 марта 2016

Это расширение ответа Рика Слэдки:

Он ответил, что REG_EXPAND_SZ позволит вам использовать переменные окружения, что правильно, но вы также должны заметить, что некоторые функции реестра будут работать только с записью ключа по умолчанию.,Например, скажем, вы хотите настроить команду для контекстного меню в оболочке Windows с именем Example (доступно при щелчке правой кнопкой мыши на фоне папки):

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

, и введите команду, которую вы хотите ввести:

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

Это будет работать только в том случае, если запись по умолчанию - REG_EXPAND_SZ, тогда как записи по умолчанию, созданные Regedit при создании ключа, - REG_SZ.Если вы используете Regedit, вам придется выполнить некоторые акробатические упражнения, чтобы преобразовать запись по умолчанию из REG_SZ в REG_EXPAND_SZ, поскольку Regedit не может сделать это самостоятельно.Вот обходной путь, необходимый для этого:

Возвращаясь к моему примеру, в командной строке создайте запись REG_EXPAN_SZ.Дважды щелкните по нему и введите желаемую команду.Например:

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

Только что созданная вами запись не будет записью по умолчанию, и в этот момент оболочка не сможет ее выполнить.Чтобы это исправить, щелкните правой кнопкой мыши раздел реестра команд и экспортируйте его как command.reg.Ваш экспортированный reg-файл должен выглядеть следующим образом:

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

Очевидно, что хеш будет отличаться, если вы используете другую команду.Чтобы преобразовать запись REG_EXPAND_SZ в запись по умолчанию, просто удалите строку @ = "" и переименуйте

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

в

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

(обратите внимание, что вокруг @ здесь нет кавычек).

После того как вы сделали свой мод, просто объедините command.reg, и запись по умолчанию теперь будет в формате REG_EXPAND_SZ.

1 голос
/ 18 февраля 2014

В командной строке вы можете использовать команду Reg add (встроенную в Windows) для установки значений реестра, содержащих переменные среды.

См. Здесь: Как использовать REG_EXPAND_SZ из командной строки?

1 голос
/ 16 августа 2013

Это довольно сложно, но очень легко сделать.Этот пример позволит вам открыть файл определенного типа (* .test) с помощью программы (Notepad ++), которая находится в каталоге пользователя.Я использовал это для сценария на моем сервере Windows 2008, на котором запущен удаленный рабочий стол (сервер терминалов AKA), чтобы каждый пользователь мог использовать программу, установленную на учетную запись пользователя PER, чтобы можно было использовать разные настройки для каждого пользователя (например, файлы * .ini, расположенные вкаталог приложений).Примечание: это не имеет значения, но папка «программы» скрыта, поэтому пользователи ее не видят.

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

Шаг 1. Если вы используете обязательные профили, обязательно изменитефайл NTUSER.MAN возвращается к NTUSER.DAT.

Шаг 2. Войдите в профиль, который вы хотите редактировать, с помощью клиента удаленного рабочего стола.

Шаг 3. Откройте regedit и удалите следующие ключи, если они существуют.

HKEY_CURRENT_USER \ Software \ Classes \ Applications \ notepad ++. Exe HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts.test

Шаг 4. Создайте новый текстовый файл и назовите его «original.reg».Заполните его следующим ...

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]
@=""

Шаг 5. Обновите реестр (F5) и найдите новый ключ.Должен появиться ключ «команда» со значением «(по умолчанию)» пустым.В ключе «команда» добавьте новое «Расширяемое строковое значение» под названием «Новое значение # 1».Задайте в качестве значения путь к приложению "Y: \% username% \ Programs \ Notepad ++ \ notepad ++. Exe" "% 1" .Затем экспортируйте ключ «command» на рабочий стол как «extended.reg».

Шаг 6. Отредактируйте файл «extended.reg» в блокноте и скопируйте все данные после «Новое значение № 1» .Пример: = 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

Шаг 7. Закройте файл extended.reg и откройте файл «original.reg», затем замените команду по умолчанию (это пустое "") с новым шестнадцатеричным значением, которое мы имеем в нашем буфере обмена.Теперь файл «original.reg» должен выглядеть следующим образом ...

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

Шаг 8. Теперь, когда наша расширенная переменная готова к работе, давайте просто добавим расширение кассоциировать с приложением.Добавьте следующее в файл «original.reg», чтобы оно выглядело следующим образом ...

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"

Шаг 9. Откройте regedit и удалите следующие ключи, если они существуют.(Да, сделайте это снова) ... Теперь реестр похож на то, что мы никогда ничего не делали, и у нас есть файл реестра, готовый для вставки в реестр!

HKEY_CURRENT_USER \ Software \ Classes \ Applications \ notepad ++.exe HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts.test

Шаг 10. Если вы хотите применить это к текущему профилю, тогда ВЫПОЛНИТЕ ФАЙЛ РЕГИСТРАЦИИ "original.reg "и вставьте его в реестр.

И это все!Теперь все * .test файлы будут открываться с помощью «Y: \% username% \ Programs \ Notepad ++ \ notepad ++. Exe».Перейдите в реестр и просмотрите новую запись по умолчанию.

0 голосов
/ 09 сентября 2013

Используйте расширяемую строку

DWORD = dword: Расширяемая строка = hex (2): Multi String = hex (7):

DWORD - это 32-битное целое число без знака (диапазон: от 0 до 4294967295 десятичное) В реестре DWORD всегда начинается с 0x.В реестре DWORDS всегда имеет 8 цифр, которые следуют за 0x.Это может быть в десятичном или шестнадцатеричном формате, 1000 можно записать как: 0x00001000 или 0x000003e8

DWORDS может использовать только цифры 0-9.Любые строки всегда используют ASCII, в ACSII 1000 можно записать только как 31,30,30,30. Для типа данных String ASCII работает в фоновом режиме, даже не подозревая об этом.Это связано с тем, что компьютер понимает только 1 и 0.Для типов данных Expandable String и Multi String эти записи сохраняются в виде последовательности кодов ASCII в шестнадцатеричном формате, разделенных запятыми и шестнадцатеричными нулями.Итак, расширяемая строка 1000 будет иметь вид: hex (2): 31,00,30,00,30,00,30,00

Итак, давайте преобразуем% PROGRAMFILES% в расширяемую строку.Сначала загрузите это: https://hotfile.com/dl/244097278/55aa086/ASCII_2_HEX_Conversion_Tool.7z.html

Теперь откройте его в любом современном браузере.Поместите% PROGRAMFILES% в поле ASCII и выберите кодировать его.Это даст вам% 25% 50% 52% 4F% 47% 52% 41% 4D% 46% 49% 4C% 45% 53% 25 Скопируйте и вставьте это в текстовый редактор, переместите первые% в конец.Выберите команду замены, найдите все "%" и замените на ", 00,".Уберите запятую в самом конце.Вы должны получить: 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 И, наконец, 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

Готово.

Вы когда-нибудь пытались преобразовать любопытную шестнадцатеричную запись реестра в ASCII ис треском провалился.Этот урок содержит все знания, необходимые для обратного проектирования любой записи реестра с шестнадцатеричным кодом, которая не зашифрована.Веселитесь!

...