簡體   English   中英

C# 注冊表 SetValue 拋出 UnauthorizedAccessException

[英]C# Registry SetValue throws UnauthorizedAccessException

在你嘗試用“快速谷歌搜索”來回答這個問題之前。 我想指出的是,我已經這樣做了。 這是這種情況,我有以下方法嘗試修改注冊表項值。 我遇到的問題是,在執行時,即使我已將密鑰打開為可寫,它也會拋出 UnauthorizedAccessException 。 我正在以管理員身份運行 Visual Studio,甚至試圖制作一個帶有清單文件的小型 .exe,迫使它以管理員身份運行,這將在沒有運氣的情況下執行代碼。 密鑰已經存在,它不會嘗試進入 CreateKey 方法。 這是代碼塊。

Path = "S-1-5-21-1644491937-1078145449-682003330-5490\Software\Microsoft\Windows\CurrentVersion\Policies\System"
Key = "DisableTaskMgr"
NewValue = 1

public OperationResult ModifyKey()
    {
        OperationResult result = new OperationResult();

        if (!Path.IsNullOrEmptyTrim())
        {
            if (!Key.IsNullOrEmptyTrim())
            {
                try
                {
                    var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, true);

                    if (key != null)
                    {
                        key.SetValue(Key, NewValue);

                        key.Close();
                    }
                    else
                    {
                        result = CreateKey();
                    }
                }
                catch (Exception ex)
                {
                    result.SetFail("Error accessing registry", ex);
                }
            }
            else
            {
                result.SetFail("Registry key was null");
            }
        }
        else
        {
            result.SetFail("Registry path was null");
        }

        return result;
    }

我是否必須手動遍歷注冊表樹,將每個 OpenSubKey 調用設置為可寫? 我也試過這個,仍然拋出同樣的錯誤......

在你的鑰匙的 var 中

var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, true);

改成

var key = Microsoft.Win32.Registry.Users.OpenSubKey(Path, RegistryKeyPermissionCheck.ReadWriteSubTree);  

您是否嘗試過設置訪問規則和權限?

 string user = Environment.UserDomainName + "\\" + Environment.UserName;
 RegistryAccessRule rule = new RegistryAccessRule(user,
        RegistryRights.FullControl,
        AccessControlType.Allow);        
 RegistrySecurity security = new RegistrySecurity();
 security.AddAccessRule(rule);
 var key = Microsoft.Win32.Registry.Users.OpenSubKey(subKeyPath, RegistryKeyPermissionCheck.ReadWriteSubTree, RegistryRights.FullControl);
 key.SetAccessControl(security);

我在您的代碼中看到的一個可能問題是Path變量被設置為一個不會轉義\\字符的字符串。 怎么樣:

Path = @"S-1-5-21-1644491937-1078145449-682003330-5490\Software\Microsoft\Windows\CurrentVersion\Policies\System";

作為弄清楚發生了什么的最后一搏,我創建了一個簡單的服務來測試將作為本地系統帳戶運行的代碼。 這是我能想到的嘗試運行代碼的最高權限。 使用這些權限運行代碼有效。

特別感謝0_ _ ___0Charleh 也指出了防病毒軟件。 我檢查了日志,結果發現它試圖隔離我的更改。 我想即使它也不會阻止系統用戶進行這些更改。

特別感謝Sorceri幫助我研究了這么多。

總之,如果您有間歇性的、極其奇怪的行為,請檢查您的病毒掃描程序和權限。

我最近遇到了同樣的問題。 所以我嘗試了一些事情,而不是調用key.SetValue(Key, NewValue)簡單地調用 create 函數解決了我的問題。 那是;

Microsoft.Win32.RegistryKey key1 = Microsoft.Win32.Registry.Users.CreateSubKey(Path);
key1.SetValue(Key, NewValue);

CreateSubKey 調用不會刪除當前條目,但提供了無一例外的寫入能力。 我希望這有幫助。

僅將授權設置為 dword。 您必須打開注冊表並在最后一個文件夾路徑,右鍵單擊它並設置授予,然后選擇所有應用程序並檢查總控制。 我希望能幫助你。

只是Registry.SetValue(sub_key, key, value);

例子:

Registry.SetValue(
            @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run",
            "MyApp",
            Application.ExecutablePath);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM