248

バッチファイルを昇格してのみ実行したい。昇格されていない場合は、昇格された状態でバッチを再起動するオプションをユーザーに提供します。

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

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

4

17 に答える 17

348

外部ツールを使用せずに簡単な方法があります-それはWindows7、8、8.1、10、および11で正常に動作し、下位互換性もあります(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=%~dpnx0"
 rem this works also from cmd shell, other than %~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ダイアログを表示し、管理者アカウントとパスワードの入力を求めます。

私はそれをWindows7、8、8.1、10、11とWindowsXPでテストしました-それはすべてのためにうまく働きます。利点は、開始点の後に、システム管理者権限が必要なものをすべて配置できることです。たとえば、デバッグ目的で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


アップデート:

  • Windows 10.vbsで拡張機能を登録する必要をなくすために、上記のスクリプトの行をに置き換えました。また、Stephen(別の回答)とTomášZato(コメント)によって提案されたように、スクリプトディレクトリをデフォルトとして設定するために追加されました。
    "%temp%\OEgetPrivileges.vbs"

    "%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
    cd /d %~dp0

  • これで、スクリプトは渡されるコマンドラインパラメータを尊重します。観察とインスピレーションを与えてくれたjxmallet、TanisDLJ、PeterMortensenに感謝します。

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

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

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

  • 場合によっては、昇格に別の呼び出し構文が必要になりました。スクリプトが機能しない場合は、次のパラメータを確認してください。
    set cmdInvoke=0
    set winSysFolder=System32
    最初のパラメータをに変更してset cmdInvoke=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でも機能します)。

  • @MiguelAngeloによって提供されるバグ修正:batchPathがcmdシェルで正しく返されるようになりました。この小さなスクリプトtest.cmdは違いを示しています(cmd.exeで実行してから、Windowsエクスプローラーからダブルクリックして実行します)。

    @echo off
    setlocal
    set a="%~0"
    set b="%~dpnx0"
    if %a% EQU %b% echo running shell execute
    if not %a% EQU %b% echo running cmd shell
    echo a="%~0", b="%~dpnx0" 
    pause
    

便利なリンク:

于 2012-09-04T13:31:50.100 に答える
56

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
于 2014-07-09T23:22:02.427 に答える
38

私はそれをこのようにします:

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が呼び出されます)。

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

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

于 2016-06-07T02:40:59.280 に答える
30

Mattの優れた回答を使用していますが、昇格されたスクリプトを実行すると、Windows7システムとWindows8システムに違いが見られます。

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

cd /d %~dp0

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

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

@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
于 2013-08-03T22:35:00.167 に答える
26

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

@ECHO OFF
setlocal EnableDelayedExpansion

::net file to test privileges, 1>NUL redirects output, 2>NUL redirects errors
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...
于 2015-02-12T00:43:35.767 に答える
24

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

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

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

于 2011-08-12T19:04:29.317 に答える
24

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

この方法は、PowerShellの実行権限がロックダウンされていない限り、構成やセットアップなしで機能するはずです。

于 2014-09-10T03:28:55.367 に答える
15

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

set "__COMPAT_LAYER=RunAsInvoker"
start regedit.exe

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

于 2016-03-29T18:55:11.527 に答える
9

私はgsudofor windows:を作成しました。これはsudo現在のコンソールで昇格し(コンテキストが新しいウィンドウに切り替わらない)、クレデンシャルキャッシュ(UACポップアップが削減されます)を使用し、PowerShellコマンドも昇格します。

必要に応じて、管理者権限を必要とするコマンド、またはバッチ全体を昇格させることができます。gsudo 昇格して実行する必要があるものの前に追加するだけです。

gsudoを使用して自分自身を昇格させるバッチファイルの例:

編集:任意のWindows言語で動作し、whoamiの問題を回避する新しいワンライナーバージョン:

net session >nul 2>nul & net session >nul 2>nul || gsudo "%~f0" && exit /b || exit /b
:: This will run as admin ::

代替(元のバージョン):

@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デモ

于 2020-01-03T21:18:53.280 に答える
9

最近、ユーザーフレンドリーなアプローチが必要でしたが、ここや他の場所の貢献者からの貴重な洞察に基づいて、これを思いつきました。この行を.batスクリプトの先頭に配置するだけです。フィードバックを歓迎します。

@pushd %~dp0 & fltmc | find "." && (powershell start '%~f0' ' %*' -verb runas 2>nul && exit /b)

