バッチファイルを自動昇格させて、必要に応じてUAC管理者権限から要求できるようにするにはどうすればよいですか?


209

バッチファイルで管理者特権でのみ実行したい。昇格していない場合は、ユーザーが昇格したバッチを再起動するオプションを提供します。

システム変数を設定し、2つのファイルをProgram Filesの場所にコピーして、ドライバーインストーラーを起動するバッチファイルを作成しています。Windows 7 / Windows Vistaユーザー(UACが有効で、ローカル管理者であっても)を右クリックして[管理者として実行]を選択せず​​に実行すると、2つのファイルがコピーされてシステム変数が書き込まれ、「アクセス拒否」が表示されます。 。

ユーザーが実際に管理者である場合、コマンドを使用して昇格されたバッチを自動的に再起動したいと思います。それ以外の場合、管理者でない場合は、バッチファイルを実行するために管理者権限が必要であることを伝えたいと思います。xcopyを使用してファイルをコピーし、REG ADDを使用してシステム変数を書き込みます。これらのコマンドを使用して、可能なWindows XPマシンを処理しています。このトピックについて同様の質問を見つけましたが、昇格したバッチファイルの再起動については何も触れていません。


2
私が投稿した内容を確認してください。外部ツールは必要ありません。スクリプトは自動的に管理者権限をチェックし、必要に応じて自動昇格します。
Matt

1
マットの答えがチェックされているかどうかを検討してください。私にはそう思われる。
akauppi 2015年


私が投稿したバッチスクリプトのコメントセクションにある新しいWindows 10のヒントを参考にしてください。
Matt

4
cmdから:@powershell Start-Process cmd -Verb runas。Powershellからドロップするだけ@powershellです。これにより、昇格した権限でcmdが開始されます。
BrunoLM 2015年

回答:


20

昇格させて実行するには、psexec-hオプションを使用してスクリプト自体を呼び出すことができます。

すでに昇格されているかどうかをどのように検出するかわかりません...アクセス拒否エラーが発生した場合にのみ、昇格された権限で再試行してください。

または、のコマンドを用意しxcopyreg.exe常にで実行することもできますがpsexec -h、エンドユーザーが毎回パスワードを入力する必要がある場合(またはスクリプトにパスワードを含めた場合に安全でない場合)は煩わしいでしょう...


10
ご回答ありがとうございます。残念ながら、私はこれが私のオフィスの外の顧客に出て行くので、私は標準のWindows Vista / 7ツール以外のものを使うことができるとは思いません。私はPSExecを合法的に配布できるとは思いません。
PDixon724 2011

2
うん、あなたはそれについて正しいと思います-PSExecは(Sysinternalsの連中を買収したため)PSExecは現在Microsoftツールですが、EULAは配布を禁止しています:(
ewall

2
私の選択肢はかなり限られていると思います。VBでのコーディング方法を知っていれば、管理マニフェストを使用してそれをexeにすることはできますが、どこから始めればよいかもわかりません。Windows Vista / 7を実行している場合は、バッチの最初に管理者として実行するよう警告するだけだと思います。皆さんありがとう。
PDixon724 2011

1
AutoItは、自由に再配布可能で、統合と学習が簡単なサードパーティのツールです。このページでは、スクリプトが昇格された特権を要求する方法を示します。
ewall 2011

4
psexec -h機能しません:「PSEXESVCサービスをインストールできませんでした:アクセスが拒否されました。」psexecを実行するには、すでに管理者権限が必要です。
Nicolas

319

外部ツールを使用せずに簡単な方法があります-Windows 7、8、8.1、10で正常に動作ます下位互換性もあります(Windows XPにはUACがないため、昇格は必要ありません-その中でスクリプトが続行する場合)。

このコードをチェックしてください(私はスレッドバッチファイルに投稿されたNIronwolfのコードに触発されました-Windows 7で「アクセス拒否」?)、私はそれを改善しました-私のバージョンでは、作成および削除されたディレクトリはありません管理者権限を確認してください):

::::::::::::::::::::::::::::::::::::::::::::
:: Elevate.cmd - Version 4
:: Automatically check & get admin rights
:: see "https://stackoverflow.com/a/12264592/1016343" for description
::::::::::::::::::::::::::::::::::::::::::::
 @echo off
 CLS
 ECHO.
 ECHO =============================
 ECHO Running Admin shell
 ECHO =============================

