我有一个小脚本,用于在Windows上构建和安装我管理的Bazaar代码库。我想要在Windows shell(cmd.exe)中以提升的管理员权限运行该脚本,就像右键单击并选择“以管理员身份运行”一样,但不使用任何需要使用图形界面的方法。
我有一个小脚本,用于在Windows上构建和安装我管理的Bazaar代码库。我想要在Windows shell(cmd.exe)中以提升的管理员权限运行该脚本,就像右键单击并选择“以管理员身份运行”一样,但不使用任何需要使用图形界面的方法。
您只需使用runas
命令以管理员身份运行程序(但有一个注意事项)。
runas /user:Administrator "cmdName parameters"
runas /user:Administrator "cmd.exe /C %CD%\installer.cmd %CD%"
C:> net user Administrator /active:yes
explorer.exe
)也以管理员用户身份运行。(例如:control.exe
。)然而,对于我的最初目的(无缝安装),Ander 的答案 更加适合。 - jpaugh按下开始按钮。在搜索框中输入“cmd”,然后按下Ctrl+Shift+Enter
一个批处理/WSH混合体可以调用ShellExecute来显示UAC提升对话框...
@if (1==1) @if(1==0) @ELSE
@echo off&SETLOCAL ENABLEEXTENSIONS
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"||(
cscript //E:JScript //nologo "%~f0"
@goto :EOF
)
echo.Performing admin tasks...
REM call foo.exe
@goto :EOF
@end @ELSE
ShA=new ActiveXObject("Shell.Application")
ShA.ShellExecute("cmd.exe","/c \""+WScript.ScriptFullName+"\"","","runas",5);
@end
@echo off
fsutil dirty query %systemdrive% >nul || (
echo Requesting administrative privileges...
set "ELEVATE_CMDLINE=cd /d "%cd%" & call "%~f0" %*"
findstr "^:::" "%~sf0">"%temp%\getadmin.vbs"
cscript //nologo "%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs" & exit /b
)
rem ------- getadmin.vbs ----------------------------------
::: Set objShell = CreateObject("Shell.Application")
::: Set objWshShell = WScript.CreateObject("WScript.Shell")
::: Set objWshProcessEnv = objWshShell.Environment("PROCESS")
::: strCommandLine = Trim(objWshProcessEnv("ELEVATE_CMDLINE"))
::: objShell.ShellExecute "cmd", "/c " & strCommandLine, "", "runas"
rem -------------------------------------------------------
echo Running script as admin.
echo Script file : %~f0
echo Arguments : %*
echo Working dir : %cd%
echo.
:: administrator commands here
:: e.g., run shell as admin
cmd /k
@echo off
<!-- : --- self-elevating_no_temp.bat ---------------------
fsutil dirty query %systemdrive% >nul && goto :gotAdmin
echo Requesting administrative privileges...
set "ELEVATE_CMDLINE=cd /d "%cd%" & call "%~f0" %*"
cscript //nologo "%~f0?.wsf" //job:Elevate
exit /b
-->
<job id="Elevate"><script language="VBScript">
Set objShell = CreateObject("Shell.Application")
Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objWshProcessEnv = objWshShell.Environment("PROCESS")
strCommandLine = Trim(objWshProcessEnv("ELEVATE_CMDLINE"))
objShell.ShellExecute "cmd", "/c " & strCommandLine, "", "runas"
</script></job>
:gotAdmin -------------------------------------------------
echo Running script as admin.
echo Script file : %~f0
echo Arguments : %*
echo Working dir : %cd%
echo.
:: administrator commands here
:: e.g., run shell as admin
cmd /k
cscript "self-elevating.bat?.wsf"
部分。 - Rockallite.bat
和 XML 的 .wsh
混合内容也非常漂亮。 - Rockallite>
<
符号,由于某种原因它们被阻塞了。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"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
:--------------------------------------
使用一些 .vbs 在批处理文件顶部的简单管道技巧, ||
。它将正常退出并以管理员身份重新启动。
@AT>NUL||echo set shell=CreateObject("Shell.Application"):shell.ShellExecute "%~dpnx0",,"%CD%", "runas", 1:set shell=nothing>%~n0.vbs&start %~n0.vbs /realtime& timeout 1 /NOBREAK>nul& del /Q %~n0.vbs&cls&exit
它在使用完temp.vbs后也会使用del /Q
删除它。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command Start-Process -verb RunAs wt
您可以通过其CLI调用PowerShell,powershell.exe
,以调用其支持使用提升启动进程的Start-Process
命令,这样做有两个优点:
您不需要一个“混合”批处理文件,该文件使用巧妙但晦涩的技巧将两个不同环境的语言组合到单个文件中。
您可以在-Verb RunAs
之前放置-Wait
(参见下文),以使提升重新调用同步,即等待其退出并将其退出代码传达给调用者。
以下内容借鉴了Amr Ali的有用的WSH辅助答案;例如,保存并运行为 run-elevated.cmd
:
@echo off & setlocal
:: Check if the current session is already elevated.
:: `net session` only succeeds in elevated sessions.
net session >NUL 2>&1 && goto :ELEVATED
:: Getting here means that we must reinvoke with elevation.
:: Add -Wait before -Verb RunAs to wait for the reinvocation to exit.
set ELEVATE_CMDLINE=cd /d "%~dp0" ^& "%~f0" %*
powershell.exe -noprofile -c Start-Process -Verb RunAs cmd.exe \"/k $env:ELEVATE_CMDLINE\"
exit /b %ERRORLEVEL%
:: Getting here means that we are (now) running with elevation.
:ELEVATED
echo === Running in elevated session:
echo Script file : %~f0
echo Arguments : %*
echo Working dir : %cd%
说到Amr Ali的WSH辅助答案;这里有一个重新制定的方案,使得传递参数更加健壮,因此可以传递诸如"a & b"
之类的参数,并通过避免使用call
来防止在参数中重复"^"
字符 - 请参见第set ELEVATE_CMDLINE=...
行;此外,除了一些可读性的格式化之外,还确保不会意外地回显任何原始批处理语句:
<!-- : (":" is required)
@echo off & setlocal
net session >NUL 2>&1 && goto :ELEVATED
set ELEVATE_CMDLINE=cd /d "%~dp0" ^& "%~f0" %*
cscript.exe //nologo "%~f0?.wsf" //job:Elevate & exit /b
-->
<job id="Elevate">
<script language="VBScript">
Set objShell = CreateObject("Shell.Application")
Set objWshShell = WScript.CreateObject("WScript.Shell")
Set objWshProcessEnv = objWshShell.Environment("PROCESS")
strCommandLine = Trim(objWshProcessEnv("ELEVATE_CMDLINE"))
objShell.ShellExecute "cmd", "/k " & strCommandLine, "", "runas"
</script>
</job>
:ELEVATED
echo === Running in elevated session:
echo Script file: %~f0
echo Arguments : %*
echo Working dir: %cd%
浏览到 C:\windows\System32
,右键单击 cmd.exe
并以管理员身份运行。在 Windows 7 上对我有效。
如果您正在尝试以提升的权限运行脚本,则可以对脚本文件执行相同操作,或使用计划程序的“以不同用户身份运行”选项来运行脚本。
sudo
的Windows工具,可作为Chocolatey软件包使用:https://dev59.com/t2kw5IYBdhLWcg3wx9eC#54642324 - noseratio - open to work