繁体   English   中英

在Windows 10上通过上下文菜单以管理员身份运行cmd命令

[英]run a cmd command as administrator via context menu on windows 10

我需要一些帮助:我想为我的程序创建一个资源管理器上下文菜单选项(同时右键单击一个文件夹),以使用以下.bat文件从管理员菜单中以管理员身份运行它:

@ECHO OFF
:: Choose the correct command processor for the current operating system
SET _cmd=
:: Variable to add shortcut to menu entry (NT only,
:: since COMMAND.COM cannot echo an ampersand)
SET _=
ECHO.%COMSPEC% | FIND /I "command.com" >NUL
IF NOT ERRORLEVEL 1 SET _cmd=command.com /e:4096
ECHO.%COMSPEC% | FIND /I "cmd.exe" >NUL
IF NOT ERRORLEVEL 1 SET _cmd=cmd.exe
IF [%_cmd%]==[cmd.exe] SET _=^&
:: Create a temporary .REG file
> %TEMP%.\DEFOPEN.REG ECHO REGEDIT4
>>%TEMP%.\DEFOPEN.REG ECHO.
:Print
ECHO Adding "Explorer context menu option" entry
>>%TEMP%.\DEFOPEN.REG ECHO [HKEY_CLASSES_ROOT\Directory\shell\ourprog]
>>%TEMP%.\DEFOPEN.REG ECHO @="%_%Add to Hot Backup (A.A.T Anti-Ransomware)"
>>%TEMP%.\DEFOPEN.REG ECHO.
>>%TEMP%.\DEFOPEN.REG ECHO [HKEY_CLASSES_ROOT\Directory\shell\ourprog\command]
>>%TEMP%.\DEFOPEN.REG ECHO @="java -jar C:\users\Tamir Naaman\Desktop\A.A.T-Anti-Ransomware.jar -backup \"%%L\"
>>%TEMP%.\DEFOPEN.REG ECHO.
:: If neither COMMAND.COM nor CMD.EXE then skip this step
IF [%_cmd%]==[] GOTO Merge
:: Merge the temporary .REG file
:Merge
START /WAIT REGEDIT /S %TEMP%.\DEFOPEN.REG
:: Delete the temporary .REG file
DEL %TEMP%.\DEFOPEN.REG
:: Ready
GOTO End
:: Clean up variables and quit
:End
SET _cmd=
SET _=

在尝试单击上下文菜单中的选项后,收到以下错误消息:
错误信息

注册表图片:

注册表图片

注册表图片:

注册表图片

我只是注意到未设置默认值,我该如何修复我的代码?

您能帮我在批处理文件中找到问题吗?

谢谢您的帮助!

以管理员身份执行“ Directory Shell Context Menu Command”的注册表设置

为了以管理员身份(高架)身份执行上下文菜单命令,您必须将命令置于特殊动词RunAs下,例如: [HKEY_CURRENT_USER\\Software\\Classes\\Directory\\shell\\runas\\command]

对于目录,通常不使用该特殊动词,但是您永远无法确定,因此完全不建议使用。

推荐的替代选择是使用静态层叠菜单 ,该菜单从Windows 7开始引入。使用它们,上下文菜单可以使用其自己的私有RunAs动词完全隔离。

利用级联菜单的示例注册表脚本将是

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade]
"ExtendedSubCommandsKey"="Directory\\shell\\AATCascade"
"MUIVerb"="A.A.T Anti-Ransomware"
"HasLUAShield"=""

[HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade\shell\runas]
"HasLUAShield"=""
"MUIVerb"="Add to Hot Backup"

[HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade\shell\runas\command]
@="java.exe -jar \"C:\\Users\\Tamir Naaman\\Desktop\\A.A.T-Anti-Ransomware.jar\" -backup \"%V\""

您必须确保在PATH环境变量中定义了java.exe的位置,或指定了java.exe的完整路径。

级联菜单的优点是,您可以根据需要添加任意数量的命令(使用RunAs以外的其他自定义动词),并将所有命令保留在级联根菜单下,从而使用户界面更友好,更简洁。

在每个子菜单下,只能有一个RunAs动词,因此,如果还有更多菜单项命令需要提升,则必须通过其他方式将其提升。 PowerShell可以用于该任务: PowerShell.exe -Command Start-Process "PathToExecutable" 'ExecutableParameters' -Verb RunAs

当您想添加更多子项目并且每个子菜单可以具有自己的RunAs动词时,甚至可以创建嵌套的级联菜单,以使菜单项更加有条理。

