web-dev-qa-db-ja.com

Windowsコマンドラインから管理者としてコマンドを実行するにはどうすればよいですか?

私が管理している Bazaar リポジトリに対してWindowsでビルドおよびインストールプロセスを実行する小さなスクリプトがあります。私はwithinWindows Shell(cmd.exe)から昇格された管理者権限でスクリプトを実行しようとしています-ちょうど私が正しいかのように-クリックして選択しました管理者として実行、ただしグラフィカルインターフェイスの使用を必要とする方法を使用しません。

55
jpaugh

バッチ/ 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
38
Anders

スタートボタンを押します。検索ボックスに「cmd」と入力してから、 Ctrl+Shift+Enter

57
slashdottir

runasコマンドを使用して、管理者としてプログラムを実行するだけです(注意が必要です)。

runas /user:Administrator "cmdName parameters"

私の場合、これは

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

引用符を使用する必要があることに注意してください。そうしないと、runasコマンドがcmdへのスイッチオプションを使い果たしてしまいます。

また、C:\ Windows\System32フォルダーで管理シェル(cmd.exe)が起動することに注意してください。これは私が望んでいたものではありませんが、現在のパスをインストーラーに渡し、絶対パスを使用して参照するのは簡単でした。

警告:管理者アカウントを有効にします

この方法でrunasを使用するには、管理アカウントを有効にする必要がありますが、これはWindows 7またはVistaのデフォルトではありません。ただし、 here は、3つの異なる方法で有効にする方法に関する優れたチュートリアルです。

私自身、管理ツールローカルセキュリティポリシーを開いて有効にし、 Local Policies\Security Optionsに移動し、Accountsの値を変更する:管理アカウントステータスポリシーを有効にします。これは、リンクに表示される3つの方法のいずれでもありません。

さらに簡単な方法:

C:> Net User Administrator /active:yes
56
jpaugh
:: ------- 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

デモの場合:self-elevating.bat "space with path" arg2 3 4 "another long argument"

また、これは一時ファイルを作成する必要のない別のバージョンです。

<!-- : --- 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
10
Amr Ali

CMDまたは実行するもののいずれかにショートカットを設定し、ショートカットのプロパティにadminを要求するように設定してから、バッチファイルからショートカットを実行します。プロパティを尊重することを確認するためのテストは行っていませんが、よりエレガントで、管理者アカウントをアクティブにする必要はないと思います。

また、スケジュールされたタスク(コードから設定可能)として実行する場合、そこで昇格して実行するオプションがあります。

2
Kate Gregory

シンプルなパイプトリック、||、バッチの先頭で使用されるいくつかの.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
strance

@ 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"
:--------------------------------------
2
Kapanther

C:\windows\System32を参照し、cmd.exeを右クリックして、管理者として実行します。 Windows 7で働いていました。

昇格した特権でスクリプトを実行しようとしている場合は、スクリプトファイルに対して同じことを行うか、スケジューラの別のユーザーとして実行オプションを使用してスクリプトを実行できます。

0
Rasika