:init
 setlocal DisableDelayedExpansion
 set cmdInvoke=1
 set winSysFolder=System32
 set "batchPath=%~0"
 for %%k in (%0) do set batchName=%%~nk
 set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
 setlocal EnableDelayedExpansion

:checkPrivileges
  NET FILE 1>NUL 2>NUL
  if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )

:getPrivileges
  if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
  ECHO.
  ECHO **************************************
  ECHO Invoking UAC for Privilege Escalation
  ECHO **************************************

  ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
  ECHO args = "ELEV " >> "%vbsGetPrivileges%"
  ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
  ECHO args = args ^& strArg ^& " "  >> "%vbsGetPrivileges%"
  ECHO Next >> "%vbsGetPrivileges%"

  if '%cmdInvoke%'=='1' goto InvokeCmd 

  ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
  goto ExecElevation

:InvokeCmd
  ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
  ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"

:ExecElevation
 "%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
 exit /B

:gotPrivileges
 setlocal & cd /d %~dp0
 if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1)

 ::::::::::::::::::::::::::::
 ::START
 ::::::::::::::::::::::::::::
 REM Run shell as admin (example) - put here code as you like
 ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
 cmd /k

スクリプトは、NET FILE管理者特権を必要とするという事実を利用して戻りますerrorlevel 1、それがない場合利用しています。昇格は、特権を取得するためにバッチファイルを再起動するスクリプトを作成することによって行われます。これにより、WindowsはUACダイアログを表示し、管理者アカウントとパスワードを要求します。

私はWindows 7、8、8.1、10とWindows XPでテストしました-すべての人に問題なく動作します。利点は、たとえば、デバッグのためにWindowsサービスを再インストールして再実行する場合(mypackage.msiがサービスインストーラーパッケージであると想定)、システム管理者特権を必要とするものを何でも配置できることです。 :

msiexec /passive /x mypackage.msi
msiexec /passive /i mypackage.msi
net start myservice

この特権昇格スクリプトがないと、UACは管理者ユーザーとパスワードを3回要求します。今では、最初に1回だけ要求され、必要な場合のみ要求されます。


自動昇格の代わりに、スクリプトがエラーメッセージを表示し、管理者権限がない場合に終了する必要がある場合、これはさらに簡単です。これは、スクリプトの先頭に次の行を追加することで実現できます。

@ECHO OFF & CLS & ECHO.
NET FILE 1>NUL 2>NUL & IF ERRORLEVEL 1 (ECHO You must right-click and select &
  ECHO "RUN AS ADMINISTRATOR"  to run this batch. Exiting... & ECHO. &
  PAUSE & EXIT /D)
REM ... proceed here with admin rights ...

このように、ユーザーは右クリックして[ 管理者として実行 ]を選択する必要があります。スクリプトはREM、管理者権限を検出した場合はステートメントの後に進み、それ以外の場合はエラーで終了します。が不要な場合はPAUSE、削除してください。 重要: NET FILE [...] EXIT /D)同じ行にある必要があります。読みやすくするために、ここでは複数行で表示されています。


一部のマシンで問題が発生しましたが、上記の新しいバージョンで既に解決されています。1つは二重引用符の処理の違いによるもので、もう1つはWindows 7マシンでUACが無効になっている(最低レベルに設定されている)ためで、スクリプトが何度も何度も呼び出します。

パス内の引用符を削除して後で再度追加することで、これを修正しました。スクリプトが昇格された権限で再起動するときに追加されるパラメーターを追加しました。

二重引用符は以下によって削除されます(詳細はここにあります):

setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion

その後、を使用してパスにアクセスできます!batchPath!。二重引用符は含まれていないため"!batchPath!"、スクリプトの後半で言っても安全です。

この線

if '%1'=='ELEV' (shift & goto gotPrivileges)

権限を昇格させるためにVBScriptスクリプトによってスクリプトが既に呼び出されているかどうかをチェックし、無限の再帰を回避します。を使用してパラメータを削除しますshift


