2

Visual Basic 2008 でレジストリ キーの特定の DWORD の値を反転する小さなプログラムを作成しています。

問題のレジストリ キーは次のとおりです。

'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{91801674-82d9-459a-9358-6e5cf3d81d21}\FxProperties'

私が操作している dword は " {e0a941a0-88a2-4df5-8d6b-dd20bb06e8fb},4 "です

これは、DWORD の値を設定するために書いたコード行です。

Dim keyString = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{91801674-82d9-459a-9358-6e5cf3d81d21}\FxProperties"
My.Computer.Registry.SetValue(keyString, "{ad75efc0-8f48-4285-bfa8-40fb036cdab2},2", "00000000")

しかし、実行時に「レジストリ キー [KEY_NAME] へのアクセスが拒否されました」というUnauthorizedAccessExceptionが発生します。

管理者権限でプログラムを実行し、アプリのマニフェストを次のように変更しました。

<requestedExecutionLevel level="highestAvailable" uiAccess="false" />

しかし、それもうまくいきませんでした。そこで、いくつかのフォーラムを検索して、これを試しました:

Dim rkLM As RegistryKey = Registry.LocalMachine
Dim pRegKey As RegistryKey = rkLM.OpenSubKey("\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{91801674-82d9-459a-9358-6e5cf3d81d21}\FxProperties", True)
pRegKey.SetValue("{ad75efc0-8f48-4285-bfa8-40fb036cdab2},2", "00000000")

しかし、「オブジェクト参照がオブジェクトのインスタンスに設定されていません」というNullReferenceExceptionがスローされました。

プログラムをSYSTEM権限で実行しなくても、そのキーを変更できる方法はありますか?

4

4 に答える 4

2

実際には管理者ではない可能性があるrequireAdministratorため、マニフェストで を試す必要があります。highestAvailable

データ型も指定してみます(あなたの場合はバイナリだと思います):

My.Computer.Registry.SetValue(keyString, _
"{ad75efc0-8f48-4285-bfa8-40fb036cdab2},2", _ 
"00000000", _
RegistryValueKind.Binary)

ただし、設定する値はバイト配列である必要がある場合があります(他の方法を試すことができます)

于 2012-10-23T12:46:09.037 に答える
1

マットに感謝します、私もそれを実行しようとしrequireAdministratorましたが、それも役に立ちませんでした。とにかく、私はこれに対する解決策を見つけました、そしてそれは私が修正しようとしていたレジストリキーのパーミッションにあるようです。

Full Controlアクセス権はTrustedInstallerグループにのみ付与されていたため、 AdministratorsFull Controlグループのユーザーにも付与しました。

SysinternalsのPsExecツール[ ]を使用してSYSTEM権限で「regedit」を開始し、プログラムを使用して操作したいキーに移動し、[ ]を使用して自分自身に書き込みアクセスを許可しました。psexec -si regeditEdit -> Permissions

それを行った後、私のコードは機能し、これは:

Dim keyString = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\" _
+ "MMDevices\Audio\Render\{91801674-82d9-459a-9358-6e5cf3d81d21}\FxProperties"

Dim regKey = "{ad75efc0-8f48-4285-bfa8-40fb036cdab2},2"

My.Computer.Registry.SetValue( _
keyString, regKey, "00000000", RegistryValueKind.DWord)

DWORDの値を正常に反転できます。これは機能しましたが、レジストリサブキーのアクセス許可を手動で変更せずにこれを行う方法があるかどうかを知りたいです。

ここに記載されているC#で同様の問題と解決策を見つけましたが、そこに記載されているC#コードをVB.NETコードに正常に変換できませんでした。手伝ってもらえますか?

于 2012-10-23T19:57:42.700 に答える
1

これは、以下で参照されている c# リンクの vb.net コードです。System.Security への参照を設定する必要があります。

    Imports System.Security
    Imports System.Security.Principal
    Imports System.Security.AccessControl

    Imports Microsoft.Win32

    Private Sub TestMethod(ByVal subkey As String)
        ' Create access rule giving full control to the Administrator user.
        Dim rs As New RegistrySecurity()
        rs.AddAccessRule( New RegistryAccessRule( _
            "Administrator", _
            RegistryRights.FullControl, _
            InheritanceFlags.ContainerInherit Or InheritanceFlags.ObjectInherit, _
            PropagationFlags.InheritOnly, _
            AccessControlType.Allow))

        ' Get the registry key desired with ChangePermissions Rights.
        Dim rk As RegistryKey = Registry.LocalMachine.OpenSubKey( _
            subkey, _
            RegistryKeyPermissionCheck.ReadWriteSubTree, _
            RegistryRights.ChangePermissions Or RegistryRights.ReadKey)

        ' Apply the new access rule to this Registry Key.
        rk.SetAccessControl(rs)

        ' Get the registry key desired with ChangePermissions Rights.
        rk = Registry.LocalMachine.OpenSubKey( _
            subkey, _
            RegistryKeyPermissionCheck.ReadWriteSubTree, _
            RegistryRights.ChangePermissions Or RegistryRights.ReadKey)

        ' Apply the new access rule to this Registry Key.
        rk.SetAccessControl(rs)

        ' Open the key again with full control.
        rk = Registry.LocalMachine.OpenSubKey( _
            subkey, _
            RegistryKeyPermissionCheck.ReadWriteSubTree, _
            RegistryRights.FullControl)

        ' Set the security's owner to be Administrator.
        rs.SetOwner(New NTAccount("Administrator"))

        ' Set the key with the changed permission so Administrator is now owner.
        rk.SetAccessControl(rs)
    End Sub
于 2013-10-23T18:39:42.040 に答える
0

私はこれと同じ問題を抱えていましたが、設定requireAdministratorは役に立ちませんでした。次に、VS2010 が管理者権限で再起動するように要求しないことに気付きました。VS2010 を閉じて再度開き、プログラムを実行すると、管理者権限で開始するように求められました。に変更することに慣れてrequireAdministratorおり、次にデバッグするときに再起動するように求められます。

したがって、明確にするために、役立ちますが、 requireAdministrator VS2010を手動で再起動する必要がある場合があります (または、VS2010 を管理者として実行するだけです)。

于 2015-08-17T21:41:41.063 に答える