2017-02-17 30 views
1

Я недавно работал над очень хорошим редактором реестра.C# WPF - Доступ к реестру не разрешен, даже с правами администратора?

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

Regedit :

Registry 1

Моя программа:

Registry 2

Как видите, ключ SECURITY отсутствует, а ключ SAM не расширяется, хотя я запускаю программу с правами администратора.

Возможно, это можно устранить, создав поддельные ключи и помещая их туда, и просто отображая для них пустое значение по умолчанию, однако это не конкретное решение, а просто способ заставить его казаться пользователю, как если бы он проблема решена.

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

Все, что они отображают, является пустым значением по умолчанию любым способом, включая расширяемый ключ SAM - он просто имеет подраздел с именем «SAM» с пустым значением по умолчанию.

Однако для пользователя гораздо лучше, если программа отображается точно так же, как в Regedit, так как это означает, что это полностью функциональная часть программного обеспечения.

Спасибо за помощь.

Edit (код включен):

public static void TreeViewItemExpanded(TreeViewItem sender) 
     { 
      if (sender.Items[0] is string) 
      { 
       sender.Items.Clear(); 

       RegistryKey expandedKey = (RegistryKey)sender.Tag; 

       foreach (string key in expandedKey.GetSubKeyNames().OrderBy(x => x)) try { sender.Items.Add(CreateTreeViewItem(expandedKey.OpenSubKey(key))); } catch { } 
      } 
     } 

     private static TreeViewItem CreateTreeViewItem(RegistryKey key) 
     { 
      TreeViewItem treeViewItem = new TreeViewItem() { Header = new RegistryEditor_RegistryStructure_TreeView() { Name = Path.GetFileName(key.ToString()) }, Tag = key }; 

      try { if (key.SubKeyCount > 0) treeViewItem.Items.Add("Loading..."); } catch { } 

      return treeViewItem; 
     } 

ответ

1

Вы не предоставили образец кода вашей обычной, но у меня есть suspision, что вы используете дескриптор безопасности реестра по умолчанию.

Вы можете указать дескриптор безопасности для раздела реестра при вызове функции RegCreateKeyEx или RegSetKeySecurity.

Когда вы вызываете функцию RegOpenKeyEx, система проверяет запрашиваемые права доступа на дескриптор безопасности ключа. Если у пользователя нет правильного доступа к ключу реестра, операция open завершается с ошибкой. Если администратор нуждается в доступе к ключу, решение должно включить привилегию SE_TAKE_OWNERSHIP_NAME и открыть ключ реестра с доступом WRITE_OWNER.

Эта информация взята из: MSDN: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724878(v=vs.85).aspx

В C# Вы должны использовать Регистери Разрешение класса https://msdn.microsoft.com/en-us/library/system.security.permissions.registrypermission(v=vs.110).aspx

Хороший пример того, как обращаться с разрешениями реестра можно найти здесь: https://msdn.microsoft.com/en-us/library/microsoft.win32.registrykey.setaccesscontrol(v=vs.110).aspx

+0

Я отредактировал, чтобы включить код, используемый, когда ключи расширены и поэтому созданы. Я использую RegistryKey.OpenSubKey (подраздел) Как я могу использовать RegCreateKeyEx? – Aleksbgbg

+0

@Aleksbgbg Я добавил еще пару ссылок, в которых объясняется, как вы можете работать с Registry Security в .NET. Третья ссылка показывает пример на C#, который должен вам помочь. Удачи! –

0

вам нужно включить SE_RESTORE_PRIVILEGE и SE_BACKUP_PRIVILEGE и использовать RegOpenKeyEx или ZwOpenKeyEx с REG_OPTION_BACKUP_RESTORE FLA г (, но это будет работать только начинаются с Windows 7 и более поздние версии Windows,)

Если этот флаг установлен, функция игнорирует параметр samDesired и попытки открыть ключ доступа, необходимого для резервное копирование или восстановление ключ. Если вызывающий поток имеет привилегию SE_BACKUP_NAME , ключ открывается с правами доступа ACCESS_SYSTEM_SECURITY и KEY_READ. Если вызывающий поток имеет привилегию SE_RESTORE_NAME , начиная с Windows Vista, ключ открывается с правами доступа ACCESS_SYSTEM_SECURITY, DELETE и KEY_WRITE. Если обе привилегии включены, ключ имеет объединенные права доступа для обеих привилегий.


, например

#define LAA(se) {{se},SE_PRIVILEGE_ENABLED|SE_PRIVILEGE_ENABLED_BY_DEFAULT} 
#define BEGIN_PRIVILEGES(tp, n) static const struct {ULONG PrivilegeCount;LUID_AND_ATTRIBUTES Privileges[n];} tp = {n,{ 
#define END_PRIVILEGES }}; 

ULONG AdjustBackupRestore() 
{ 
    HANDLE hToken; 
    if (OpenProcessToken(NtCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) 
    { 
     BEGIN_PRIVILEGES(tp, 2) 
      LAA(SE_RESTORE_PRIVILEGE), 
      LAA(SE_BACKUP_PRIVILEGE), 
     END_PRIVILEGES 

     AdjustTokenPrivileges(hToken, FALSE, (::PTOKEN_PRIVILEGES)&tp, 0, 0, 0); 
     ULONG err = GetLastError(); 
     CloseHandle(hToken); 

     return err; 
    } 

    return GetLastError(); 
} 

if (!AdjustBackupRestore())//called once on startup 
{ 
    HKEY hKey; 
    if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SECURITY\\SAM", REG_OPTION_BACKUP_RESTORE|REG_OPTION_OPEN_LINK, 0, &hKey)) 
    { 
     RegCloseKey(hKey); 
    } 
} 

однако для получения полной мощности для редактора реестра/телезритель я быть использовать Native API

enter image description here

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

  • Нет связанных вопросов^_^