你如何从Windows命令行以pipe理员身份运行命令?

我有一个小脚本,在Windows上为我pipe理的bazaar存储库执行构build和安装过程。 我试图从Windows Shell(cmd.exe)中运行具有提升的pipe理权限的脚本 – 就像我右键单击它并select以pipe理员身份运行一样 ,但不使用任何需要使用graphics界面。

我没有看到在networking上或在这里的计算器上的任何答案,但经过一个小时左右的search, 我设法拼凑一个答案 ,我已经下面张贴。 随意提供替代或扩大的答案,但是。

批处理/ 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 

按下开始button。 在search框中input“cmd”,然后按Ctrl + Shift + Enter

所有你需要做的就是使用runas命令来以pipe理员身份运行你的程序(有一个警告)。

 runas /user:Administrator "cmdName parameters" 

就我而言,这是

 runas /user:Administator "cmd.exe /C %CD%\installer.cmd %CD%" 

请注意,您必须使用引号,否则runas命令会将开关选项吞噬到cmd。

另请注意,pipe理shell(cmd.exe)在C:\ Windows \ System32文件夹中启动。 这不是我想要的,但很容易将当前path传递给我的安装程序,并使用绝对path引用它。

以这种方式使用runas的警告是这样的: 必须启用pipe理帐户 ,这不是Windows 7或Vista的默认设置。 不过, 这里有一个关于如何启用它的好教程,有三种不同的方式:

我自己通过打开pipe理工具本地安全策略 ,然后导航到本地策略\安全选项 ,并将帐户:pipe理帐户状态策略的值更改为启用,这不是链接中显示的三种方式启用它。

更简单的方法:

 C:> net user Administrator /active:yes 
 :: ------- Self-elevating.bat -------------------------------------- @whoami /groups | find "S-1-16-12288" > nul && goto :admin set "ELEVATE_CMDLINE=cd /d "%~dp0" & call "%~f0" %*" findstr "^:::" "%~sf0">temp.vbs cscript //nologo temp.vbs & del temp.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" :admin ------------------------------------------------------------- @echo off echo Running as elevated user. echo Script file : %~f0 echo Arguments : %* echo Working dir : %cd% echo. :: administrator commands here :: eg, run shell as admin cmd /k 

对于演示:self-elevating.bat“带空格的path”arg2 3 4“另一个长参数”

这是另一个不需要创build临时文件的版本。

 <!-- : --- Self-Elevating Batch Script --------------------------- @whoami /groups | find "S-1-16-12288" > nul && goto :admin set "ELEVATE_CMDLINE=cd /d "%~dp0" & 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> :admin ----------------------------------------------------------- @echo off echo Running as elevated user. echo Script file : %~f0 echo Arguments : %* echo Working dir : %cd% echo. :: administrator commands here :: eg, run shell as admin cmd /k 

浏览到C:\windows\System32并右键单击cmd.exe并以pipe理员身份运行。 在Windows 7上为我工作。

如果您尝试使用提升的权限运行脚本,则可以对脚本文件执行相同的操作,也可以使用调度程序的运行作为不同的用户选项来运行脚本。

我会设置一个快捷方式,或者到CMD或者想要运行的东西,然后设置快捷方式的属性为需要admin,然后从batch file运行快捷方式。 我还没有testing,以确认它会尊重属性,但我认为它更优雅,不需要激活pipe理员帐户。

另外,如果您将其作为计划任务(可以从代码设置)来执行,则可以select在此处运行该任务。

简单的pipe道技巧|| 与一些.vbs使用顶部的批处理,它将退出正常,并重新启动为pipe理员

 @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

尽pipe@amr ali的代码非常棒。 我有一个例子,我的蝙蝠含有> <迹象,由于某种原因,他们窒息。

find这个代替。 把它放在你的代码之前,它完美的工作。

 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" :--------------------------------------