更新:

  • 登録しなくても済むようにする.vbsに内線番号のWindows 10を、私はラインを交換した
    "%temp%\OEgetPrivileges.vbs"
    ことにより、
    "%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
    上記のスクリプトでは、またcd /d %~dp0、Stephen(別の回答)とTomášZato(コメント)が提案したように、スクリプトディレクトリをデフォルトとして設定するために追加されました。

  • これで、スクリプトは、渡されるコマンドラインパラメータを尊重します。jxmallet、TanisDLJ、およびPeter Mortensenの観察とインスピレーションに感謝します。

  • Artjom B.のヒントに従って、私はそれを分析し、に置き換えましSHIFTSHIFT /1。これは、%0パラメーターのファイル名を保持します

  • クリーンアップdel "%temp%\OEgetPrivileges_%batchName%.vbs"する:gotPrivilegesセクションに追加されました(mltが推奨)。%batchName%異なるバッチを並行して実行する場合の影響を回避するために追加されました。ファイル名だけを抽出するforなどの高度な文字列関数を利用するには、を使用する必要があることに注意してください%%~nk

  • 最適化されたスクリプト構造、改良(vbsGetPrivilegesファイルのパスまたは名前を簡単に変更できるように変数が追加されました。.vbsバッチを昇格する必要がある場合にのみファイルを削除してください)

  • 場合によっては、昇格に別の呼び出し構文が必要でした。スクリプトが機能しない場合は、次のパラメーターを確認
    set cmdInvoke=0
    set winSysFolder=System32
    set cmdInvoke=1てください。1番目のパラメーターをに変更して、問題が既に修正されているかどうかを確認します。cmd.exe昇格を実行するスクリプトに追加されます。
    または、2番目のパラメータをに変更してみてくださいwinSysFolder=Sysnative。これは、64ビットシステムで役立つ場合があります(ただし、ほとんどの場合は必要ありません)。(ADBaileyはこれを報告しています)。「Sysnative」は、32ビットスクリプトホストから64ビットアプリケーションを起動する場合にのみ必要です(例:Visual Studioビルドプロセス、または別の32ビットアプリケーションからのスクリプト呼び出し)。

  • パラメータがどのように解釈されるかをより明確にするために、今はのように表示していP1=value1 P2=value2 ... P9=value9ます。これは、パスなどのパラメータを二重引用符で囲む必要がある場合に特に役立ちます"C:\Program Files"

  • VBSスクリプトをデバッグする場合は、ここで//X提案するように、パラメーターをWScript.exeに最初のパラメーターとして追加できます(CScript.exeについて説明されていますが、WScript.exeでも機能します)。

役立つリンク:


9
すばらしい回答ですが、場合によっては明らかに必要なことをするために、すべてをやらなければならないことに少し驚かされます。
jcoder

50
実際、ELEVATEなどのコマンドは、Windowsバッチ言語には明らかにありません。
Matt

2
おそらく、より複雑なものについては承認されたスクリプト言語であると思われるpowershellを使用する方が簡単ですが、今のところそれを学ぶ気になりません:(
jcoder

1
PowerShellの構文は完全に異なります(動詞と名詞の構文)が、.NETアセンブリを簡単に呼び出すことができます。しかし、それを処理するのは少し難しいです(スクリプトに署名するなど)。
Matt、

2
@マットあなたの答えのこの拒否された編集の背後にいくつかの真実があるかどうかを確認できますか?
Artjom B.

41

jcoderとMattが述べたように、PowerShellはそれを簡単にし、新しいスクリプトを作成せずにバッチスクリプトに埋め込むこともできました。

Mattのスクリプトを変更しました。

:: Check privileges 
net file 1>NUL 2>NUL
if not '%errorlevel%' == '0' (
    powershell Start-Process -FilePath "%0" -ArgumentList "%cd%" -verb runas >NUL 2>&1
    exit /b
)

:: Change directory with passed argument. Processes started with
:: "runas" start with forced C:\Windows\System32 workdir
cd /d %1

:: Actual work

3
そうです、PowerShellがインストールされている場合は、それを使用して昇格付きのバッチファイルを実行できます(コードスニペットをありがとう!)。そして、はい、ラベルは必要ありません。ヒントをありがとう、それは+1の価値があります... :-)
Matt

2
コマンドから呼び出された場合、Powershell.exeには-verb runasオプションがありません。すでにPowerShellを使用している場合は存在します。
アディルヒンディスタン2014

1
私はこのソリューションが本当に好きです。Windows 8.1では、:gotPrivilegesラベルが機能するために必要でした。
ShaunO 2015年