解釈:

  • @pushd %~dp0このバッチファイルに対して一貫した作業ディレクトリを確保します。UNCパスをサポート
  • fltmc昇格せずに実行するとエラーを出力するネイティブWindowsコマンド
  • | find "."エラーがよりきれいになり、昇格しても何も出力されません
  • && (昇格していないためにエラーが発生した場合は、これを実行してください...
  • powershell startPowerShellを呼び出し、Start-Processコマンドレットを呼び出します(startはエイリアスです)
  • '%~f0'この.batファイルのフルパスと名前を渡します。一重引用符を使用すると、パス/ファイル名にスペースを含めることができます
  • ' %*'この.batファイルにすべての引数を渡します。ファンキーな引用符とエスケープシーケンスはおそらく機能しませんが、単純な引用符で囲まれた文字列は機能するはずです。引数が存在しない場合に物事を壊さないようにするために、先頭のスペースが必要です
  • -verb runasこのプロセスを開始するだけではありません... RunAs管理者!
  • 2>nulUACプロンプトがキャンセル/無視された場合、PowerShellの見苦しいエラー出力を破棄します。
  • &&PowerShell を使用して自分自身を正常に呼び出した場合は、...
    • 注:標高を取得しない場合(ユーザーがUACをキャンセルした場合) 、.batは標高なしで実行を継続&& できるため、標高を必要とするコマンドは失敗しますが、他のコマンドは正常に機能します。昇格せずに実行するのではなく、スクリプトを単に終了する場合は、これを1アンパサンドにします。&
  • exit /b)最初の.bat処理を終了します。これは、もう必要ないためです。現在.batを実行している新しい昇格されたプロセスがあります。/ bを追加すると、コマンドラインから.batを起動した場合でも、cmd.exeを開いたままにすることができます....batをダブルクリックしても効果はありません。
于 2021-02-10T06:09:57.220 に答える
6

引数を気にしない場合は、1行の長さのコンパクトなUACプロンプトスクリプトを次に示します。毒のキャラクターのすべての可能な組み合わせを処理する確実な方法がないため、引数を渡しません。

net sess>nul 2>&1||(echo(CreateObject("Shell.Application"^).ShellExecute"%~0",,,"RunAs",1:CreateObject("Scripting.FileSystemObject"^).DeleteFile(wsh.ScriptFullName^)>"%temp%\%~nx0.vbs"&start wscript.exe "%temp%\%~nx0.vbs"&exit)

この行を@echo offバッチファイルのの下に貼り付けます。

説明

パーツは、net sess>nul 2>&1標高をチェックするものです。スクリプトに昇格された権限がない場合にエラーコードを返すコマンドのnet sess省略形です。私はこのSOの答えnet sessionからこのアイデアを得ました。ここでの回答のほとんどは、同じように機能しますが、代わりに機能します。このコマンドは高速で、多くのシステムで互換性があります。net file

次に、エラーレベルが||オペレータに確認されます。チェックが成功すると、元のバッチファイルを再実行するWScriptが作成および実行されますが、それ自体を削除する前に権限が昇格されます。


代替案

WScriptファイルは、一時ファイルを使用しますが、高速で信頼性の高い最善のアプローチです。他のいくつかのバリエーションとその短所/短所を次に示します。

パワーシェル

net sess>nul 2>&1||(powershell saps '%0'-Verb RunAs&exit)

長所:

  • とても短い。
  • 一時ファイルはありません。

短所:

  • 遅い。PowerShellの起動が遅くなる可能性があります。
  • ユーザーがUACプロンプトを拒否すると、赤いテキストが表示されます。try{...}catch{}ただし、これを防ぐために、PowerShellコマンドをにラップすることができます。

MshtaWSHスクリプト

net sess>nul 2>&1||(start mshta.exe vbscript:code(close(Execute("CreateObject(""Shell.Application"").ShellExecute""%~0"",,,""RunAs"",1"^)^)^)&exit)

長所:

  • 速い。
  • 一時ファイルはありません。

短所:

  • 信頼できません。一部のWindows10システムは、Windows Defenderがスクリプトを潜在的なトロイの木馬として傍受するため、スクリプトの実行をブロックします。
于 2020-07-01T01:44:46.103 に答える
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"
:--------------------------------------
于 2014-08-11T08:02:42.087 に答える
4

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

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

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

于 2019-07-24T15:13:59.223 に答える
4

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"'"
于 2020-01-04T19:16:04.170 に答える
3

CMDスクリプトに管理者権限が必要で、それを知っている場合は、スクリプトの最上部(任意の直後@ECHO OFF)に次の行を追加します。

NET FILE > NUL 2>&1 || POWERSHELL -ex Unrestricted -Command "Start-Process -Verb RunAs -FilePath '%ComSpec%' -ArgumentList '/c \"%~fnx0\" %*'" && EXIT /b

既存のNET FILE管理者権限をチェックします。存在しない場合、PowerShellは現在のスクリプト(引数を含む)を昇格されたシェルで再起動し、昇格されていないスクリプトを閉じます。

于 2021-09-21T10:19:42.463 に答える
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>

于 2020-02-21T19:52:47.343 に答える
-4

次のソリューションはクリーンで完全に機能します。

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

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

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

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

 elevate net start service ...
于 2018-09-24T17:29:12.427 に答える