2011-01-10 2 views
0

Я знаю, что есть много сайтов об этом. Я тестировал разные идеи около 6 часов. Я пытаюсь получить 32-битное приложение для изменения 64-битного реестра. Мне нужно установить разрешения для HKLM \ Software \ Microsoft \ Windows \ Current Version \ Installer \ UserData \ Если вам интересно, почему, это потому, что наше программное обеспечение выдает ошибку, если разрешения неверны.C# 32bit app 64bit registry

Вот что я пытаюсь

static bool SetRegistryPermissions(string hkLmKey, string userAccount) 
     { 
      //this will force the app to see the 64bit registry instead of being redirected 
      RegistryKey localMachineX64View = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 
      RegistryKey rk = localMachineX64View.OpenSubKey(hkLmKey, true); 

      //This redirects to the Wow6432Node in the registry 
      //RegistryKey rk = Registry.LocalMachine.OpenSubKey(hkLmKey, true); 

Программа работает нормально на тестовом ключе в WOW6432Node до изменения ключа к localMachineX64. Теперь я получаю исключение безопасности при отладке OpenSubKey.

Любые советы приветствуются и благодарны за ваше время.

P.S. Любые предложения для книг, содержащие хорошую информацию, записывающие разрешения NT на C#, будут бонусом.

+0

Вы знаете, что это неправильное решение вашей проблемы? Стандартный пользователь не должен писать HKLM. –

+0

Если это «неправильное» решение, как бы вы исправили эту проблему? Я ТОЛЬКО использую его, когда проблема исправит его и не позволит пользователю сделать это. –

ответ

0

Не могли бы вы создать небольшое 64-битное приложение, которое могло бы установить 64-битные разрешения? Затем вы можете вызвать exe из события установки после установки установщика.

+0

Единственная проблема с этим - мне это нужно для работы на 32-битных машинах. Поэтому я пытаюсь избежать 64-битного кода. Спасибо, хотя –

+0

Он, наконец, нажал на то, что вы говорили, и да, я мог бы сделать x64 и x86 версию, но я пытался избежать этого, если вообще возможно –

+0

Спасибо Джейк, я пошел вперед и сделал x86 и x64 версии. Не совсем так, как я хотел это сделать, но он выполнил свою работу –

0

Я не уверен, что есть .NET подход к этому, но Windows API определенно обеспечивает решение. Вы можете использовать функцию RegOpenKeyEx с KEY_WOW64_64KEY (http://msdn.microsoft.com/en-us/library/ms724878%28v=vs.85%29.aspx), включенную в качестве одного из параметров доступа. Это позволит вашему 32-битовому приложению получить доступ к полному реестру, а не только к песочнице Wow6432Node.

Edit: pinvoke.net есть пример # C готов к работе: http://www.pinvoke.net/default.aspx/advapi32/RegOpenKeyEx.html

Смежные вопросы