Cmd 如何以管理员身份从Windows命令行运行命令?
我有一个小脚本,它在Windows上为我正在管理的存储库执行构建和安装过程。我正在尝试从Windows shell(cmd.exe)中以提升的管理权限运行脚本——就像我右键单击它并选择以管理员身份运行一样,但不使用任何需要使用图形界面的方法。浏览到Cmd 如何以管理员身份从Windows命令行运行命令?,cmd,windows-7,windows-vista,Cmd,Windows 7,Windows Vista,我有一个小脚本,它在Windows上为我正在管理的存储库执行构建和安装过程。我正在尝试从Windows shell(cmd.exe)中以提升的管理权限运行脚本——就像我右键单击它并选择以管理员身份运行一样,但不使用任何需要使用图形界面的方法。浏览到C:\windows\System32,右键单击cmd.exe并以管理员身份运行。在Windows7上为我工作 如果您试图以提升的权限运行脚本,您可以对脚本文件执行相同的操作,或者使用调度程序的“以其他用户身份运行”选项来运行脚本。您所要做的就是使用r
C:\windows\System32
,右键单击cmd.exe
并以管理员身份运行。在Windows7上为我工作
如果您试图以提升的权限运行脚本,您可以对脚本文件执行相同的操作,或者使用调度程序的“以其他用户身份运行”选项来运行脚本。您所要做的就是使用
runas
命令以管理员身份运行程序(需要注意)
在我的情况下,这是
runas /user:Administator "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,也可以是要运行的东西,然后将快捷方式的属性设置为require admin,然后从批处理文件中运行快捷方式。我还没有测试确认它将尊重属性,但我认为它更优雅,不需要激活管理员帐户
此外,如果您将其作为计划任务执行(可以通过代码设置),则可以在此处提升运行它。批处理/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
按开始按钮。在搜索框中键入“cmd”,然后按Ctrl+Shift+Enter 演示:self-elevating.bat“带空格的路径”arg2 3 4“另一个长参数” 这是另一个不需要创建临时文件的版本
<!-- : --- 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
:: e.g., run shell as admin
cmd /k
设置objShell=CreateObject(“Shell.Application”)
设置objWshShell=WScript.CreateObject(“WScript.Shell”)
设置objwshprocesenv=objWshShell.Environment(“进程”)
strCommandLine=Trim(objWshProcessEnv(“提升”\u CMDLINE”))
objShell.ShellExecute“cmd”、“/c”&strCommandLine、”、“runas”
:管理员-----------------------------------------------------------
@回音
echo作为提升用户运行。
回显脚本文件:%~f0
回显参数:%*
回显工作目录:%cd%
回声。
::此处为管理员命令
::例如,以管理员身份运行shell
cmd/k
简单的管道技巧,|
,在批处理的顶部使用一些.vb。它将以管理员身份退出并重新启动
@AT>NUL | | echo set shell=CreateObject(“shell.Application”):shell.shell执行“%~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时会显示它。虽然代码很棒,但我有一个实例,其中我的bat文件包含我刚刚在桌面上创建了一个快捷方式,目标是:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command Start-Process -verb RunAs wt
固定在任务栏后:)这很好,但我不能在命令行中执行,例如,通过安装脚本。唯一需要的用户干预是确认提升——类似于在Windows 6/7上安装任何程序。我的目标是完全从命令行执行。我不能期望使用我的安装程序的每个人在运行我的安装程序之前都遵循这个过程。@Kate-实际上我和你有相同的想法,今天在win2012服务器上尝试了这个过程,但不幸的是,它不起作用。即使将快捷方式设置为“以管理员身份运行”,命令提示符仍会在没有管理员权限的情况下运行。这是当我试图通过任务调度器使用快捷方式时。任务计划程序必须在幕后进行一些操作,以防止它以管理员身份运行,我不确定。请@Anders告诉我此脚本的工作要求是什么?a) Windows版本,b)安装了Visual Basic或.NET,c)安装了Java。在我看来,显而易见,只有一扇窗户在运转,但我不确定。谢谢。@sopalajodearierez:runas动词是在Win2000中添加的,cscript.exe是在Win98/IE4 IIRC中添加的。谢谢,@Anders。请回答一个小问题:我正在尝试将您的脚本用于我自己的程序(调用执行Windows shell.exe的.lnk文件),我无法设置首选图标,因为我总是使用任何.lnk文件。这是:图标被分配给.lnk,但在执行期间(在接受UAC提示后),运行窗口具有通常的CMD图标。有没有办法解决这个问题?我认为早期版本的NT在STARTUPINFO中使用了一个未记录的标志来在控制台中设置一个图标,但是对它的支持在NT4或NT5中消失了。如果您已经有自己的程序,为什么不能在那里执行管理员检查。pif文件可能仍然可以设置图标,但我不知道64位Windows是否支持.pif文件…批处理文件中的@prefix关闭该命令的回显,@是Windows脚本主机()中用于“预处理器”指令的前缀@如果(1==1)在批处理和WSH中都是合法语法,那么剩余的语法将使脚本根据脚本处理器执行批处理或WSH代码
<!-- : --- 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
:: e.g., run shell as admin
cmd /k
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"
:--------------------------------------
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command Start-Process -verb RunAs wt