使用getRuntime()。exec(cmd)更改注册表项的值不会更改注册表值,即使操作成功结束

托马斯·比西亚克(Tomas Bisciak)

我正在尝试从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}

activateLEOnKey是布尔值

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(所需操作)。

因此,当我直接从命令提示符窗口运行命令时,可以看到该值已更改。但是,当我从Java应用程序中的运行时exec运行命令时,尽管我看到命令执行没有问题,但Windows注册表中的值没有更改。在我的Java调试中,我看到与批处理文件中执行的命令完全相同。

从我的Java应用程序中执行的reg.exe命令未更改注册表值的原因可能是什么?

过程监视器屏幕(在Mofi提示之后):

具有筛选器的Process Monitor日志设置为包括路径中MMDevices的所有注册表访问

莫菲

WOW6432Node进程监视器”的日志中的表示Java代码是在64位Windows的32位环境中使用32位Java执行的。因此,被调用reg.exe的也是32位%SystemRoot%\SysWOW64\reg.exe,因此会修改中的DWORD值WOW6432Node

Microsoft文章,其中包含有关Windows on Windows的详细信息:

在32位和64位Windows上适用于32位和64位Java的一种解决方案是:

  1. 获取环境变量的字符串值SystemRoot

  2. 检查文件是否SystemRoot + "\\Sysnative\\reg.exe"存在。

    只有在64位Windows上执行的32位Java才是这种情况。在所有其他情况下,例如64位Windows上的64位Java或32位Windows上的32位Java,此文件不存在,因为Sysnative不存在。是的,Sysnative对于64位Windows上的64位应用程序不存在。

  3. 如果该文件reg.exe存在于SysnativeWindows目录中,请调用SystemRoot + "\\Sysnative\\reg.exe"

  4. 否则,调用SystemRoot + "\\System32\\reg.exe"64位Windows上64位Java和32位Windows上32位Java正确的可执行文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用getRuntime()。exec(cmd)更改注册表项的值不会更改注册表值,即使操作成功结束

来自分类Dev

在C中更改注册表值

来自分类Dev

如何批量更改注册表值

来自分类Dev

使用Ruby / JRuby更改注册表值

来自分类Dev

Windows 7注册表默认值不会更改吗?

来自分类Dev

在CMD中获取注册表项的特定值

来自分类Dev

使用PowerShell解释注册表值

来自分类Dev

如何更改注册表项的元数据?

来自分类Dev

在注册表项下创建7个注册表值,无需重复

来自分类Dev

注册表删除值

来自分类Dev

设置注册表值

来自分类Dev

注册表值访问

来自分类Dev

有什么方法可以查看Windows注册表项/值的更改日期?

来自分类Dev

无法使用WiX安装程序创建注册表项值

来自分类Dev

为什么正常的卸载操作不会从注册表中删除值?

来自分类Dev

如何从注册表更改高级设置

来自分类Dev

通过注册表更改审核策略

来自分类Dev

从注册表更改CPU MHz

来自分类Dev

通过注册表更改预设

来自分类Dev

如何永久更改Windows注册表?

来自分类Dev

使用命令行更改注册表

来自分类Dev

如何使用PowerShell进行远程注册表更改?

来自分类Dev

如何使用Python监视Windows注册表的更改

来自分类Dev

使用Process Monitor跟踪注册表更改

来自分类Dev

您如何使用 powershell 跟踪注册表中的更改?

来自分类Dev

如何在卸载时修改注册表项值而不从wix中的注册表中删除项?

来自分类Dev

在批处理脚本中更改注册表值后,如何强制更新为代理设置?

来自分类Dev

特定键的注册表值

来自分类Dev

将注册表值读入属性