2011-05-10 189 views
44

我有一个小脚本,用于在Windows上为我管理的Bazaar存储库执行构建和安装过程。我试图从运行与提升,管理权限的脚本Windows外壳程序(CMD.EXE) - 就好像我右键单击它并选择以管理员身份运行,但没有使用任何方法这需要使用图形界面。如何从Windows命令行以管理员身份运行命令?

回答

31

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

您可以请@安德斯,告诉我这个脚本的工作要求是什么? a)Windows版本,b)已安装Visual Basic或.NET,c)已安装Java。在我看来,没有任何东西只有Windows运行,但我不确定。谢谢。 – 2014-03-21 14:15:32

+1

@SopalajodeArrierez:在Win2000中添加runas动词,并在Win98/IE4 IIRC中添加cscript.exe。 – Anders 2014-03-21 19:55:24

+0

谢谢@安德斯。请稍微提一个问题:我试图用我自己的程序(调用执行Windows shell.exe的* .lnk *文件)来使用您的脚本,并且我无法设置我的首选**图标**,就像我一直用任何.lnk文件做。这是:将图标分配给.lnk,但在执行期间(接受UAC提示后),运行窗口具有通常的* CMD *图标。有没有办法解决这个问题? – 2014-03-22 12:35:50

2

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

如果你想运行使用提升的权限的脚本,你可以在脚本文件做同样或使用调度程序的运行方式不同的用户选项来运行该脚本。

+0

这很棒,但不是我在命令行中可以做的事情,例如从安装脚本。唯一需要的用户干预是确认升级 - 与在Windows 6/7上安装任何程序时类似。 – jpaugh 2011-05-10 17:31:11

40

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

runas /user:Administrator "cmdName parameters" 

在我而言,这是

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

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

还要注意的是,管理shell(CMD.EXE)在C启动:\ windows \ system32目录。这不是我想要的,但很容易将当前路径传递给我的安装程序,并使用绝对路径引用它。

以这种方式使用runas的警告是这样的:必须启用管理帐户,这不是Windows 7或Vista的默认设置。然而,here是如何使一个伟大的教程,以三种不同的方式:

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

更简单的方法:

C:> net user Administrator /active:yes 
+1

有没有办法以不同的用户(拥有管理员权限)而不是管理员身份运行?这对于我们用工作电脑来说非常重要... – Urchin 2015-04-15 18:30:47

+0

我想象的那样。尝试一下,看看它是否有效。但是,IDK用户为了运行特定命令需要特定的权限,或者通常获得“管理员状态”。 – jpaugh 2015-04-16 20:06:29

+1

这工作,但它不完全像Linux。在使用过程中我注意到了打嗝。在命令执行之前,首先暂停大约5秒钟。自行决定使用它。 – 2017-01-31 18:57:45

2

我将建立一个快捷方式,无论是到CMD或要运行的东西,然后设置快捷方式,需要管理员的属性,然后运行批处理文件的快捷方式。我没有测试过,以确认它会尊重这些属性,但我认为它更优雅,并且不需要激活管理员帐户。

此外,如果你做一个计划任务(可以从代码中设置)有运行它升高有一个选项。

+1

那么,我的目标是完全从命令行完成它。我不能指望每个使用我的安装程序的人在运行我的安装程序之前遵循此过程。 – jpaugh 2011-05-11 14:29:21

+0

@Kate - 我实际上和你有相同的想法,并且今天在win2012服务器上尝试了这一点,但不幸的是,它不起作用。即使将快捷方式设置为“以管理员身份运行”,命令提示符仍然没有管理权限运行。这是当我尝试通过任务计划程序使用快捷方式。任务计划程序必须在封面下执行某些操作,以防止它以管理员身份运行,我不确定。 – dcp 2014-07-25 14:55:40

43

按下启动按钮。在搜索框中输入 “cmd”,然后按Ctrl键++输入

+0

不是什么操作,但无论如何 - 很高兴知道这个捷径! - 谢谢 – exxecc 2015-07-22 08:56:24

10
:: ------- 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 
:: e.g., run shell as admin 
cmd /k 

对于一个演示:ARG2 3 4“另一个长期争论自elevating.bat “带有空格的路径” “

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

<!-- : --- 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 
+0

第二个版本真的很棒。看看美化的''''cscript“self-elevating.bat?.wsf”''''部分。 – Rockallite 2015-04-29 02:01:59

+1

纯文本'''.bat''和XML'''.wsh'''混合内容也非常漂亮。 – Rockallite 2015-04-29 02:16:47

+0

“find”S-1-16-12288“'的SID是什么?当我使用'whoami/groups'时不会出现。 – lit 2015-09-16 14:34:22

1

简单的管道技巧,||,在批处理中使用了一些.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 

它也del /Q temp.vbs完成使用它。

+2

这是邪恶的!你介意更深入地解释这一行吗? – jpaugh 2014-12-31 15:14:56

2

尽管@amr ali's代码很棒,但我有一个例子,我的bat文件包含><标志,并且因为某些原因它们窒息。

我找到了这个。把它放在你的代码之前,它完美的工作。

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" 
:-------------------------------------- 
相关问题