我需要运行一个需要注册 DLL 的批处理文件。DLL 注册失败,因为批处理文件没有以“管理员”身份启动命令提示符。
有没有办法通过批处理文件以管理员身份启动“命令提示符” 。
环境:Win7/Vista
我需要运行一个需要注册 DLL 的批处理文件。DLL 注册失败,因为批处理文件没有以“管理员”身份启动命令提示符。
有没有办法通过批处理文件以管理员身份启动“命令提示符” 。
环境:Win7/Vista
这个脚本可以解决问题!只需将其粘贴到 bat 文件的顶部即可。如果要查看脚本的输出,请在批处理文件的底部添加“暂停”命令。
该脚本现在经过略微编辑以支持命令行参数。
@echo off
:: BatchGotAdmin
::-------------------------------------
REM --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
echo Requesting administrative privileges...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params = %*:"="
echo UAC.ShellExecute "cmd.exe", "/c %~s0 %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
:gotAdmin
pushd "%CD%"
CD /D "%~dp0"
::--------------------------------------
::ENTER YOUR CODE BELOW:
您可能必须先使用另一个批处理文件才能以管理员权限启动第二个批处理文件。
在第一次使用
runas /noprofile /user:mymachine\administrator yourbatchfile.bat
进一步阅读后,您必须能够在提示符处输入密码。您无法通过管道输入密码,因为出于安全原因,此功能已被锁定。
您可能对psexec有更多的运气。
按Ctrl+Shift并双击快捷方式以作为提升的进程运行。
也可以从开始菜单工作。
(这是基于@DarkXphenomenon 的回答,不幸的是有一些问题。)
您需要将代码包含在此包装器中:
if _%1_==_payload_ goto :payload
:getadmin
echo %~nx0: elevating self
set vbs=%temp%\getadmin.vbs
echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%"
echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
:payload
echo %~nx0: running payload with parameters:
echo %*
echo ---------------------------------------------------
cd /d %2
shift
shift
rem put your code here
rem e.g.: perl myscript.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
goto :eof
这使得批处理文件以提升的用户身份运行。它向特权代码添加了两个参数:
word payload
,表示这是有效载荷调用,即已经提升。否则它只会一遍又一遍地打开新进程。
调用主脚本的目录路径。由于 Windows总是 在“%windir%\system32”中启动提升的 cmd.exe,因此没有简单的方法知道原始路径是什么(并且保留在不接触代码的情况下复制脚本的能力)
注意:不幸的是,由于某种原因shift
不适用于%*
,所以如果您需要传递实际参数,您将不得不求助于我在示例中使用的丑陋表示法 ( %1 %2 %3 %4 %5 %6 %7 %8 %9
),这也带来了最多 9 个参数的限制
当脚本文件驻留在非系统驱动器 (c:) 和带有空格的目录中时,防止脚本失败。
Batch_Script_Run_As_Admin.cmd
@echo off
if _%1_==_payload_ goto :payload
:getadmin
echo %~nx0: elevating self
set vbs=%temp%\getadmin.vbs
echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%"
echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
:payload
::ENTER YOUR CODE BELOW::
::END OF YOUR CODE::
echo.
echo...Script Complete....
echo.
pause
这适用于我在 Windows 7 到 10 中的参数,当从任何地方(包括浏览器)启动应用程序或文件时,以及从任何地方访问文件时。用您的代码替换(您的批处理脚本此处锚点)。该解决方案可能会有所帮助:)
@echo off
call :isAdmin
if %errorlevel% == 0 (
goto :run
) else (
echo Requesting administrative privileges...
goto :UACPrompt
)
exit /b
:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b
:run
<YOUR BATCH SCRIPT HERE>
exit /b
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/c %~s0 %~1", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B
您可以使用链接到批处理文件的快捷方式。只需进入快捷方式的属性并选择高级,然后“以管理员身份运行”。
然后只需隐藏批处理文件,然后运行快捷方式。
这样,您甚至可以为快捷方式设置自己的图标。
也许是这样的:
if "%~s0"=="%~s1" ( cd %~sp1 & shift ) else (
echo CreateObject^("Shell.Application"^).ShellExecute "%~s0","%~0 %*","","runas",1 >"%tmp%%~n0.vbs" & "%tmp%%~n0.vbs" & del /q "%tmp%%~n0.vbs" & goto :eof
)
正如 user2549366 之前建议的那样,“您可以使用链接到批处理文件的快捷方式。” 但在快捷方式的“属性”->“兼容性”选项卡中,可能会禁用以管理员身份运行。
因此,您只需右键单击“file.bat - 快捷方式”,然后转到 -> 属性 -> 快捷方式选项卡 -> 高级,然后您可以单击以管理员身份运行。之后,您可以执行快捷方式。
这是本质上相同文件的更简单版本。
@echo off
break off
title C:\Windows\system32\cmd.exe
cls
:cmd
set /p cmd=C:\Enter Command:
%cmd%
echo.
goto cmd
使用记事本或您选择的任何文本编辑器制作文本。打开记事本,写下这个不带引号的短命令“cmd.exe”并将其保存为cmd.bat。
单击 cmd.bat 并选择“以管理员身份运行”。