Board logo

标题: [注册表类] 【已解决】Reg命令修改二进制注册表中一处值 [打印本页]

作者: wallat    时间: 5 天前 01:53     标题: 【已解决】Reg命令修改二进制注册表中一处值

本帖最后由 wallat 于 2024-12-24 14:53 编辑

需要修改一个二进制注册表,第00001B98 行 第一块的数值 从 01 修改成 04,试了试论坛搜索里面老哥们的方法,在最后一步REG_Add 时报语法错误,研究了很久  找不到问题所在,请大佬指导!!
我修改后的代码

感谢各位大佬指正,目前用Powershell命令可以实现了,修正后的代码在4楼。

另外5楼大佬给出了纯bat脚本的修改方法,上机测试也是可行的,点赞!!!。

再次感谢!!!
  1. @echo off
  2. set byte= 04
  3. for /f "tokens=1-2*" %%A in ('reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Print\Printers\SkyPDF Pro Driver" /v "Default DevMode"') do (
  4.     set settings=%%C
  5. )
  6. echo 原来的值 %settings%
  7. set settings=%settings:~0,14127%%byte%%settings:~14129%
  8. echo 修改后的值 %settings%
  9. reg add "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Print\Printers\SkyPDF Pro Driver" /v "Default DevMode" /t REG_BINARY /d %settings% /f
  10. @pause
复制代码

作者: aloha20200628    时间: 5 天前 15:27

本帖最后由 aloha20200628 于 2024-12-23 15:29 编辑

回复 1# wallat

先在命令行直接运行
  1. reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Print\Printers\SkyPDF Pro Driver" /v "Default DevMode"
复制代码
其返回值应该至少有一行貌似以下:
   Default DevMode REG_BINARY 01
若楼主确认如此,可用以下代码修改其值 01 为 04
  1. @echo off &setlocal &set "byte=04"
  2. for /f "delims=" %%a in (
  3.   'reg query "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Print\Printers\SkyPDF Pro Driver" /v "Default DevMode"^|findstr /ic:"Default DevMode" '
  4. ) do (set "settings=%%a")
  5. echo,原值=%settings:~-2%
  6. echo,新值=%byte%
  7. reg add "HKLM\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Print\Printers\SkyPDF Pro Driver" /v "Default DevMode" /t REG_BINARY /d %byte% /f
  8. pause&exit/b
复制代码

作者: WHY    时间: 5 天前 15:44

%settings:~0,14127%
看看这个偏移值,就知道纯批有没有办法搞定。
作者: wallat    时间: 5 天前 18:28

确实是,刚才修补修补,看了下,bat命令行读取不到这么长的数值,用Powershell搞定了,感谢各位大佬指导!!!
  1. $regPath = "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Print\Printers\SkyPDF Pro Driver"
  2. $valueName = "Default DevMode"
  3. # 获取当前的二进制值
  4. $currentBinaryValue = (Get-ItemProperty -Path $regPath -Name $valueName).$valueName
  5. if ($currentBinaryValue -is [byte[]]) {
  6.     if ($currentBinaryValue.Length -ge 7064) {
  7.         $currentBinaryValue[7064] = 0x04  # 0x04 就是十六进制表示的04,在PowerShell里修改字节数组中字节用十六进制赋值更方便理解
  8.         # 将修改后的值重新设置回注册表
  9.         Set-ItemProperty -Path $regPath -Name $valueName -Value $currentBinaryValue
  10.         Write-Host "注册表中指定位置数值修改成功"
  11.     }
  12. else {
  13.         Write-Host "当前二进制值长度不足,无法进行指定位置修改"
  14.     }
  15. }
  16. else {
  17.     Write-Host "指定的注册表值不是二进制类型,无法进行操作"
  18. }
复制代码

作者: WHY    时间: 5 天前 21:37

本帖最后由 WHY 于 2024-12-24 14:31 编辑

Test.bat,双击运行。
  1. @if(0)==(0) echo off
  2. %1 mshta VBScript:CreateObject("Shell.Application").ShellExecute("CMD","/c """"%~f0"" ::""","","RunAs",1)(close)&exit/b
  3. set "regPath=HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Print\Printers\SkyPDF Pro Driver"
  4. set "regName=Default DevMode"
  5. reg query "%regPath%" /v "%regName%" 2>&1 | cscript //nologo //e:jscript "%~f0" "%regPath%" "%regName%"
  6. pause & exit/b
  7. @end
  8. var strPath = WSH.Arguments(0);
  9. var valName = WSH.Arguments(1);
  10. var subKey  = strPath.substr(strPath.indexOf('\\')+1);
  11. var ROOT    = function(){
  12.     if (/^(?:HKCR|HKEY_CLASSES_ROOT)/i.test(strPath)){
  13.         return 0x80000000;
  14.     } else if (/^(?:HKCU|HKEY_CURRENT_USER)/i.test(strPath)){
  15.         return 0x80000001;
  16.     } else if (/^(?:HKLM|HKEY_LOCAL_MACHINE)/i.test(strPath)){
  17.         return 0x80000002;
  18.     } else if (/^(?:HKUS|HKEY_USERS)/i.test(strPath)){
  19.         return 0x80000003;
  20.     } else if (/^(?:HKCC|HKEY_CURRENT_CONFIG)/i.test(strPath)){
  21.         return 0x80000005;
  22.     }
  23. }();
  24. function setRegistryValue(arrValue){
  25.     var objLoc  = new ActiveXObject('WbemScripting.SWbemLocator');
  26.     var objReg  = objLoc.ConnectServer(null, 'Root\\Default').Get('StdRegProv');
  27.     var oMethod = objReg.Methods_.Item('SetBinaryValue');
  28.     var inParam = oMethod.InParameters.SpawnInstance_();
  29.     inParam.hDefKey     = ROOT;
  30.     inParam.sSubKeyName = subKey;
  31.     inParam.sValueName  = valName;
  32.     inParam.uValue      = arrValue;
  33.     objReg.ExecMethod_(oMethod.Name, inParam);
  34. }
  35. function convertData(Data){
  36.     var arr = [];
  37.     var reg = /../g;
  38.     while (e = reg.exec(Data)) arr.push(1 * ('0x' + e[0]));
  39.     return arr;
  40. }
  41. var s = WSH.StdIn.ReadAll();
  42. var m = s.match(/REG_BINARY\s+([a-f0-9]{14128})[a-f0-9]{2}([a-f0-9]+)/i);
  43. if(m){
  44.     var Data = m[1] + '04' + m[2];  //从14128个字符起,后2个字符修改为04
  45.     setRegistryValue(convertData(Data));
  46.     WSH.Echo('Done');
  47. } else {
  48.     WSH.Echo('no such registry key or value found.');
  49. }
复制代码

作者: wallat    时间: 4 天前 14:51

Test.bat,双击运行。
WHY 发表于 2024-12-23 21:37



    实际上机测试了下,纯bat也可以修改,给大佬点赞!!




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2