2011-05-10 188 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" 
:-------------------------------------- 
相關問題