ユーザーがUACを使用してVistaマシンから実行するためのバッチファイルを作成しようとしています。このファイルはホストファイルを書き換えているため、管理者権限で実行する必要があります。 .batファイルへのリンクを記載したメールを送信する必要があります。望ましい動作は、ファイルを右クリックして「開く」と言うと、画面を暗くし、アプリケーションに管理者として実行する許可を与えるかどうかを答えさせるUACダイアログの1つを取得することです。代わりに、コマンドラインウィンドウに「アクセスが拒否されました」と表示されます。
これは異なる方法で可能ですか?
このスクリプトはトリックを行います! batファイルの先頭に貼り付けてください。スクリプトの出力を確認する場合は、バッチファイルの下部に「一時停止」コマンドを追加します。
更新:このスクリプトは、コマンドライン引数と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>
ここに私が使っているワンライナーがあります:
@echo off
if not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit /b)
echo main code here
pause
ノート:
これが私のコードです!大きく見えますが、ほとんどはコメント行(::で始まる行)です。
特徴:
マップされたフォルダーのチェック(管理者がマップされたドライブにアクセスできない場合は警告します)
外部ライブラリとして使用できます(このトピックの投稿を確認してください: https://stackoverflow.com/a/30417025/493268 )
これをバッチファイルの最後に添付するか、ライブラリとして保存してください(上記を確認)
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
: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]
別のアプローチは
その後
デニス
[後で追加-はい、このスレッドの日付に気づきませんでした。]
Ben Gripkaのソリューションは無限ループを引き起こします。彼のバッチは次のように動作します(擬似コード):
IF "no admin privileges?"
"write a VBS that calls this batch with admin privileges"
ELSE
"execute actual commands that require admin privileges"
ご覧のとおり、VBSが管理者特権の要求に失敗すると、これにより無限ループが発生します。
ただし、管理者特権は正常に要求されていますが、無限ループが発生する可能性があります。
Ben Gripkaのバッチファイルのチェックは、エラーが発生しやすいだけです。バッチをいじってみたところ、チェックは失敗しましたが、管理者権限が利用できることがわかりました。興味深いことに、Windows Explorerからバッチファイルを起動した場合、チェックは期待どおりに機能しましたが、IDEから起動したときには機能しませんでした。
したがって、2つの個別のバッチファイルを使用することをお勧めします。最初は、2番目のバッチファイルを呼び出すVBSを生成します。
@echo off
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c ""%~dp0\my_commands.bat"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
2番目の「my_commands.bat」という名前は、最初のディレクトリと同じディレクトリにあり、実際のコマンドが含まれています。
pushd "%CD%"
CD /D "%~dp0"
REM Your commands which require admin privileges here
これにより、無限ループが発生せず、エラーが発生しやすい管理者権限チェックも削除されます。
これがOPの解決策ではないことは知っていますが、ここには他にも多くのユースケースがあると確信しているので、共有したいと思いました。
私はこれらの回答のすべてのコード例に問題がありましたが、その後見つけました: http://www.robotronic.de/runasspcEn.html
管理者として実行できるだけでなく、ファイルをチェックして改ざんされていないことを確認し、必要な情報を安全に保存します。使い方を理解するための最も明白なツールではないが、コードを書いている私たちにとっては、それは十分に簡単なはずです。
@echo off
とtitle
は、このコードの前に来ることができます。
net session>nul 2>&1
if %errorlevel%==0 goto main
echo CreateObject("Shell.Application").ShellExecute "%~f0", "", "", "runas">"%temp%/elevate.vbs"
"%temp%/elevate.vbs"
del "%temp%/elevate.vbs"
exit
:main
<code goes here>
exit
次のことを心配する必要がない場合、他の多くの答えは過剰です。
cd %~dp0
はバッチファイルを含むディレクトリに変更されます)私はこのスクリプトで問題が発生し、新しいコマンドプロンプトがポップアップし、無限ループで(Win 7 Proを使用して)再び実行されるため、別のアプローチを試すことをお勧めします: どうすればバッチファイルを自動昇格できますか?必要に応じてUAC管理者権限から要求しますか?
編集に記載されているように、スクリプトの最後にこれを追加する必要があることに注意してください。特権が昇格された後、スクリプトディレクトリに戻ります:cd/d%〜dp0
Toster-cxの投稿およびこのページの他の興味深い投稿に基づいて、問題の構成および解決方法に関する洞察を得ました。ディスククリーンアップユーティリティを毎週月曜日と木曜日の昼休み(午後2時など)に2回実行するようにしたいという同様の問題がありました。ただし、これには権限の昇格が必要でした。
私のような他の初心者に役立つかもしれないバッチファイルを共有する-
@echo off
echo Welcome to scheduling 'PC Maintenance Activity'
ping localhost -n 3 >nul
echo -- Step - 1 of 3 : Please give 'Admin' rights on next screen
ping localhost -n 5 >nul
if not "%1"=="am_admin" (powershell start -verb runas '%0' am_admin & exit)
cls
echo -- Step - 2 of 3 : In next screen, select temp areas for cleaning
during routine scheduled activity
ping localhost -n 3 >nul
C:\Windows\System32\cleanmgr.exe /sageset:112
cls
echo Now scheduling maintenance activity...
SchTasks /Create /SC WEEKLY /D MON,THU /TN PC_Cleanup /TR
"C:\Windows\System32\cleanmgr.exe "/sagerun:112 /ST 14:00
cls
echo -- Thanks for your co-operation --
echo -- Maintenance activity is scheduled for --
echo -- Every Monday and Thursday at 2 pm --
ping localhost -n 10 >nul
このフォーラムとRems POSTに感謝します[ https://www.petri.com/forums/forum/windows-scripting/general-scripting/32313-schtasks-exe-need -to-pass-parameters-to-script] [1]
彼の投稿は、タスクのスケジューリング中にオプションの引数を構成するのに役立ちました。
バッチファイルから管理者権限を要求することはできませんが、Windowsスクリプトのホストスクリプトを%temp%で記述して実行することができます(そして、管理者としてバッチを実行します)。シェルでShellExecuteメソッドを呼び出します。 「runas」を動詞とするアプリケーションオブジェクト