Vb.net Net程序可以';t在注册表中编辑HKEY_本地_计算机

Vb.net Net程序可以';t在注册表中编辑HKEY_本地_计算机,vb.net,permissions,registry,Vb.net,Permissions,Registry,在工作中,我们不断地处理一个软件包的多个许可证。许可证密钥存储在HKEY_LOCAL_机器的注册表中,因此我编写了一个Windows批处理文件,当以管理员身份运行时,该文件会将注册表密钥编辑为一个许可证字符串 最近,我在VB.net中编写了一个基于GUI的应用程序,它使用软件包的API添加了一些很酷的功能。我还想包括一个基于GUI的许可证交换模块,以使处理变得更加容易。然而,我一直未能成功地做到这一点 我尝试了多种方法,以管理员身份运行程序: 使用VB.Net的注册表模块 Dim key

在工作中,我们不断地处理一个软件包的多个许可证。许可证密钥存储在HKEY_LOCAL_机器的注册表中,因此我编写了一个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()
'Code is much the same as above
运行.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批处理脚本

    Dim key As RegistryKey = Registry.LocalMachine
    Dim autoshell As RegistryKey
    autoshell = key.OpenSubKey(registryKeyDirectory, True)
    autoshell.SetValue("Software", licenseKey)
    autoshell.Close()
'Code is much the same as above
所有这些方法都可以完美地在HKEY_当前用户中编辑密钥。我认为它可能是特定的密钥以及与之相关的权限,但在进一步测试后,我发现上面的代码都不能编辑HKEY_LOCAL_机器中的任意密钥。 我已经查看了与此相关的堆栈溢出上的几乎每个链接,似乎没有人遇到与我相同的问题。我怀疑这可能与我在办公网络上的用户帐户权限有关,所以我拿了代码并在我的家用电脑上测试了它,但没有用

在这一点上,我真的在我的智囊团,并将非常感谢任何帮助

提前感谢您阅读:)

这是由以下原因造成的。(注意:此链接似乎是在win7时代编写的,有点过时)。您的程序是32位的,在64位操作系统上运行时,对注册表的调用将重定向到注册表的32位逻辑视图

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


是否捕获到任何异常?如果是由于权限不足造成的,则在调用
OpenSubKey
SetValue
时应会出现异常。您是否看到如果尝试通过regedit手动修改会发生什么情况?@kennyzx在没有管理员权限的情况下运行时会出现异常。当以管理员权限运行时,它会令人沮丧地通知我编辑成功(在.reg脚本的情况下)@visualincent是的,我可以通过regedit和运行Windows批处理脚本手动修改它。没有问题。奇怪吧?也许你的程序是32位的,系统是64位的,你实际上是在修改WOW6432节点下的值。您可以在设置该值后立即获取该值,以查看该值是否已被实际修改。请注意,我的平台目标已设置为“任意CPU”,但我选择了32位,这最终实现了“首选32位”这一技巧,这对我来说是新事物。我没有意识到在更高版本的VS中,这个默认设置是生成32位程序。稍后我会更新我的答案。