2017-02-17 116 views
1

我最近一直在研究一個非常好的註冊表編輯器。C#WPF - 即使使用管理員權限,也不允許註冊表訪問?

然而,某些註冊表項,下面的註冊表編輯器中指出,在我的程序不會出現,因爲他們提出的權限不足的錯誤時打開,因此被錯誤處理捕獲並跳過:

註冊表編輯器:

Registry 1

我的程序:

Registry 2

正如您所看到的,即使我使用管理員權限運行程序,SECURITY鍵也會丟失,並且SAM鍵不可擴展。

這顯然可以通過製作假鑰匙並將它們放在那裏,併爲它們顯示一個空的默認值來解決,但這不是一個具體的解決方案,只是讓用戶看起來像是問題解決了。

我想知道是否有辦法以具體的方式解決問題,換句話說,接收註冊表訪問這些密鑰?

它們顯示的所有內容都是空的默認值,包括可擴展的SAM鍵 - 它只是一個名爲'SAM'的子鍵,其默認值爲空。

但是,對於用戶來說,如果程序完全按照Regedit顯示,則會更好,因爲這意味着它是一個功能完整的軟件。

感謝您的幫助。

編輯(包括代碼):

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函數時,系統會根據密鑰的安全描述符檢查請求的訪問權限。如果用戶沒有對註冊表項的正確訪問權限,則打開操作失敗。如果管理員需要訪問密鑰,解決方案是啓用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我添加了更多的鏈接,這些鏈接解釋瞭如何在.NET中處理Registry Security。第三個鏈接在C#中顯示了一個例子,它可以幫助你。祝你好運! –

0

您需要啓用SE_RESTORE_PRIVILEGESE_BACKUP_PRIVILEGE並使用RegOpenKeyExZwOpenKeyExREG_OPTION_BACKUP_RESTORE fla克(視窗的但這將是工作只能從Windows 7開始和更高版本)

如果設置了這個標誌,函數忽略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); 
    } 
} 

但是,對於獲得全功率註冊表編輯器/瀏覽器我是使用原生API

enter image description here

相關問題