我发现这个命令这里。
该命令的结构为注册表修改,它将在标准 Windows 资源管理器文件/目录上下文菜单中添加“获取所有权”条目。我可以看到它在哪里使用 cmd.exe,并且我可以从那里了解发生了什么。
注册表修改包含几个命令,但我特别感兴趣的是获取所有权并授予目录树权限的命令:
[HKEY_CLASSES_ROOT\Directory\shell\runas]
@="Grant Admin Full Control"
"NoWorkingDirectory"=""
[HKEY_CLASSES_ROOT\Directory\shell\runas\command]
@="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant administrators:F /t"
"IsolatedCommand"="cmd.exe /c takeown /f \"%1\" /r /d y && icacls \"%1\" /grant administrators:F /t"
其中一个问题是,由于命令的执行方式,它使用 /C 开关明确调用 cmd.exe。这导致引号需要转义序列(我并不完全理解)。该命令还包含我不知道如何在命令行中使用的标记(“takeown”、“icacls”等)。最重要的是,该命令被分成两行,中间有一个换行符 - 我认为这会导致 cmd.exe 尝试将其作为两个单独的命令执行,但事实并非如此。
我需要将命令转换为脚本文件(不会打开另一个 cmd.exe 实例 - 可能是批处理文件),并使用显式目录替换“%1”。此时唯一的限制是此脚本需要能够在本地组策略中作为关机脚本运行。我不相信自己能正确完成此操作,因为我对注册表修改中使用的语法了解甚少。因此,尝试自己做这件事对我来说非常危险。谁知道如果我的语法错误会造成什么损害。
因此,我想问是否有人可以给我指明正确的方向——明确的例子可以加分。
答案1
takown
和icacls
是 DOS 命令。由于注册表文件中没有指定访问它们的路径,因此我假设它们在路径上可用。
只需创建一个批处理文件(例如 ownandgrant.bat)包含
@echo off
takeown /f %1 /r /d y
icacls %1 /grant administrators:F /t
如果目录名称包含一个或多个空格,则可能会导致问题,因此请确保在调用批处理文件时用双引号将目录括起来。
ownandgrant.bat "my special directory"