[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[注册表类] 批处理借助工具SecEdit更改注册表子项所有者不成功,帮忙看看错在哪?谢谢!

子项HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\CLSID\{679f85cb-0220-4080-b29b-5540cc05aab6}\ShellFolder
想将其所有者 SYSTEM 更改为 ADMINISTRATORS
打开注册表,手动可以改,但借助工具 SecEdit 却不成功。
  1. Pushd "%Temp%"
  2. > SecFile.inf (
  3.     Echo [Version]
  4.     Echo Signature="$CHICAGO$"
  5.     Echo [Registry Keys]
  6.     Echo "MACHINE\SOFTWARE\WOW6432Node\Classes\CLSID\{679f85cb-0220-4080-b29b-5540cc05aab6}\ShellFolder", 0, "O:BA"
  7. )
  8. SecEdit /Configure /db SecFile.sdb /Cfg SecFile.inf /Log SecFile.log
  9. Popd
复制代码
老师帮忙看看错在哪?谢谢啦!

回复 12# WHY

先收藏,慢慢学习。非常感谢 WHY 兄!

TOP

本帖最后由 WHY 于 2023-2-18 23:14 编辑

参考:https://www.likecs.com/ask-1396155.html
第4行是需要修改的注册表项路径,第5行是修改以后的所有者名称。
如果不需要连同子项一起修改,删除最后一行 Get-SubKeys $subKey;
2023/02/18 修复Win7(PowerShell v2.0)报错
  1. <# :
  2. @echo off
  3. REM 右键以管理员身份运行
  4. set "regPath=HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{FE38753A-44A3-11D1-B5B7-0000C09000C4}"
  5. set "OwnerName=NT SERVICE\TrustedInstaller"
  6. REM set "OwnerName=Administrators"
  7. PowerShell ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\")) '%regPath%' '%OwnerName%'"
  8. pause & exit
  9. #>
  10. param([string]$regPath, [Security.Principal.NTAccount]$owner);
  11. $Code = @'
  12. using System;
  13. using System.Security.Principal;
  14. using System.ComponentModel;
  15. using System.Runtime.InteropServices;
  16. namespace WinAPI{
  17.     public static class Program{
  18.         public static bool ModifyPrivilege(PrivilegeName privilege, bool enable){
  19.             LUID luid;
  20.             if (!LookupPrivilegeValue(null, privilege.ToString(), out luid)){
  21.                 throw new Win32Exception();
  22.             }
  23.             using (WindowsIdentity identity = WindowsIdentity.GetCurrent(TokenAccessLevels.AdjustPrivileges|TokenAccessLevels.Query)){
  24.                 TOKEN_PRIVILEGES newPriv;
  25.                 newPriv.Privileges = new LUID_AND_ATTRIBUTES[1];
  26.                 newPriv.PrivilegeCount = 1;
  27.                 newPriv.Privileges[0].Luid = luid;
  28.                 newPriv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
  29.                 TOKEN_PRIVILEGES prevPriv;
  30.                 prevPriv.Privileges = new LUID_AND_ATTRIBUTES[1];
  31.                 prevPriv.PrivilegeCount = 1;
  32.                 uint returnedBytes;
  33.                 if (!AdjustTokenPrivileges(identity.Token, false, ref newPriv, (uint) Marshal.SizeOf(prevPriv), ref prevPriv, out returnedBytes)){
  34.                     throw new Win32Exception();
  35.                 }
  36.                 return prevPriv.PrivilegeCount == 0 ? enable : ((prevPriv.Privileges[0].Attributes & SE_PRIVILEGE_ENABLED) != 0);
  37.             }
  38.         }
  39.         const uint SE_PRIVILEGE_ENABLED = 2;
  40.         [DllImport("advapi32.dll", SetLastError = true)]
  41.         [return: MarshalAs(UnmanagedType.Bool)]
  42.         static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, [MarshalAs(UnmanagedType.Bool)] bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, UInt32 BufferLengthInBytes, ref TOKEN_PRIVILEGES PreviousState, out UInt32 ReturnLengthInBytes);
  43.         [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Auto)]
  44.         [return: MarshalAs(UnmanagedType.Bool)]
  45.         static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, out LUID lpLuid);
  46.         struct TOKEN_PRIVILEGES {
  47.             public UInt32 PrivilegeCount;
  48.             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1 /*ANYSIZE_ARRAY*/)]
  49.             public LUID_AND_ATTRIBUTES[] Privileges;
  50.         }
  51.         [StructLayout(LayoutKind.Sequential)]
  52.         struct LUID_AND_ATTRIBUTES {
  53.             public LUID Luid;
  54.             public UInt32 Attributes;
  55.         }
  56.         [StructLayout(LayoutKind.Sequential)]
  57.         struct LUID {
  58.             public uint LowPart;
  59.             public int HighPart;
  60.         }
  61.     }
  62.     public enum PrivilegeName {
  63.         SeAssignPrimaryTokenPrivilege,
  64.         SeAuditPrivilege,
  65.         SeBackupPrivilege,
  66.         SeChangeNotifyPrivilege,
  67.         SeCreateGlobalPrivilege,
  68.         SeCreatePagefilePrivilege,
  69.         SeCreatePermanentPrivilege,
  70.         SeCreateSymbolicLinkPrivilege,
  71.         SeCreateTokenPrivilege,
  72.         SeDebugPrivilege,
  73.         SeEnableDelegationPrivilege,
  74.         SeImpersonatePrivilege,
  75.         SeIncreaseBasePriorityPrivilege,
  76.         SeIncreaseQuotaPrivilege,
  77.         SeIncreaseWorkingSetPrivilege,
  78.         SeLoadDriverPrivilege,
  79.         SeLockMemoryPrivilege,
  80.         SeMachineAccountPrivilege,
  81.         SeManageVolumePrivilege,
  82.         SeProfileSingleProcessPrivilege,
  83.         SeRelabelPrivilege,
  84.         SeRemoteShutdownPrivilege,
  85.         SeRestorePrivilege,
  86.         SeSecurityPrivilege,
  87.         SeShutdownPrivilege,
  88.         SeSyncAgentPrivilege,
  89.         SeSystemEnvironmentPrivilege,
  90.         SeSystemProfilePrivilege,
  91.         SeSystemtimePrivilege,
  92.         SeTakeOwnershipPrivilege,
  93.         SeTcbPrivilege,
  94.         SeTimeZonePrivilege,
  95.         SeTrustedCredManAccessPrivilege,
  96.         SeUndockPrivilege,
  97.         SeUnsolicitedInputPrivilege,
  98.     }
  99. }
  100. '@
  101. Add-Type -TypeDefinition $Code;
  102. [WinAPI.Program]::ModifyPrivilege('SeRestorePrivilege', $true);
  103. [WinAPI.Program]::ModifyPrivilege('SeTakeOwnershipPrivilege', $true);
  104. Switch -regex ($regPath) {
  105.     '^(?:HKLM|HKEY_LOCAL_MACHINE)' { $root = 'LocalMachine' }
  106.     '^(?:HKCU|HKEY_CURRENT_USER)'  { $root = 'CurrentUser' }
  107.     '^(?:HKCR|HKEY_CLASSES_ROOT)'  { $root = 'ClassesRoot' }
  108.     '^(?:HKCC|HKEY_CURRENT_CONFIG)'{ $root = 'CurrentConfig' }
  109.     '^(?:HKU|HKEY_USERS)'          { $root = 'Users' }
  110. }
  111. $subKey = $regPath.Split('\', 2)[1];
  112. Function Set-Owner($subKey){
  113.     $objKey = [Microsoft.Win32.Registry]::$root.OpenSubKey($subKey,'ReadWriteSubTree', 'TakeOwnership');
  114.     $acl = $objKey.GetAccessControl();
  115.     $acl.SetOwner($owner);
  116.     $objKey.SetAccessControl($acl);
  117.     $objKey.Close();
  118. }
  119. Function Get-SubKeys($subKey){
  120.     $objKey = [Microsoft.Win32.Registry]::$root.OpenSubKey($subKey);
  121.     $arrName = $objKey.GetSubKeyNames();
  122.     $objKey.Close();
  123.     forEach( $subName In $arrName ){
  124.         Set-Owner ($subKey + '\' + $subName);
  125.         Get-SubKeys ($subKey + '\' + $subName);
  126.     }
  127. }
  128. Set-Owner $subKey;
  129. Get-SubKeys $subKey;
复制代码
2

评分人数

    • czjt1234: 收藏,慢慢学习技术 + 1
    • Shuye: 非常感谢!技术 + 1

TOP

还想问问:除此之外,不借助第三方工具能不能达到这效果 ?

PowerShell,可以将 SYSTEM 所有者更改为 Administrators;反之则不行(SYSTEM账户权限高于Administrator,要调用winAPI)
  1. <# :
  2. @echo off
  3. REM 右键以管理员身份运行
  4. set "regPath=HKLM\SOFTWARE\WOW6432Node\Classes\CLSID\{679f85cb-0220-4080-b29b-5540cc05aab6}\ShellFolder"
  5. PowerShell -C ". ([ScriptBlock]::Create((gc -Literal '%~f0') -join \"`r`n\")) '%regPath%'"
  6. pause & exit
  7. #>
  8. param([string]$regPath);
  9. Switch -regex ($regPath) {
  10.     '^(?:HKLM|HKEY_LOCAL_MACHINE)' { $root = 'LocalMachine' }
  11.     '^(?:HKCU|HKEY_CURRENT_USER)'  { $root = 'CurrentUser' }
  12.     '^(?:HKCR|HKEY_CLASSES_ROOT)'  { $root = 'ClassesRoot' }
  13.     '^(?:HKCC|HKEY_CURRENT_CONFIG)'{ $root = 'CurrentConfig' }
  14.     '^(?:HKU|HKEY_USERS)'          { $root = 'Users' }
  15. }
  16. $subKey = $regPath.Split('\', 2)[1];
  17. $objKey = [Microsoft.Win32.Registry]::$root.OpenSubKey($subKey, 'ReadWriteSubTree', 'TakeOwnership');
  18. $acl = $objKey.GetAccessControl();
  19. $acl.SetOwner([Security.Principal.NTAccount]'Administrators');
  20. $objKey.SetAccessControl($acl);
复制代码
1

评分人数

    • Shuye: 非常感谢!技术 + 1

TOP

回复 8# WHY

测试成功,效果很好,谢谢 WHY 兄!

还想问问:除此之外,不借助第三方工具能不能达到这效果 ?

TOP

回复 7# Batcher


    应该还是需求表述的不到位

TOP

  1. @echo off
  2. REM 右键以管理员身份运行
  3. cd /d "%~dp0"
  4. set "regPath=HKLM\SOFTWARE\WOW6432Node\Classes\CLSID\{679f85cb-0220-4080-b29b-5540cc05aab6}\ShellFolder"
  5. SetACL -on "%regPath%" -ot reg -actn setowner -ownr "n:Administrators" -actn rstchldrn -rst dacl
  6. pause
复制代码
我测试没有问题
SetACL3.1.2 下载地址:https://helgeklein.com/downloads ... utable version).zip
1

评分人数

    • Shuye: 效果很好!技术 + 1

TOP

回复 2# 1073


    肯定是错误,它根本没有理解需要实现什么功能。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

会不会是需要管理员权限?

QQ 20147578

TOP

本帖最后由 Shuye 于 2023-2-15 01:23 编辑

奇怪的是,有些子项用 SecEdit 是可以更改的,

如:MACHINE\SYSTEM\CurrentControlSet\Services\DPS ,用 SecEdit 改来改去都行。

偏偏就 MACHINE\SOFTWARE\WOW6432Node\Classes\CLSID\{679f85cb-0220-4080-b29b-5540cc05aab6}\ShellFolder 不行,

虽然执行后结果显示:任务成功结束,但实际上,注册表并没有更改。

TOP

回复 2# 1073

谢谢 1073 兄!不过,还是不成功。

虽然执行后结果显示:操作成功完成。

但是,该项的所有者依旧还是“SYSTEM”,只是添加了一项键值:"Owner"="Administrators"

TOP

chatGPT

QQ 20147578

TOP

帮你问了一下chatGPT,不知道对不对啊
  1. @echo off
  2. reg add "HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\CLSID\{679f85cb-0220-4080-b29b-5540cc05aab6}\ShellFolder" /v Owner /t REG_SZ /d "Administrators" /f
  3. echo Registry key owner changed to Administrators.
复制代码

TOP

返回列表