Использование переменных среды Windows в качестве значений реестра в установщике Visual Studio

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

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

Любые идеи?


person Martin Booka Weser    schedule 23.05.2011    source источник
comment
Приветствуются и другие способы, как настроить программу на автозапуск и установить определенную заставку с помощью VS-installer :)   -  person Martin Booka Weser    schedule 23.05.2011
comment
Я добавил свой ответ, который не требует кодирования. Мой ответ предназначен больше для тех, кто не хочет что-то кодировать в приложении, но в большей степени используется сетевыми администраторами. ;)   -  person Arvo Bowen    schedule 16.08.2013


Ответы (6)


Реестр 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:

person Rick Sladkey    schedule 23.05.2011


Это довольно сложно, но очень легко сделать. Этот пример позволит вам открыть файл определенного типа (*.test) с помощью программы (Notepad++), которая находится в определенном пользователем каталоге. Я использовал это для сценария на моем сервере Windows 2008, на котором запущен удаленный рабочий стол (также известный как сервер терминалов), чтобы позволить каждому пользователю использовать программу, установленную для учетной записи пользователя 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» на рабочий стол как «expanded.reg».

Шаг 6. Отредактируйте файл "expanded.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. Закройте файл expand.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". Проверьте реестр и посмотрите новую запись по умолчанию.

person Arvo Bowen    schedule 16.08.2013

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

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

person rogersillito    schedule 18.02.2014

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

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

[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 и экспортируйте его как 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 

to

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

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

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

person thebunnyrules    schedule 27.03.2016

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

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,4С,00,45,00,53,00,25,00

Готово.

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

person DarkReverser    schedule 08.09.2013