3

私は最近、次のレジストリ キーにアクセスする必要があるアプリケーションを作成しています。

HKLM\SOFTWARE\Wow6432Node\Classes\CLSID

奇妙な理由で、私がテストしたどのシステムでも、このキーへのアクセスは許可されていません。これを達成するために、管理者権限とその間のすべてを使用しています。最初の 5 つの Google 検索結果ページを検索しましたが、まだ空でした。

注意事項 :

1. 削除しようとしているキーには、サブキーが含まれている場合と含まれていない場合があります。「DeleteSubKey」と「DeleteSubKeyTree」を徹底的にテストしました。

2. OpenSubKey("Key",True) を試しましたが、false と true の両方の値でアクセスが許可されませんでした。

3. 64 ビット以外の場所 (HKLM\Software\Classes\CLSID) へのアクセスも許可されていません。

4. XP、7、および 8 でこれをテストしました。XP では問題は発生しませんでした。

5. 表示される正確なエラーは次のとおりです。

要求されたレジストリ アクセスは許可されていません。Microsoft.Win32.RegistryKey.OpenSubKey (文字列名、書き込み可能なブール値) で



助けてください..これは数日間私を殺しています. どんな助けでも大歓迎です。

4

6 に答える 6

3
   Microsoft.Win32.RegistryKey m_RegEntry = Microsoft.Win32.Registry.LocalMachine;    
   m_RegEntry = m_RegEntry.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Class\{4D36E96D-E325-11CE-BFC1-08002BE10318}");
        //string 
        int i = 0;
        string[] m_szModemEntries = m_RegEntry.GetSubKeyNames();

これにより、デバイスが COM ポートに接続された多くのエントリが返されます。アクセスする必要のない「プロパティ」のエントリ。

以下に、それを操作するための簡単なコードを添付します。

            string[] m_szModem;
            Microsoft.Win32.RegistryKey m_RegEntry = Microsoft.Win32.Registry.LocalMachine;
            m_RegEntry = m_RegEntry.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Class\{4D36E96D-E325-11CE-BFC1-08002BE10318}");
            //string 
            int i = 0;
            string[] m_szModemEntries = m_RegEntry.GetSubKeyNames();
            m_szModem = new string[m_szModemEntries.Length];
            string m_szModemPort = null;
            string m_szModemName = null;
            foreach (string m_szModemEntry in m_szModemEntries)
            {
                if (!IsNumber(m_szModemEntry))
                {
                }
                else
                {
                    m_RegEntry.Close();
                    m_RegEntry = Microsoft.Win32.Registry.LocalMachine;
                    string m_szKeyName = @"SYSTEM\CurrentControlSet\Control\Class\{4D36E96D-E325-11CE-BFC1-08002BE10318}\" + m_szModemEntry;
                    m_RegEntry = m_RegEntry.OpenSubKey(m_szKeyName);
                    m_szModemPort = m_RegEntry.GetValue("AttachedTo").ToString();
                    m_szModemName = m_RegEntry.GetValue("Model").ToString();
                    if (m_szModemName.Contains("<device name>"))
                    {
                        CommPort = m_szModemPort;
                        lbldevicename.Text = "Device connected!";
                        lbldevicename.ForeColor = Color.Green;
                        cmdProgram.Enabled = true;
                        DeviceConnected = true;
                        break;
                    }
                    CommPort = "";
                    cmdProgram.Enabled = false;
                    lbldevicename.Text = "Device not connected!";
                    lbldevicename.ForeColor = Color.Red;
                    DeviceConnected = false;
                }
            }

//および IsNumber 関数

public Boolean IsNumber(String s)
    {
        foreach (Char ch in s)
        {
            if (!Char.IsDigit(ch)) return false;
        }
        return true;
    }
于 2013-05-07T14:04:28.930 に答える
1

アクセス制御セキュリティの変更が必要になる場合があります。GetAccessControlを使用して、レジストリ キーの ACL を取得し、変更してから、SetAccessControlで保存します。

于 2013-01-19T16:46:49.540 に答える
1

これは、管理者権限がなくても機能することがわかった解決策です。「true」パラメーターを除外するだけで、すべてが読み取られます。私のために働いた!

于 2014-12-04T15:22:06.690 に答える
0

vb.netでは、これを使用して、キーに対して操作を行う前にキーにアクセスできます。

x.GetAccessControl(System.Security.AccessControl.AccessControlSections.All)

ここで、xは任意のregです。鍵

あなたのコードを見た後、私はこれを試しました、そしてそれはうまくいきます

  Dim r As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\test", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree)    
           r.DeleteSubKey("subkey", True)
于 2013-01-19T07:19:00.290 に答える
0

最初に Local Admin アカウントでログインします。次に、regedit.exe を実行し、編集するレジストリ キーをクリックします。[編集] メニューから [前提条件] を選択します。関連するユーザーの権限を確認してください。

関連するアカウントには、レジストリ キーを変更する権限がないと思います。

于 2013-01-19T06:42:42.197 に答える
0

Visual Studio で app.manifest を追加する

項目を追加し、アプリケーション マニフェスト ファイルを検索します

次に、これまでの開始を置き換えます

<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
</requestedPrivileges>
</security>
</trustInfo>
于 2018-09-05T21:11:13.687 に答える