【问题标题】:"Attempted to perform an unauthorized operation" error when using Registry.SetValue使用 Registry.SetValue 时出现“尝试执行未经授权的操作”错误
【发布时间】:2017-10-23 21:46:52
【问题描述】:

我试图在 VB.NET 中制作一个程序,该程序会将自身添加到 Windows 注册表中的启动中。但是,当我运行该程序时,我收到此错误消息:

试图执行未经授权的操作。

我尝试过更改权限,并在网上使用了很多方法,但都被证明是不成功的。我只是似乎没有权限干预注册表。

这是我的代码:

My.Computer.Registry.SetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run", "FILENAME", "FILEPATH")

我做错了什么?

【问题讨论】:

  • 旁注:始终为用户提供自愿将您的应用程序添加到启动中的选项,以及反转该选项的选项。 不要在未经用户许可的情况下强制您的应用程序在启动时运行
  • HKEY_CURRENT_USER 中的几乎所有内容都是可写的,无需特殊权限。而不是权限,我怀疑这里的问题是您需要获取密钥(或打开子密钥),并在密钥上设置值,而不是仅在长路径上调用 SetValue()。
  • 感谢您的回复,我在 youtube 上看过很多教程,但它们不包括用户权限,它们仍然有效。请参考这些视频:youtube.com/watch?v=baXyf-jlGm4
  • @EricCartman 从用户那里获得许可是关于良好实践和用户体验,而不是任何技术。
  • 这就是 youtube“教程”的问题;他们很少告诉你任何你应该注意的外围问题。

标签: vb.net registry


【解决方案1】:

正如乔尔在 cmets 中所说,您应该先打开子键,然后设置值。

以下是我通常用于在 Windows 启动中添加/删除程序的方法:

Public Sub AddToStartup(Optional appCommand As String = "")
    Dim applicationName As String = Application.ProductName
    Dim applicationPath As String = Application.ExecutablePath
    Dim regKey As Microsoft.Win32.RegistryKey
    regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
    regKey.SetValue(applicationName, """" & applicationPath & """" & appCommand)
    regKey.Close()
End Sub

Public Sub RemoveFromStartup()
    Dim applicationName As String = Application.ProductName
    Dim regKey As Microsoft.Win32.RegistryKey
    regKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", True)
    regKey.DeleteValue(applicationName, False)
    regKey.Close()
End Sub

我在AddToStartup 方法中使用可选参数(即appCommand),以防我想将命令参数传递给在Windows 启动时运行的实例。例如" -Hide"在启动时将程序隐藏在托盘中。

旁注:始终让用户可以选择是否愿意将您的应用程序添加到启动中,并选择将其反转。 不要在未经用户许可的情况下强制你的应用程序在启动时运行,否则用户会讨厌你:)

【讨论】:

  • 感谢所有回复,我们非常感谢他们并提供了非常丰富的信息! :) (Ahmed, Joel and Plutonix) 我之前@Joel 的意思是对注册表的干扰似乎不需要用户许可就可以工作,所以我很好奇为什么这是可能的;我同意首先必须给予用户许可。再次感谢所有回复:)
  • 我又遇到了一个问题! (我希望你不会厌倦我!)。我最初想在添加 regkey 时使用不同的名称和可执行路径。当我运行程序时,使用 Application.ProductName 和 Application.ExecutablePath 可以工作,但我希望添加一个具有不同启动路径的文件,而不是正在运行的原始 exe 文件。因此,当我打算使用不同的可执行路径/名称时,我仍然会收到相同的错误:“尝试执行未经授权的操作”。你知道为什么会这样吗?
  • 我的目标是,当程序执行时,它会将自身复制到某个位置,并将复制文件的新文件位置添加到启动中——这只是背后的更多上下文.. .
  • @EricCartman 将第一个方法中的前两行替换为Dim applicationName As String = "YourAppName"Dim applicationPath As String = "..\Folder\SubFolder\YourApp.exe",不要更改此方法中的任何其他内容,它应该可以正常工作。那是你做的吗?请仔细检查。
  • 嗨,艾哈迈德,我完全按照您在方法中显示的那样做,问题出在文件位置本身。我使用了 Application.ProductName 和 Application.ExecutablePath 并且效果很好。它自己添加到启动中,当我重新启动计算机时,程序在启动时运行,它应该有。但是,当我使用不同的文件位置和不同的名称时,它确实将自己添加到启动中,但是当我重新启动计算机时,它自己从 regedit 中的启动文件夹中删除了自己并且没有执行。所以后来我尝试运行程序,同样的错误出现了……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-06
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多