VB.Net程序无法在注册表

时间:2017-02-24 09:55:19

标签: vb.net permissions registry

在工作中,我们经常处理软件包的多个许可证。许可证密钥存储在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上的每个链接,并且似乎没有人遇到与我相同的问题。我怀疑它可能与我在办公室网络上的用户帐户的权限有关,所以我拿了代码并在家用电脑上进行了测试,但无济于事。

在这一点上,我真的在我的智慧结束,非常感谢任何帮助!

提前感谢您阅读:)

1 个答案:

答案 0 :(得分:0)

这是由Registry Redirector引起的。 (注意:这个链接似乎写在win7时代,有点过时)。您的程序是32位,当在64位操作系统上运行时,对注册表的调用将重定向到注册表的32位逻辑视图。

在Visual Studio中,将程序编译为目标AnyCPU,同时取消选中“Prefer 32-bit”复选框。然后程序将在64位操作系统上以64位运行,在32位操作系统上以32位运行。

enter image description here

相关问题