このバッチファイルがUNCパスでリモートにある場合、問題が発生しています。
Ryan Beesley

最初に変更ディレクトリを追加し、フローを簡略化し、少し掃除しました。プロセスのセキュリティ上の理由により、作業ディレクトリをWorkingDirectoryパラメーターで変更することはできませんStart-Processrunas
ceztko

28

Mattの優れた答えを使用していますが、昇格したスクリプトを実行すると、Windows 7システムとWindows 8システムの違いがわかります。

スクリプトがWindows 8で昇格されると、現在のディレクトリはに設定されC:\Windows\system32ます。さいわい、現在のディレクトリを現在のスクリプトのパスに変更することで、簡単な回避策があります。

cd /d %~dp0

注:cd /dドライブ文字も変更されていることを確認するために使用します。

これをテストするには、以下をスクリプトにコピーします。同じ結果を表示するには、どちらのバージョンでも通常どおり実行します。管理者として実行し、Windows 8の違いを確認します。

@echo off
echo Current path is %cd%
echo Changing directory to the path of the current script
cd %~dp0
echo Current path is %cd%
pause

1
良いヒントです、スティーブン。そのため、スクリプトはcd %~dp0現在のパスを維持するために終了する必要があります(Win7でもこれが機能すると想定しているため、同じコマンドを使用できますが、Win8 +でのみ必要です)。これに+1!
マット

2
注:これは、Windows 7を実行している私のシステムでも必要でした
meh-uk

1
またはpushd %~dp0代わりに使用してください...なぜですか?理由popd
JaroslavZáruba17年

27

私はこのようにします:

NET SESSION
IF %ERRORLEVEL% NEQ 0 GOTO ELEVATE
GOTO ADMINTASKS

:ELEVATE
CD /d %~dp0
MSHTA "javascript: var shell = new ActiveXObject('shell.application'); shell.ShellExecute('%~nx0', '', '', 'runas', 1);close();"
EXIT

:ADMINTASKS
(Do whatever you need to do here)
EXIT

この方法はシンプルで、Windowsのデフォルトコマンドのみを使用します。バッチファイルを再配布する必要がある場合に最適です。

CD /d %~dp0現在のディレクトリをファイルの現在のディレクトリに設定します(/dオプションにより、ファイルが存在するドライブに関係なく、まだ存在しない場合)。

%~nx0 拡張子付きの現在のファイル名を返します(拡張子を含めず、フォルダーに同じ名前のexeがある場合は、exeを呼び出します)。

この投稿には非常に多くの返信があり、返信が表示されるかどうかさえわかりません。

とにかく、私はこの方法が他の回答で提案された他の解決策よりも簡単だと思います。それが誰かを助けることを願っています。


4
cd%〜dp0はネットワークドライブでは機能しません。代わりにpushd%〜dp0を使用してください。
Stavm 2016年

1
私はこの答えの単純さが大好きです。そして最後に、Jscriptを使用する理由です。
Joe Coder

1
マジック!どうもありがとうございました。
Daniele Orlando

1
@ウルフ私はあなたを誤解していることに気づくためだけに巨大な答えを入力しました...私は今あなたの意味を理解しました。編集して、を含めます/d。ありがとうpal :)(PS:ここではピアニストも!)
Matheus Rocha

1
これはうまく機能しますが、cdコマンドを最初に移動することをお勧めします(これにより、昇格されたスクリプトでもパスを使用できるようになります。それ以外の場合、昇格されたスクリプトはsystem32から実行されます)。また、それの出力を非表示にするにはNULにnetコマンドをリダイレクトする必要があります:net session >nul 2>&1
Nulano

23

マットは素晴らしい答えを持っていますが、スクリプトに渡された引数を取り除きます。これは、引数を保持する私の変更です。Windows 8の作業ディレクトリの問題に対するStephenの修正も組み込んだ。

@ECHO OFF
setlocal EnableDelayedExpansion

NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto START ) else ( goto getPrivileges ) 

:getPrivileges
if '%1'=='ELEV' ( goto START )

set "batchPath=%~f0"
set "batchArgs=ELEV"

::Add quotes to the batch path, if needed
set "script=%0"
set script=%script:"=%
IF '%0'=='!script!' ( GOTO PathQuotesDone )
    set "batchPath=""%batchPath%"""
:PathQuotesDone

