DLLを登録する必要のあるバッチファイルを実行する必要があります。バッチファイルがコマンドプロンプトを管理者として起動していないため、DLLの登録に失敗しています。
バッチファイルを通して管理者としてコマンドプロンプト**"を開始する方法はありますか?
環境Win7/Vista
このスクリプトはトリックを行います。! コウモリファイルの上部に貼り付けるだけです。 スクリプトの出力を確認する場合は、バッチファイルの下部に「一時停止」コマンドを追加します。
このスクリプトは、コマンドラインargsをサポートするためにわずかに編集されています。
@echo off
:: BatchGotAdmin
::-------------------------------------
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"
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"
::--------------------------------------
::ENTER YOUR CODE BELOW:
先に別のバッチファイルを使用して、管理者権限で2番目のバッチファイルを起動する必要があるかもしれません。
最初のバッチファイルでは
runas /noprofile /user:mymachine\administrator yourbatchfile.bat
さらに読むと、プロンプトでパスワードを入力できるようにする必要があります。この機能はセキュリティ上の理由からロックされているため、パスワードをパイプで入力することはできません。
psexec]1を使えば、もっとうまくいくかもしれません。
(これは@DarkXphenomenon'の回答に基づいていますが、残念ながらいくつかの問題がありました).
このラッパーでコードを囲む必要があります。
if _%1_==_payload_ goto :payload
:getadmin
echo %~nx0: elevating self
set vbs=%temp%\getadmin.vbs
echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%"
echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
:payload
echo %~nx0: running payload with parameters:
echo %*
echo ---------------------------------------------------
cd /d %2
shift
shift
rem put your code here
rem e.g.: perl myscript.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
goto :eof
これにより、バッチファイル自体が昇格ユーザーとして実行されます。 特権コードに2つのパラメータを追加します。
ペイロードの呼び出しであることを示す payload
という単語、つまり既に昇格していることを示します。 そうでなければ
新しいプロセスを何度も何度も開くことになります。
メインスクリプトが呼び出されたディレクトリパス。 Windowsは常に*昇格したcmd.exeを起動するという事実のため Windowsは常に昇格したcmd.exeを"%windir%system32"で起動するという事実のために、元のパスが何であるかを知る簡単な方法はありません。 元のパスが何であったかを知る簡単な方法はありません(そして、コードに触れることなくスクリプトをコピーする能力を保持します)。 コードに触れることなくスクリプトをコピーする能力を維持する)
注意: 残念ながら、何らかの理由で shift
は %*
に対して機能しません。
に対して機能しないので、実際の引数を渡す必要がある場合は、私が例で使ったような醜い記法に頼らざるを得ません。
を使わざるを得なくなります (%1 %2 %3 %4 %5 %6 %7 %8 %9
) 。
最大9個の引数
を押します。Ctrl< / kbd> + Shift< / kbd>ショートカットをダブルクリックして、高架プロセスとして実行します。
スタートメニューからも機能します。
これは、Windows 7から10でパラメーターを使用して動作し、どこからでも(ブラウザーを含む)開始アプリまたはファイルをキックし、どこからでもファイルにアクセスし、コードで(YOUR BATCH SCRIPT HEREアンカー)を交換します。このソリューションは役立つかもしれません: )。
@echo off
call :isAdmin
if %errorlevel% == 0 (
goto :run
) else (
echo Requesting administrative privileges...
goto :UACPrompt
)
exit /b
:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b
:run
<YOUR BATCH SCRIPT HERE>
exit /b
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "cmd.exe", "/c %~s0 %~1", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B`
スクリプトファイルが非システムドライブ(c:)とスペースのあるディレクトリにあるときにスクリプトが失敗しないようにするため。
Batch_Script_Run_As_Admin.cmd 。
@echo off
if _%1_==_payload_ goto :payload
:getadmin
echo %~nx0: elevating self
set vbs=%temp%\getadmin.vbs
echo Set UAC = CreateObject^("Shell.Application"^) >> "%vbs%"
echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
goto :eof
:payload
::ENTER YOUR CODE BELOW::
::END OF YOUR CODE::
echo.
echo...Script Complete....
echo.
pause
これは解決策かもしれませんが、私は同様のことをしましたが、これは機能しないようです。 たとえば、必要な機能に管理者権限が必要な場合は、管理者として再起動するように要求する必要があります。
@echo off
mkdir C:\Users\cmdfolder
if echo=="Access is denied." (goto :1A) else (goto :A4)
:A1
cls
color 0d
echo restart this program as administator
:A4
pause