207

ユーザーが UAC を使用して Vista マシンから実行するバッチ ファイルを作成しようとしています。このファイルはホスト ファイルを書き換えているため、管理者権限で実行する必要があります。.bat ファイルへのリンクを記載したメールを送信できるようにする必要があります。望ましい動作は、ファイルを右クリックして開くと言うと、UAC ダイアログの 1 つが表示され、画面が暗くなり、アプリケーションに管理者として実行する権限を付与するかどうかを強制的に回答することです。代わりに、コマンド ライン ウィンドウに「アクセスが拒否されました」と表示されるだけです。

これは別の方法で行うことができますか?

4

16 に答える 16

403

このスクリプトはトリックを行います! バットファイルの先頭に貼り付けるだけです。スクリプトの出力を確認する場合は、バッチ ファイルの最後に「一時停止」コマンドを追加します。

更新: このスクリプトは、コマンド ライン引数と 64 ビット OS をサポートするために若干編集されています。

Eneerge @ https://sites.google.com/site/eneerge/scripts/batchgotadminありがとうございます

@echo off

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
    IF "%PROCESSOR_ARCHITECTURE%" EQU "amd64" (
>nul 2>&1 "%SYSTEMROOT%\SysWOW64\cacls.exe" "%SYSTEMROOT%\SysWOW64\config\system"
) ELSE (
>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"
    set params= %*
    echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------    
    <YOUR BATCH SCRIPT HERE>
于 2012-04-07T06:06:53.483 に答える
71

これが私が使ってきたものです:

@echo off
if not "%1"=="am_admin" (
    powershell -Command "Start-Process -Verb RunAs -FilePath '%0' -ArgumentList 'am_admin'"
    exit /b
)

echo main code here
pause

ノート:

  • -Verb RunAsフラグはStart-Process、管理者の昇格を有効にするものです。
  • Windows 7 と 10 でのみテストされています。引用をいじる必要があるかもしれません。
  • は今のところ引数の受け渡しをサポートしていませんが、-ArgumentList. -ArgumentList単一の文字列または文字列配列のいずれかを受け入れることに注意してください。
于 2016-11-02T20:02:30.793 に答える
19

これが私のコードです!大きく見えますが、ほとんどがコメント行 (:: で始まる行) です。

特徴:

  • 完全な引数の転送
  • 作業フォルダを変更しない
  • エラー処理
  • 括弧付きのパスを受け入れます (%TEMP% フォルダーを除く)
  • UNC パスをサポート
  • マップされたフォルダのチェック (管理者がマップされたドライブにアクセスできない場合は警告)

  • 外部ライブラリとして使用できます (このトピックの私の投稿を確認してください: https://stackoverflow.com/a/30417025/4932683 )

  • コードのどこでも必要なときに/必要に応じて呼び出すことができます

これをバッチファイルの最後に添付するか、ライブラリとして保存します(上記を確認してください)

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:RequestAdminElevation FilePath %* || goto:eof
:: 
:: By:   Cyberponk,     v1.5 - 10/06/2016 - Changed the admin rights test method from cacls to fltmc
::          v1.4 - 17/05/2016 - Added instructions for arguments with ! char
::          v1.3 - 01/08/2015 - Fixed not returning to original folder after elevation successful
::          v1.2 - 30/07/2015 - Added error message when running from mapped drive
::          v1.1 - 01/06/2015
:: 
:: Func: opens an admin elevation prompt. If elevated, runs everything after the function call, with elevated rights.
:: Returns: -1 if elevation was requested
::           0 if elevation was successful
::           1 if an error occured
:: 
:: USAGE:
:: If function is copied to a batch file:
::     call :RequestAdminElevation "%~dpf0" %* || goto:eof
::
:: If called as an external library (from a separate batch file):
::     set "_DeleteOnExit=0" on Options
::     (call :RequestAdminElevation "%~dpf0" %* || goto:eof) && CD /D %CD%
::
:: If called from inside another CALL, you must set "_ThisFile=%~dpf0" at the beginning of the file
::     call :RequestAdminElevation "%_ThisFile%" %* || goto:eof
::
:: If you need to use the ! char in the arguments, the calling must be done like this, and afterwards you must use %args% to get the correct arguments:
::      set "args=%* "
::      call :RequestAdminElevation .....   use one of the above but replace the %* with %args:!={a)%
::      set "args=%args:{a)=!%" 
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
setlocal ENABLEDELAYEDEXPANSION & set "_FilePath=%~1"
  if NOT EXIST "!_FilePath!" (echo/Read RequestAdminElevation usage information)
  :: UAC.ShellExecute only works with 8.3 filename, so use %~s1
  set "_FN=_%~ns1" & echo/%TEMP%| findstr /C:"(" >nul && (echo/ERROR: %%TEMP%% path can not contain parenthesis &pause &endlocal &fc;: 2>nul & goto:eof)
  :: Remove parenthesis from the temp filename
  set _FN=%_FN:(=%
  set _vbspath="%temp:~%\%_FN:)=%.vbs" & set "_batpath=%temp:~%\%_FN:)=%.bat"

  :: Test if we gave admin rights
  fltmc >nul 2>&1 || goto :_getElevation

  :: Elevation successful
  (if exist %_vbspath% ( del %_vbspath% )) & (if exist %_batpath% ( del %_batpath% )) 
  :: Set ERRORLEVEL 0, set original folder and exit
  endlocal & CD /D "%~dp1" & ver >nul & goto:eof

  :_getElevation
  echo/Requesting elevation...
  :: Try to create %_vbspath% file. If failed, exit with ERRORLEVEL 1
  echo/Set UAC = CreateObject^("Shell.Application"^) > %_vbspath% || (echo/&echo/Unable to create %_vbspath% & endlocal &md; 2>nul &goto:eof) 
  echo/UAC.ShellExecute "%_batpath%", "", "", "runas", 1 >> %_vbspath% & echo/wscript.Quit(1)>> %_vbspath%
  :: Try to create %_batpath% file. If failed, exit with ERRORLEVEL 1
  echo/@%* > "%_batpath%" || (echo/&echo/Unable to create %_batpath% & endlocal &md; 2>nul &goto:eof)
  echo/@if %%errorlevel%%==9009 (echo/^&echo/Admin user could not read the batch file. If running from a mapped drive or UNC path, check if Admin user can read it.)^&echo/^& @if %%errorlevel%% NEQ 0 pause >> "%_batpath%"

  :: Run %_vbspath%, that calls %_batpath%, that calls the original file
  %_vbspath% && (echo/&echo/Failed to run VBscript %_vbspath% &endlocal &md; 2>nul & goto:eof)

  :: Vbscript has been run, exit with ERRORLEVEL -1
  echo/&echo/Elevation was requested on a new CMD window &endlocal &fc;: 2>nul & goto:eof
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

使い方の例

:EXAMPLE
@echo off

 :: Run this script with elevation
 call :RequestAdminElevation "%~dpfs0" %* || goto:eof

  echo/I now have Admin rights!
  echo/
  echo/Arguments using %%args%%:    %args%
  echo/Arguments using %%*: %*
  echo/%%1= %~1
  echo/%%2= %~2
  echo/%%3= %~3

  echo/
  echo/Current Directory: %CD%
  echo/
  echo/This file: %0
  echo/

pause &goto:eof

[here you paste the RequestAdminElevation function code]
于 2015-06-02T07:39:09.180 に答える
11

別のアプローチは、

  • ショートカットをローカルに作成し、管理者権限を呼び出すように設定します (プロパティ、詳細設定、管理者として実行)

その後

  • ユーザーにショートカット (またはバッチ ファイル自体へのリンクではなく、ショートカットへのリンク) を送信します。
于 2016-11-02T21:00:11.843 に答える
4

これが OP の解決策ではないことはわかっていますが、ここには他にも多くのユースケースがあると確信しているので、共有したいと思いました。

これらの回答のすべてのコード例に問題がありましたが、見つけました: http://www.robotronic.de/runasspcEn.html

管理者として実行できるだけでなく、ファイルが改ざんされていないことを確認し、必要な情報を安全に保存します。使い方を理解するのに最も明白なツールではないことは認めますが、コードを書いている私たちにとっては十分に単純なはずです。

于 2013-05-03T03:44:20.943 に答える
0

バッチ ファイルから管理者権限を要求することはできませんが、Windows スクリプティング ホスト スクリプトを %temp% に記述して実行することはできます (その結果、バッチが管理者として実行されます)。シェルで ShellExecute メソッドを呼び出す必要があります。 「runas」を動詞とするアプリケーション オブジェクト

于 2009-12-15T16:41:29.333 に答える
-6

runas コマンドを使用します。しかし、.bat ファイルを簡単に電子メールで送信できるとは思いません。

于 2009-12-13T01:11:44.507 に答える