Изменение значения ключа реестра с помощью getRuntime(). Exec(cmd) не изменяет значение реестра, даже если операция завершилась успешно

Я пытаюсь изменить значение реестра из моего приложения Java. Я использую команду:

LoudnessEqualizationToggle.execCmdNoReturn("reg add \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\MMDevices\\Audio\\Render\\"+guid+"\\FxProperties\""
                                           + " /f /v \"{E0A941A0-88A2-4df5-8D6B-DD20BB06E8FB},4\" /t REG_DWORD /d \""+((activateLEOnKey) ? 1 : 0)+"\"");

Где guid {d348b8e8-3118-4a9c-9b43-422647b555ca}

activLEOnKey - логическое значение

Функция execCmdNoReturn:

public static final void execCmdNoReturn(String cmd)  {

        try {
            Scanner s = new Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");

            System.out.println("Command:"+cmd);
            System.out.println("Printing executed data");

            while (s.hasNext()) {
                System.out.println(s.next());
            }
        } catch (IOException ex) {

            Logger.getLogger(LoudnessEqualizationToggle.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

Все работает нормально Я получаю вывод в командной строке:

Операция завершилась успешно

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

У меня есть разрешения? да
Я использую командный файл для запуска приложения с помощью " Запуск от имени администратора".

Пакетный файл:

cd %~dp0
java -jar LoudnessEqualizationToggle.jar
pause

Создан ярлык из этого и запускается от имени администратора.

Вы владелец этого ключа? да

Я проверил мою команду и разрешения с тестированием пакетного файла, если текущее значение 0 в реестре Windows можно изменить на 1 как и ожидалось.

Пакетный файл для этого теста:

cd %~dp0
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\MMDevices\Audio\Render\{d348b8e8-3118-4a9c-9b43-422647b555ca}\FxProperties" /f /v "{E0A941A0-88A2-4df5-8D6B-DD20BB06E8FB},4" /t REG_DWORD /d "1"
net stop audiosrv //just restarting audio down here , not important
net stop AudioEndpointBuilder
net start audiosrv
net start AudioEndpointBuilder
pause

Значение изменилось в реестре Windows после выполнения пакетного файла с 0 до 1 (желаемое действие).

Поэтому, когда я запускаю свою команду из окна командной строки напрямую, я вижу измененное значение. Но когда я запускаю команду из среды исполнения exec в моем приложении Java, в реестре Windows не изменяется никакое значение, хотя я вижу, что команда выполняется без проблем. И на моем отладке Java я вижу ТОЧНО ту же команду, которая выполняется в пакетном файле.

В чем может быть причина того, что значение реестра не изменилось командой reg.exe, выполненной из моего Java-приложения?

Экран Process Monitor (после подсказки Mofi):

Журнал Process Monitor с набором фильтров, включающим в себя весь доступ к реестру с помощью MMDevices в пути

1 ответ

Решение

WOW6432Node в журнале Process Monitor указывает, что код Java выполняется с 32-разрядной Java в 32-разрядной среде на Windows x64. Поэтому называется reg.exe также 32-битный %SystemRoot%\SysWOW64\reg.exe который изменяет поэтому значение DWORD в WOW6432Node,

Статьи Microsoft с подробной информацией о Windows On Windows:

Одно решение, работающее для 32-битной и 64-битной Java на 32-битной и 64-битной Windows, будет:

  1. Получить строковое значение переменной среды SystemRoot,

  2. Проверьте, если файл SystemRoot + "\\Sysnative\\reg.exe" существует.

    Это касается только 32-битной Java, выполняемой в Windows x64. Во всех других случаях, например, в 64-битной Java в Windows x64 или 32-битной Java в Windows x86, этот файл не существует, поскольку Sysnative не существует. Да, Sysnative не существует для 64-битных приложений в Windows x64.

  3. Если файл reg.exe существует в Sysnative в каталог Windows, позвоните SystemRoot + "\\Sysnative\\reg.exe",

  4. В противном случае позвоните SystemRoot + "\\System32\\reg.exe" это подходящий исполняемый файл для 64-битной Java на Windows x64, а также 32-битной Java на Windows x86.

Другие вопросы по тегам