我需要运行一个批处理文件,其中需要注册一个DLL。由于批处理文件未以“管理员”身份启动命令提示符,因此DLL的注册失败。
是否有办法通过批处理文件以管理员身份启动命令提示符?
环境: Win7/Vista
我需要运行一个批处理文件,其中需要注册一个DLL。由于批处理文件未以“管理员”身份启动命令提示符,因此DLL的注册失败。
是否有办法通过批处理文件以管理员身份启动命令提示符?
环境: Win7/Vista
这个脚本很有效!只需将其粘贴到批处理文件的顶部即可。如果您想查看脚本输出,请在批处理文件底部添加“pause”命令。
这个脚本现在稍作修改,以支持命令行参数。
@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:
sc stop wuauserv&sc config wuauserv start = disabled
- proseosoc你可能需要先使用另一个批处理文件,以管理员权限启动第二个文件。
在第一种情况下:
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,所以没有简单的方法知道原始路径是什么(并且保留不触及代码就能复制脚本的能力)。
注意:不幸的是,由于某种原因,shift
对于%*
无效,因此如果需要传递实际参数,则必须采用我在示例中使用的丑陋符号表示法(%1 %2 %3 %4 %5 %6 %7 %8 %9
),这也带来了最多9个参数的限制。
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 XP
中生成)快捷方式集:https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/ToolAdaptors/lnk/ 或者自己生成:https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/ToolAdaptors/vbs/ - Andry在Windows 7到10中,当从任何地方(包括浏览器)启动应用程序或文件以及从任何地方访问文件时,使用参数可以为我解决问题。将(YOUR BATCH SCRIPT HERE anchor)替换为您的代码。这个解决方案可能会有所帮助 :)
@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
powershell -Command "Start-Process cmd -Verb RunAs -ArgumentList '/k cd /d %~dp0'"
exit
这段代码使用PowerShell以管理员权限启动新的命令提示符进程。-Verb RunAs 参数告诉PowerShell以管理员身份运行该进程,/k cd /d %~dp0 参数将目录更改为批处理文件所在的位置。但是,我将其用于Windows 10。