::Add quotes to the arguments, if needed.
:ArgLoop
IF '%1'=='' ( GOTO EndArgLoop ) else ( GOTO AddArg )
    :AddArg
    set "arg=%1"
    set arg=%arg:"=%
    IF '%1'=='!arg!' ( GOTO NoQuotes )
        set "batchArgs=%batchArgs% "%1""
        GOTO QuotesDone
        :NoQuotes
        set "batchArgs=%batchArgs% %1"
    :QuotesDone
    shift
    GOTO ArgLoop
:EndArgLoop

::Create and run the vb script to elevate the batch file
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%temp%\OEgetPrivileges.vbs"
ECHO UAC.ShellExecute "cmd", "/c ""!batchPath! !batchArgs!""", "", "runas", 1 >> "%temp%\OEgetPrivileges.vbs"
"%temp%\OEgetPrivileges.vbs" 
exit /B

:START
::Remove the elevation tag and set the correct working directory
IF '%1'=='ELEV' ( shift /1 )
cd /d %~dp0

::Do your adminy thing here...

1
これは便利な答えです。ただし、ECHO UAC.ShellExecute....インラインで"batchArgs!"は、 変数を展開しません。を使用し"!batchArgs!"ます。編集が拒否されたのでコメントします。
タマネギ

1
@fliedonionよくわかりました!間違いがタイプミスで修正が機能したために、編集が拒否された理由がわかりません。自分で変更して、Win 8.1でテストしました。次に、このコードを使用するすべてのスクリプトを検索します
。...– jxmallett

2
test.bat "a thing"またはのように引用符で囲まれた引数を使用すると、スクリプトが壊れました"test script.bat" arg1 arg2。すべて修正されました。
jxmallett 2015

私はなんとかそれを壊しました(私の失敗のため:管理者と通常のユーザーは同じマッピングを持っていないため、マップされたネットワークドライブからスクリプトを実行しています)。それでも、出力を確認する方法はありますか?私にとっては、.vbsを見つけて/ cを/ Kに変更し、手動で確認する必要がありました。
Andreas Reiff、2015年

21

そうでない場合は、PowerShellを使用して昇格したスクリプトを再起動します。これらの行をスクリプトの最上部に置きます。

net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c %~fnx0 %*'"
goto :eof
:run
:: TODO: Put code here that needs elevation

「ネット名」メソッドを@Mattの回答からコピーしました。彼の答えははるかによく文書化されており、エラーメッセージなどがあります。これには、PowerShellがすでにインストールされており、Windows 7以降で使用できるという利点があります。一時的なVBScript(* .vbs)ファイルはなく、ツールをダウンロードする必要はありません。

このメソッドは、PowerShellの実行権限がロックダウンされていない限り、構成や設定なしで機能します。


引用符で囲まれたリストの空白で区切られた引数を1つとして処理するように指定すると、その/c %~fnx0 %*'部分は最初の部分以外のすべての部分を残すように見えます。たとえば、test.bat "arg1 arg2 arg3"arg1のみが転送される
Nicolas Mommaerts、2014年

これは、[スタート] -プロセスが.. ArgumentListは内のすべての二重引用符を削除するもの、どんなにているようです
ニコラMommaerts

私のために働く!私はそれを使っていnetsh int set int %wifiname% Enable/Disableます。
Marslo 2016年