完成注册表脚本的测试后,您可以继续执行下一步,并采用注册表脚本从批处理文件中导入。

将注册表脚本嵌入到批处理文件中

可以使用三种方法各有其优缺点:

  • 将注册表脚本转换为单独的REG.EXE ADD命令。 优点是您不需要像在注册表脚本中那样转义反斜杠( \\ )和双引号( " ),并且在运行时配置注册表设置时更加灵活,例如确定支持文件的位置在运行时,并相应地调整注册表设置,但是转换过程繁琐且容易出错,尽管那里有工具可以自动化任务并快速将注册表脚本转换为批处理文件。

  • 在运行时使用echo命令将注册表脚本写入临时文件,就像您所做的一样(当然有错误和错误)。 它在环境变量的帮助下,在运行时调整注册表脚本时提供了一定程度的灵活性,但是您必须保留原始注册表脚本的转义语法,并且还必须注意批处理中的特殊字符并对其进行转义。 对于小型脚本,这不是问题,但是对于大型脚本,它会很快退出管理。

批处理脚本:

@echo off
(
    echo REGEDIT4
    echo,
    echo [HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade]
    echo "ExtendedSubCommandsKey"="Directory\\shell\\AATCascade"
    echo "MUIVerb"="A.A.T Anti-Ransomware"
    echo "HasLUAShield"=""
    echo [HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade\shell\runas]
    echo "HasLUAShield"=""
    echo "MUIVerb"="Add to Hot Backup"
    echo [HKEY_CURRENT_USER\Software\Classes\Directory\shell\AATCascade\shell\runas\command]
    echo @=^"java.exe -jar \"C:\\Users\\Tamir Naaman\\Desktop\\A.A.T-Anti-Ransomware.jar\" -backup \"%%V\"^"
)>"%TEMP%\DEFOPEN.REG"

:: First try to import the registry script by REG.EXE to avoid unnecessary elevation if possible.
:: In case all the base keys are HKEY_CURRENT_USER no elevation is required.
REG IMPORT "%TEMP%\DEFOPEN.REG" 2>nul || REGEDIT /S "%TEMP%\DEFOPEN.REG"
del "%TEMP%\DEFOPEN.REG"


  • 最后一种方法是将注册表脚本复制粘贴到以下批处理脚本的末尾。 优点是不需要特殊处理,并且reg脚本可以按原样使用。 缺点是注册表脚本是静态的,并且批处理脚本在运行时将无法控制其内容,而是将其直接导入。

自导入器BAT / REG脚本:

:: SelfImporter BAT/REG Script
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "TIME="
set "id=%TIME: =0%"
call :getBatFileInfo @f0 @nx0
set "id=%@nx0%.%id:~0,2%%id:~3,2%%id:~6,2%%id:~-2%"
set "RegFile=%TEMP%\RegImport.%id%.reg.tmp"
(
    echo REGEDIT4
    echo,
    type "%@f0%"
)>"%RegFile%" && (
    echo Importing registry script...
    REG IMPORT "%RegFile%" 2>nul || REGEDIT /S "%RegFile%"
    del "%RegFile%"
)
pause
goto :EOF
:getBatFileInfo <f0> <nx0>
set "%~1=%~f0" & set "%~2=%~nx0" & exit /b
<End of batch script>
Windows Registry Editor Version 5.00

The rest the registry script goes here
.
.

最后,您只需保存带有.CMD扩展名的批处理脚本,而.CMD担心COMMAND.COM

为了获得我假设您想要进入注册表的信息,您的脚本应该看起来像这样:

@ECHO OFF
(   ECHO REGEDIT4
    ECHO(
    ECHO [HKEY_CURRENT_USER\Software\Classes\Directory\shell\ourprog]
    ECHO @="Add to Hot Backup (A.A.T Anti-Ransomware)"
    ECHO(
    ECHO [HKEY_CURRENT_USER\Software\Classes\Directory\shell\ourprog\command]
    ECHO @="java -jar \"C:\\Users\\Tamir Naaman\\Desktop\\A.A.T-Anti-Ransomware.jar\" -backup \"%%V\""
    ECHO()>"%TEMP%\DEFOPEN.REG"
REGEDIT /S "%TEMP%\DEFOPEN.REG"
DEL "%TEMP%\DEFOPEN.REG"

您有责任确保不指定完整路径的java命令在目标环境中正常运行。

您将注意到,我已经使用了用户密钥,因为不必要在PC上为每个用户使用密钥,尤其是当jar文件位于特定用户配置文件树中时

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM