我有一个小脚本,可以在 Windows 上为我管理的 Bazaar 存储库执行构建和安装过程。我正在尝试从 Windows shell (cmd.exe) 中以提升的管理权限运行该脚本,就像右键单击它并选择“以管理员身份运行”一样,但不使用任何方法这需要使用图形界面。 您所要做的就是使用
runas
runas /user:Administrator "cmdName parameters"
runas /user:Administrator "cmd.exe /C %CD%\installer.cmd %CD%"
请注意,必须使用引号,否则 runas 命令会将 switch 选项吞噬到 cmd。
另请注意,管理 shell (cmd.exe) 在 C:\Windows\System32 文件夹中启动。这不是我想要的,但很容易将当前路径传递给我的安装程序,并使用绝对路径引用它。
注意:启用管理员帐户
以这种方式使用 runas 需要启用管理帐户,这在 Windows 7 或 Vista 上不是默认设置。然而,
这里我自己通过打开管理工具、
本地安全策略来启用它,然后导航到本地策略\安全选项并将帐户:管理帐户状态策略的值更改为已启用,这不是链接中显示了三种方式。
实现此目的的更简单方法:
C:> net user Administrator /active:yes
按下开始按钮。在搜索框中输入“cmd”,然后按Ctrl
+Enter 批处理/WSH 混合能够调用 ShellExecute 来显示 UAC 提升对话框...
@echo off
:: ------- Self-elevating.bat ---------------------------------------
@whoami /groups | find "S-1-16-12288" > nul && goto :gotAdmin
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
::: 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"
:gotAdmin -----------------------------------------------------------
@echo off
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
对于演示:self-elevating.bat“带空格的路径”arg2 3 4“另一个长参数”
这是另一个不需要创建临时文件的版本。
@echo off
<!-- : --- Self-elevating.bat ---------------------------------------
@whoami /groups | find "S-1-16-12288" > 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 off
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
虽然@amr ali 的
>
<
符号,并且由于某种原因它被它们阻塞了。
我找到了这个。只需将其全部放在代码之前,它就可以完美运行。
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"
:--------------------------------------
简单的管道技巧,
||
@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
使用完毕后,它还会
del /Q
temp.vbs。
我会设置一个快捷方式,无论是 CMD 还是您想要运行的东西,然后将快捷方式的属性设置为需要管理员,然后从批处理文件运行快捷方式。我还没有测试来确认它会尊重这些属性,但我认为它更优雅,并且不需要激活管理员帐户。
我刚刚在桌面上创建了一个快捷方式,目标中包含以下行:
固定在任务栏后:)
您可以通过其 CLI
Start-Process
cmdlet,它支持以提升方式启动进程;这样做有两个好处:
您不需要使用巧妙但晦涩的技巧将两种不同环境的语言组合在一个文件中的hybrid您可以将
-Wait
-Verb RunAs
之前(见下文),以使提升的重新调用成为
同步,即等待它退出并将其退出代码传达给调用者。 以下内容借用了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%
"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 上为我工作。
如果您尝试使用提升的权限运行脚本,您可以对脚本文件执行相同的操作,或使用调度程序的运行作为不同的用户选项来运行脚本。
NirCmd
www.nirsoft.net*RunAs "D:\Path\To\app.exe"
*RunAs "D:\Path\To\app.exe" [YourCommandArgs]