我需要运行一个需要注册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
这使得批处理文件以提升的用户身份运行。它向特权代码添加了两个参数:
字
payload
,表示这是有效负载调用,即已经提升。否则
它只会一遍又一遍地打开新进程。调用主脚本的目录路径。由于 Windows 总是 在“%windir%\system32”中启动提升的 cmd.exe,没有简单的方法知道什么 原始路径是(and保留复制脚本的能力,而无需 触摸代码)
注意:不幸的是,由于某种原因
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。将 (YOUR BATCH SCRIPT HERE 锚点) 替换为您的代码。这个解决方案可能有帮助:)
@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 - 快捷方式”,然后转到 -> 属性 -> 快捷方式选项卡 -> 高级,然后单击以管理员身份运行。之后,您可以执行快捷方式。
您可以使用下面的代码通过批处理文件以管理员身份运行 CMD。
@echo off
powershell -Command "Start-Process cmd -Verb RunAs -ArgumentList '/k cd /d %~dp0'"
exit
此代码使用 PowerShell 以管理权限启动新的命令提示符进程。 -Verb RunAs 参数告诉 PowerShell 以管理员身份运行该进程, /k cd /d %~dp0 参数将目录更改为批处理文件的位置但是,我将其用于 Windows 10。
在批处理文件开头添加一行以管理员身份运行cmd
标题 C:\Windows\system3