Запись в реестр (HKEY_LOCAL_MACHINE) в XP - PullRequest
2 голосов
/ 14 сентября 2009

Я пытаюсь изменить раздел реестра, который, как мне сказали, управляет включением кэширования записи на определенных жестких дисках. Ключ должен быть: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\IDE\<DiskName>\<SerialNo>\Device Parameters\Disk\UserWriteCacheSetting

Однако у меня продолжают возникать проблемы при попытке создать этот ключ (так как он не существует по умолчанию). Если я пытаюсь открыть ...\Device Parameters\Disk\ с правами на запись, я получаю ошибку SecurityException; Msgstr "Запрашиваемый доступ к реестру не разрешен". Теперь я добавил флаг <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> в мой файл манифеста, чтобы обеспечить мне доступ администратора, но мне все еще не повезло.

Любые идеи были бы великолепны!

    static void Main(string[] args)
    {
        RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Enum\\IDE\\");

        foreach (string driveManafacturer in myKey.GetSubKeyNames())
        {
            RegistryKey driveKey = myKey.OpenSubKey(driveManafacturer);
            foreach (string driveID in driveKey.GetSubKeyNames())
            {
                RegistryKey driveIDKey = driveKey.OpenSubKey(driveID, true);
                string driveType = (string)driveIDKey.GetValue("Class");
                if (driveType == "DiskDrive")
                {
                    RegistryKey tempKey = driveIDKey.OpenSubKey("Device Parameters\\Disk\\", true);
                    if (tempKey == null)
                    {
                        tempKey = driveIDKey.CreateSubKey("Device Parameters\\Disk\\");
                        tempKey.SetValue("UserWriteCacheSetting", 0x0);
                    }
                }
            }
        }

        return;
    }

Ответы [ 2 ]

2 голосов
/ 14 сентября 2009

У меня нет лучшего предложения. Попробуйте создать запись реестра вручную, просто чтобы убедиться, что вы можете. Затем убедитесь, что приложение работает с вашими учетными данными. Просто чтобы устранить проблему с разрешением.

1 голос
/ 14 сентября 2009

РЕДАКТИРОВАТЬ : Убрал идею о частичном доверии ... оказалось, что это не имеет никакого отношения к проблеме.

Я попробовал ваш код и получил ту же ошибку - с некоторыми изменениями он работает:

RegistryKey myKey = Registry.LocalMachine.OpenSubKey( "SYSTEM\\CurrentControlSet\\Enum\\IDE\\" );

foreach( string driveManafacturer in myKey.GetSubKeyNames() )
{
  RegistryKey driveKey = myKey.OpenSubKey( driveManafacturer );

  foreach( string driveID in driveKey.GetSubKeyNames() )
  {
    RegistryKey subKey = driveKey.OpenSubKey( driveID );
    string driveType = (string)subKey.GetValue( "Class" );
    if( driveType == "DiskDrive" )
    {
      RegistryKey tempKey = subKey.OpenSubKey( "Device Parameters", true );
      RegistryKey tempKey2 = tempKey.OpenSubKey( "Disk" );
      if( tempKey2 == null )
      {
        tempKey2 = tempKey.CreateSubKey( "Disk" );
        tempKey2.SetValue( "UserWriteCacheSetting", 0x0 );
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...