使用命令行获取注册表的所有权

我们已经了解如何使用注册表编辑器 (regedit.exe) 更改注册表项子项的所有权。本文将向你介绍如何通过命令行更改注册表项的所有权授予权限的方法。

在 Windows 系统中, 可以使用 takeown.exeicacls.exe 更改文件或文件夹的所有权和权限, 但并没有类似工具可以直接通过命令行更改注册表项的所有权。为此, 我们可以使用第三方工具 SetACL 来实现。

SetACL 的命令行参数简介

SetACL 是一个强大的工具, 可用于更改文件、注册表项、网络共享等对象的所有权和权限。以下是其命令行的基本语法

SetACL -on objectname -ot objecttype -actn action
  • -on: 指定操作的对象路径 (如文件、注册表项, 网络共享, 服务, 打印机等)
  • -ot: 指定对象类型。对于文件或文件夹, 使用 file;对于注册表项, 使用 reg
  • -actn: 指定操作类型。setowner 用于更改所有权, ace 用于更改权限

有关更详细的说明, 请参考 SetACL文档

更改注册表项的所有权和权限

下载并安装 SetACL

  1. 前往 SetACL 官方网站, 下载并解压工具
  2. setacl.exe (根据系统选择 32 位或 64 位版本) 复制到一个文件夹, 例如 D:\tools

注册表项的所有权并分配权限

假设要更改注册表项 HKEY_CLASSES_ROOT\CLSID\{D63B10C5-BB46-4990-A94F-E40B9D520160} 的所有权, 并授予 Administrators 组完全控制权限

管理员模式 下打开命令提示符, 运行以下命令

  1. 设置 Administrators 组为所有者

    SetACL.exe -on "HKEY_CLASSES_ROOT\CLSID\{D63B10C5-BB46-4990-A94F-E40B9D520160}" -ot reg -actn setowner -ownr "n:Administrators"
    
  2. 授予 Administrators 组完全控制权限

    SetACL.exe -on "HKEY_CLASSES_ROOT\CLSID\{D63B10C5-BB46-4990-A94F-E40B9D520160}" -ot reg -actn ace -ace "n:Administrators;p:full"
    

Snipaste_2020-03-24_07-47-49.png

你可以使用注册表编辑器进行检查, 该 Administrators 组拥有此项及其子项, 还具有完全控制权限

Snipaste_2020-03-24_07-55-27.png

递归设置

若要对注册表项及其所有子项设置所有权和权限, 可在命令中添加 -rec Yes 参数

SetACL.exe -on "HKEY_CLASSES_ROOT\CLSID\{D63B10C5-BB46-4990-A94F-E40B9D520160}" -ot reg -actn setowner -ownr "n:Administrators" -rec Yes
SetACL.exe -on "HKEY_CLASSES_ROOT\CLSID\{D63B10C5-BB46-4990-A94F-E40B9D520160}" -ot reg -actn ace -ace "n:Administrators;p:full" -rec Yes

Snipaste_2020-03-24_08-05-50.png

设置 TrustedInstaller 为所有者 owner

如果需要设置 TrustedInstaller (NT SERVICE\TrustedInstaller) 为注册表项的所有者并递归分配其完全控制权限, 可以使用以下命令

SetACL.exe -on "HKEY_CLASSES_ROOT\CLSID\{D63B10C5-BB46-4990-A94F-E40B9D520160}" -ot reg -actn setowner -ownr "n:nt service\trustedinstaller" -rec Yes
SetACL.exe -on "HKEY_CLASSES_ROOT\CLSID\{D63B10C5-BB46-4990-A94F-E40B9D520160}" -ot reg -actn ace -ace "n:nt service\trustedinstaller;p:full" -rec Yes

运行上述命令后, 将 TrustedInstaller 设置为项和子项的所有者

Snipaste_2020-03-24_08-16-51.png

更改注册表项权限时出错?

尝试更改你无权访问的文件/文件夹或注册表项的权限时, SetACL 报告以下错误。为防止发生此错误, 请确保先更改其所有权, 然后再更改控制权限

SetACL finished with error(s):
SetACL error message: The call to SetNamedSecurityInfo () failed
Operating system error message: Access is denied.

扩展阅读

  • Microsoft SubInACL
    在 Windows XP 时代, Microsoft 还发布了另一个名为 SubInACL 的控制台工具。它是 Windows XP/2003 资源工具包工具的一部分。它可以更改文件、文件夹和注册表的所有权和权限。但由于 Microsoft 已停止使用 SubInACL, 并且它默认为 32 位文件和注册表路径 (在 Windows 64 位系统上), 因此在某些情况下无法在 64 位版本的 Windows 中使用

  • Microsoft Regini.exe
    Regini.exe 是另一个内置工具, 可通过脚本更改注册表权限, 但无法更改注册表项的所有者

  • Helge Klein SetACL
    SetACL 是功能最全面的工具, 支持更改所有权、权限, 并填补了 SubInACL 和 Regini 的不足


原文

Take Ownership of Registry Key & Assign Permissions Using Command-line
How to change registry values or permissions from a command line or a script

最后更新于 2020-03-24
使用 Hugo 构建
主题 StackJimmy 设计