在Visual Studio Installer中使用Windows环境变量作为注册表值

9

嗨,我想使用Windows环境变量作为注册表项的值。不幸的是,我不能简单地写像%systemroot%\system32\MyScreensaver.scr这样的内容。

正如你所猜测的那样,我想要将一些reg值指向我的应用程序,例如自动启动、屏幕保护程序和其他一些东西。

有什么想法吗?


欢迎使用VS安装程序设置程序自启动和特定屏幕保护程序的其他方法 :) - Martin Booka Weser
我添加了我的答案,不需要任何编码。我的答案更适用于不想将某些东西编码到应用程序中,但是更多地由网络管理员使用。 ;) - Arvo Bowen
6个回答

9

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);

其他平台或脚本语言拥有其他机制来支持此功能。以下是REG_EXPAND_SZ的低级Win32描述:


5

您可以使用Windows Installer 格式类型。例如,您的注册表值可以是:

[%SystemRoot]\system32\MyScreensaver.scr

这样,Windows Installer 将在安装过程中自动解析环境变量。

2
这是对Rick Sladkey答案的补充:
他回答说REG_EXPAND_SZ将允许您使用环境变量,这是正确的,但您还应该注意,某些注册表功能仅适用于键的默认条目。例如,假设您想为Windows shell上下文菜单中的命令设置一个名为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

您刚刚创建的条目不会成为默认条目,此时shell无法执行它。要解决这个问题,请右键单击命令注册表键并将其导出为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格式显示。


1
这有点棘手,但非常容易实现。这个例子可以让你使用一个位于用户特定目录中的程序(Notepad++)打开某种类型的文件(*.test)。我在我的 Windows 2008 服务器上运行远程桌面(也称终端服务器)时使用了这个场景,以便每个用户都可以使用安装在每个用户帐户下的程序,从而可以针对每个用户使用不同的设置(例如:位于应用程序目录中的 *.ini 文件)。注意:虽然无关紧要,但文件夹“programs”是隐藏的,因此用户看不到它。
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 键),查找新键。应该看到具有空白 "(Default)" 值的 "command" 键。在 "command" 键中添加一个名为 "New Value #1" 的新的 "可扩展字符串值"。将值设置为应用程序的路径"Y:\%username%\programs\Notepad++\notepad++.exe" "%1"。然后将 "command" 键导出到桌面上,名为 "expanded.reg"。

第 6 步。 在记事本中编辑 "expanded.reg" 文件,并复制 "New Value #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 步。 关闭已展开的 expanded.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”打开。去检查注册表并查看新的默认条目。


1

0

使用可扩展字符串

DWORD = dword:可扩展字符串= hex(2):多字符串= hex(7):

DWORD是32位无符号整数(范围:0到4294967295十进制)。在注册表中,DWORD始终以0x开头。在注册表中,DWORD始终有8个数字跟随0x。这可以是十进制或十六进制格式,1000可以写为:0x00001000或0x000003e8。

DWORD只能使用数字0-9。任何类型的字符串都始终使用ASCII,在ACSII中,1000只能写为31,30,30,30。对于字符串数据类型,ASCII在后台工作而不需要您甚至知道。它必须这样做,因为计算机只能理解1和0。对于可扩展字符串和多字符串数据类型,这些将您的条目保存为一系列以十六进制格式分隔的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并且失败了。本课程包含了反向工程任何未加密的十六进制编码注册表项所需的全部知识。祝你玩得愉快!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接