2
私は上記のニコラス・モンマーツと同じ問題を抱えていました。:それは(修正の最高の一種)を動作しますが、これなどは、以下の作品は(最後にすべての余分な引用符に注意してください)必要があり、なぜ私は理解していない net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c ""%~fnx0""""'"
地震

もう1つの問題(不便)は、サーバーサービスが実行されていない(理由により無効にされている)場合にスクリプトが一時停止(ユーザー入力を待つ)することです。私は通常、HOSTSファイルの場所に書き込もうとして管理者権限をテストしますが、有効な Windowsサービスに依存したりファイルの書き込みを試みたりするのではなく、Powershellコマンド-Verb runasを呼び出す方が良いでしょう。
スクリプトとコード

15

一部のプログラムでは、スーパーシークレット__COMPAT_LAYER環境変数をに設定するRunAsInvoker と機能します。これを確認してください:

set "__COMPAT_LAYER=RunAsInvoker"
start regedit.exe

このようにしても、ユーザーに管理者権限なしで続行することを求めるUACはありません。


1
Microsoftサイトへのリンクが機能しなくなったため、archive.orgのコンテンツに変更しました。Microsoftのサイトにあるコンテンツへのリンクが見つかれば、だれでも、それを更新してください。
RockPaperLizard

1
まだ昇格されていない中程度の整合性であるため、ではHKLMを編集できません。UACをスキップしただけです。regedit
HackingAddict1337

5

これをスクリプトの冒頭に貼り付けました。

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\icacls.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 args = "" >> "%temp%\getadmin.vbs"
    echo For Each strArg in WScript.Arguments >> "%temp%\getadmin.vbs"
    echo args = args ^& strArg ^& " "  >> "%temp%\getadmin.vbs"
    echo Next >> "%temp%\getadmin.vbs"
    echo UAC.ShellExecute "%~s0", args, "", "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
スクリプトのarg処理が好きです。しかし、ノートcaclsのWindows 7およびそれ以降のWindowsバージョンでは廃止されました。
Matt

Fsutilダーティはさらに良い
ウルフ

1
この行pushd "%CD%"が現在の作業ディレクトリと現在の作業ディレクトリへの変更を保存することを知っていますか?
ウルフ

3

それは2020年であり、 なぜWindowsにはまだsudoツールがないのですか?

したがって、私はgsudosudoWindows用のを書きました現在のコンソールで昇格し(コンテキストが新しいウィンドウに切り替わらない)、資格情報キャッシュ(縮小UACポップアップ)を使用して昇格します。 PowerShellのコマンドを

必要に応じて、管理者権限またはバッチ全体を必要とするコマンドを昇格できます。

プリペンドするだけ gsudo 昇格して実行する必要がある前にします。

自身を昇格させるバッチファイルの例:

@echo off
  rem Test if current context is already elevated:
  whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" 1> nul 2>nul && goto :isadministrator
  echo You are not admin. (yet)
  :: Use gsudo to launch this batch file elevated.
  gsudo "%~f0"
  goto end
:isadministrator
  echo You are admin.
  echo (Do admin stuff now).
:end

実際のgsudoを参照してください。 gsudoデモ

インストール:

  • チョコレートを介して: choco install gsudo
  • またはスクープ: scoop install gsudo
  • またはgithubから入手:https : //github.com/gerardog/gsudo

涼しい。ありがとう。Windowsのどのバージョンで機能しますか?
RockPaperLizard

テストスイートはServer 2019で実行され、私のローカル開発ボックスはWindows 10 1909です。他の古いOSとの互換性はテストしていません。
Gerardo Grignoli

ジェラルドありがとう。他のバージョンのWindowsで誰かが試してみた場合は、結果を投稿してください。
RockPaperLizard

私はWindows 8.1でgsudo v0.7をテストし、動作しました。.Net Framework 4.6そこにインストールするのは簡単ではありません。幸いなことchoco install dotnet4.6.2に、入手が困難な依存関係がいくつかありました。次に、間違ったプロンプト(赤いシャープの代わりにエスケープシーケンス文字)gsudo config Prompt "$p# "ConHost表示する問題を修正しました。@RockPaperLizard
ヘラルド

ジェラルド、どうもありがとう。4.6より前のバージョンの.Net Frameworkで動作するように再コンパイルできますか、それとも4.6に固有のいくつかの機能に依存していますか?
RockPaperLizard

2

この質問には直接当てはまりませんが、ユーザーにいくつかの情報が必要なため、タスクスケジューラから昇格した.batファイルを実行したいときにgoogleがここに連れてきました。

最も簡単な方法は、.batファイルへのショートカットを作成することでした。これは、ショートカットの場合Run as administrator、詳細プロパティから直接設定できるためです。

タスクスケジューラからショートカットを実行すると、昇格された.batファイルが実行されます。


0

PowerShellを使用します。

cmdファイルが長い場合、最初のファイルを使用して昇格を要求してから、実際の作業を行うファイルを呼び出します。

スクリプトが単純なコマンドの場合、すべてが1つのcmdファイルに収まる場合があります。スクリプトファイルにパスを含めることを忘れないでください。

テンプレート:

@echo off
powershell -Command "Start-Process 'cmd' -Verb RunAs -ArgumentList '/c " comands or another script.cmd go here "'"

例1:

@echo off
powershell -Command "Start-Process 'cmd' -Verb RunAs -ArgumentList '/c "powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\BIN\x.ps1"'"

例2:

@echo off
powershell -Command "Start-Process 'cmd' -Verb RunAs -ArgumentList '/c "c:\bin\myScript.cmd"'"

0

これを試して:

@echo off
CLS
:init
setlocal DisableDelayedExpansion
set cmdInvoke=1
set winSysFolder=System32
set "batchPath=%~0"
for %%k in (%0) do set batchName=%%~nk
set "vbsGetPrivileges=%temp%\OEgetPriv_%batchName%.vbs"
setlocal EnableDelayedExpansion
:checkPrivileges
NET FILE 1>NUL 2>NUL
if '%errorlevel%' == '0' ( goto gotPrivileges ) else ( goto getPrivileges )
:getPrivileges
if '%1'=='ELEV' (echo ELEV & shift /1 & goto gotPrivileges)
ECHO.
ECHO Set UAC = CreateObject^("Shell.Application"^) > "%vbsGetPrivileges%"
ECHO args = "ELEV " >> "%vbsGetPrivileges%"
ECHO For Each strArg in WScript.Arguments >> "%vbsGetPrivileges%"
ECHO args = args ^& strArg ^& " "  >> "%vbsGetPrivileges%"
ECHO Next >> "%vbsGetPrivileges%"
if '%cmdInvoke%'=='1' goto InvokeCmd 
ECHO UAC.ShellExecute "!batchPath!", args, "", "runas", 1 >> "%vbsGetPrivileges%"
goto ExecElevation
:InvokeCmd
ECHO args = "/c """ + "!batchPath!" + """ " + args >> "%vbsGetPrivileges%"
ECHO UAC.ShellExecute "%SystemRoot%\%winSysFolder%\cmd.exe", args, "", "runas", 1 >> "%vbsGetPrivileges%"
:ExecElevation
"%SystemRoot%\%winSysFolder%\WScript.exe" "%vbsGetPrivileges%" %*
exit /B
:gotPrivileges
setlocal & cd /d %~dp0
if '%1'=='ELEV' (del "%vbsGetPrivileges%" 1>nul 2>nul  &  shift /1)
REM Run shell as admin (example) - put here code as you like
ECHO %batchName% Arguments: P1=%1 P2=%2 P3=%3 P4=%4 P5=%5 P6=%6 P7=%7 P8=%8 P9=%9
cmd /k

そのバッチファイルに関する情報が必要な場合は、HTML / JS / CSSスニペットを実行します。

document.getElementsByTagName("data")[0].innerHTML="ElevateBatch, version 4, release<br>Required Commands:<ul><li>CLS</li><li>SETLOCAL</li><li>SET</li><li>FOR</li><li>NET</li><li>IF</li><li>ECHO</li><li>GOTO</li><li>EXIT</li><li>DEL</li></ul>It auto-elevates the system and if the user presses No, it just doesn't do anything.<br>This CANNOT be used to create an Elevated Explorer.";
data{font-family:arial;text-decoration:none}
<data></data>


-3

次の解決策はクリーンで完全に機能します。

  1. Elevate zipファイルをhttps://www.winability.com/download/Elevate.zipからダウンロードします。

  2. zip内には、Elevate.exeとElevate64.exeの2つのファイルがあります。(後者はネイティブの64ビットコンパイルですが、必要な場合は、通常の32ビットバージョンのElevate.exeがWindowsの32ビットバージョンと64ビットバージョンの両方で正常に動作するはずです)

  3. Elevate.exeファイルを、Windowsが常に見つけられるフォルダー(C:/ Windowsなど)にコピーします。または、batファイルを保持する予定の同じフォルダーにコピーすることをお勧めします。

  4. これをバッチファイルで使用するには、管理者として実行するコマンドの前に次のようにelevateコマンドを追加します。

 elevate net start service ...

2
このコマンドは、このコマンドの実行を許可するかどうかをユーザーに尋ねるダイアログウィンドウを開くだけです。したがって、ユーザー操作なしで実行する必要のあるバッチファイルでこのコマンドを使用することはできません。
Radon8472

ユーザー操作なしで昇格することが可能である場合、それは巨大なセキュリティホールになるでしょう。すべてのウイルスは、その方法を使用して、ユーザーの承認なしに自分自身を昇格させます。
Andrei Belogortseff
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.