在工作中,我们经常处理软件包的多个许可证。许可证密钥存储在HKEY_LOCAL_MACHINE的注册表中,因此我编写了一个Windows批处理文件,以管理员身份运行时,将注册表项编辑为其中一个许可证字符串。
最近我在VB.net中编写了一个基于GUI的应用程序,它使用软件包的API来添加一些很酷的功能。我还希望包含一个基于GUI的许可证切换模块,以使杂耍变得更加容易。但是,我没能成功。
我尝试了多种方法,将程序作为管理员:
运行使用VB.Net的注册表模块
Dim key As RegistryKey = Registry.LocalMachine
Dim autoshell As RegistryKey
autoshell = key.OpenSubKey(registryKeyDirectory, True)
autoshell.SetValue("Software", licenseKey)
autoshell.Close()
运行.reg脚本
Dim p As New ProcessStartInfo
p.FileName = "regedit.exe"
p.UseShellExecute = True
p.Arguments = """C:\test.reg"""
Process.Start(p)
将注册表编辑命令发送到CMD
Dim process As New Process()
process.StartInfo.FileName = "cmd.exe"
process.StartInfo.Verb = "runas"
process.StartInfo.UseShellExecute = True
process.StartInfo.Arguments = "/K reg add ""HKEY_LOCAL_MACHINE\SOFTWARE\Software\Licenses\Serial Numbers"" /f /v ""Software"" /t REG_SZ /d """ + licenseKey + """"
process.Start()
通过CMD以与上面类似的方式运行Windows批处理脚本
'Code is much the same as above
所有这些方法都非常适合编辑HKEY_CURRENT_USER中的Key。我认为它可能是特定的密钥和与之相关的权限,但经过进一步测试后,我发现上述代码都不能编辑HKEY_LOCAL_MACHINE中的任意密钥。 我已经查看了与此相关的Stack Overflow上的每个链接,并且似乎没有人遇到与我相同的问题。我怀疑它可能与我在办公室网络上的用户帐户的权限有关,所以我拿了代码并在家用电脑上进行了测试,但无济于事。
在这一点上,我真的在我的智慧结束,非常感谢任何帮助!
提前感谢您阅读:)
答案 0 :(得分:0)
这是由Registry Redirector引起的。 (注意:这个链接似乎写在win7时代,有点过时)。您的程序是32位,当在64位操作系统上运行时,对注册表的调用将重定向到注册表的32位逻辑视图。
在Visual Studio中,将程序编译为目标AnyCPU
,同时取消选中“Prefer 32-bit”复选框。然后程序将在64位操作系统上以64位运行,在32位操作系统上以32位运行。