vb.net RegistryKey.CreateSubKey ошибка справки - PullRequest
0 голосов
/ 16 сентября 2011

Я надеялся получить помощь с ошибкой, которую я не могу обойти.

Немного предыстории - у нас есть большое приложение для Windows, которое использует реестр (первоначально оно было написано еще в .NET v1.1 и было обновлено до v3.5). Я пытаюсь сделать его 64-битным и почти готов. В любом случае, у нас также есть небольшое служебное приложение .net, которое было написано для системных администраторов, которые поддерживают приложение для редактирования / изменения значений реестра, поскольку они зашифрованы и не могут быть просто изменены через Regedit. Я получаю ошибку в коде приложения утилиты.

Ошибка: "Указанное значение RegistryKeyPermissionCheck недопустимо. Имя параметра: mode"

Ошибка появляется, когда код утилиты пытается создать несуществующий подраздел, например:

Dim regKey As RegistryKey
regKey = Registry.LocalMachine.OpenSubKey("Software\[APPLICATION]\[SUBKEY]\", True)

If regKey Is Nothing Then
   Dim tempKey As RegistryKey
   tempKey = Registry.LocalMachine.OpenSubKey("SOFTWARE", True)
   tempKey.CreateSubKey("[APPLICATION]\[SUBKEY]\")
   tempKey.Close()
   regKey = Registry.LocalMachine.OpenSubKey("[APPLICATION]\[SUBKEY]\", True)
End If

Когда код попадает в строку CreateSubKey , он выдает ошибку ... Есть ли в любом случае эта ошибка?

Кстати, код может записывать, считывать и устанавливать существующие значения ключей реестра. Дайте мне знать, если у вас есть какие-либо вопросы.


Вот трассировка стека:

System.ArgumentException was unhandled
Message="The specified RegistryKeyPermissionCheck value is invalid. Parameter name: mode"
ParamName="mode"
Source="mscorlib"
StackTrace:
   at Microsoft.Win32.RegistryKey.ValidateKeyMode(RegistryKeyPermissionCheck mode)
   at Microsoft.Win32.RegistryKey.CreateSubKey(String subkey, 
   RegistryKeyPermissionCheck permissionCheck, RegistrySecurity registrySecurity)    
   at PolarisRegistryEditor.PolarisKeys.SaveRegistryvalues(RegistryKey reg) in C:\apps
   \Visual Studio 2008\Projects\PolarisRegistryEditor\PolarisRegistryEditor
   \PolarisKeys.vb:line 321
   at PolarisRegistryEditor.PolarisKeys.Save() in C:\apps\Visual Studio 2008\Projects
   \PolarisRegistryEditor\PolarisRegistryEditor\PolarisKeys.vb:line 278    
   at PolarisRegistryEditor.Form1.btnSet_Click(Object sender, EventArgs e) in 
   C:\apps\Visual Studio 2008\Projects\PolarisRegistryEditor\PolarisRegistryEditor
   \Form1.vb:line 36    
   at System.Windows.Forms.Control.OnClick(EventArgs e)    at
   System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)    at 
   System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32
   clicks)    at System.Windows.Forms.Control.WndProc(Message& m)    at
   System.Windows.Forms.ButtonBase.WndProc(Message& m)    at 
   System.Windows.Forms.Button.WndProc(Message& m)    at 
   System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)    at 
   System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, 
   IntPtr wparam, IntPtr lparam)    at 
   System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)    at 
   System.Windows.Forms.Application.ComponentManager.System.Windows.
   Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 
   dwComponentID, Int32 reason, Int32 pvLoopData)    at 
   System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 
   reason, ApplicationContext context)    at 
   System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, 
   ApplicationContext context)    at 
   Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
   at  Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.
   DoApplicationModel()    at 
   Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.
   Run(String[] commandLine)    at
   PolarisRegistryEditor.My.MyApplication.Main(String[] Args) in 
   17d14f5c-a337-4978-8281-53493378c1071.vb:line 81    at 
   System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)    at 
   Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()    at 
   System.Threading.ExecutionContext.Run(ExecutionContext executionContext, 
   ContextCallback callback, Object state)    at 
   System.Threading.ThreadHelper.ThreadStart()

1 Ответ

0 голосов
/ 16 сентября 2011

Судя по ошибке, у вас недостаточно прав для создания раздела реестра.

Может быть, на вашем компьютере только администраторы могут изменять содержимое реестра. Либо:

  1. Требуется, чтобы код, который устанавливает ваш ключ запуска, запускался с правами администратора
  2. Назначьте разрешения для раздела реестра для вошедшего в систему пользователя, прежде чем пытаться создать ключ.

эта ссылка должна помочь: http://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.setaccesscontrol.aspx#Y100

Edit:

Если вы уверены, что у вас достаточно прав для записи в реестр, то последнее, о чем я могу подумать, это UAC .

Пожалуйста, попробуйте отключить контроль учетных записей и посмотрите, решит ли это проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...