필요한 경우 UAC 관리자 권한에서 요청하도록 배치 파일을 자동으로 승격하려면 어떻게 해야 합니까?
내 배치 파일을 상향식으로만 실행하고 싶습니다.상승하지 않은 경우 사용자가 상승된 배치로 다시 시작할 수 있는 옵션을 제공합니다.
시스템 변수를 설정하고 두 개의 파일을 프로그램 파일 위치에 복사하고 드라이버 설치 프로그램을 시작하기 위해 배치 파일을 쓰고 있습니다.Windows 7/Windows Vista 사용자(UAC 사용 및 로컬 관리자인 경우에도 UAC 사용)가 마우스 오른쪽 버튼을 클릭하고 "관리자 권한으로 실행"을 선택하지 않고 실행하면 두 파일을 복사하고 시스템 변수를 쓰는 '액세스 거부' 메시지가 표시됩니다.
사용자가 실제로 관리자인 경우 명령을 사용하여 배치를 자동으로 상승된 것으로 재시작하려고 합니다.그렇지 않으면 관리자가 아닌 경우 배치 파일을 실행하기 위해 관리자 권한이 필요하다고 말하고 싶습니다.저는 xcopy를 사용하여 파일을 복사하고 REG ADD를 사용하여 시스템 변수를 작성하고 있습니다.이러한 명령을 사용하여 Windows XP 컴퓨터를 처리하고 있습니다.이 주제에 대해 비슷한 질문을 찾았지만, 일괄 파일을 다시 시작하는 것에 대해 상승된 것으로 취급하는 것은 없습니다.
Windows 7, 8, 8.1, 10 및 11과 호환되며 이전 버전과도 호환됩니다(Windows XP에는 UAC가 없으므로 스크립트가 진행되는 경우에만 권한 상승이 필요하지 않음).
이 코드를 확인하십시오(Windows 7(윈도우 7)에서 스레드 배치 파일 - "액세스 거부"에 게시된 NIronwolf의 코드에서 영감을 얻었지만, 이를 개선했습니다. 이 버전에서는 관리자 권한을 확인하기 위해 생성 및 제거된 디렉토리가 없습니다.).
::::::::::::::::::::::::::::::::::::::::::::
:: 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
이 스크립트는 관리자 권한이 필요하다는 사실을 활용하고 반환합니다.errorlevel 1
만약 당신이 그것을 가지고 있지 않다면.권한을 얻기 위해 배치 파일을 다시 실행하는 스크립트를 생성하여 권한을 상승시킬 수 있습니다.그러면 Windows에 UAC 대화 상자가 표시되고 관리자 계정과 암호를 묻는 메시지가 표시됩니다.
Windows 7, 8, 8.1, 10, 11 및 Windows XP에서 테스트해 보았습니다. 모두에게 문제가 없습니다.예를 들어 디버깅 목적으로 윈도우즈 서비스를 다시 설치하고 다시 실행하려는 경우(mypackage.msi가 서비스 설치 관리자 패키지라고 가정) 시작 지점 이후에 시스템 관리자 권한이 필요한 모든 항목을 배치할 수 있습니다.
msiexec /passive /x mypackage.msi
msiexec /passive /i mypackage.msi
net start myservice
이 권한 상승 스크립트가 없으면 UAC는 관리자 사용자와 암호를 세 번 묻습니다. 이제 사용자는 처음에 한 번만, 필요한 경우에만 묻습니다.
스크립트에 오류 메시지가 표시되고 자동으로 승격하는 대신 관리자 권한이 없는 경우 종료하기만 하면 됩니다.스크립트 시작 부분에 다음을 추가하여 이를 수행할 수 있습니다.
@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)
동일한 라인에 있어야 합니다.가독성을 높이기 위해 여기에 여러 줄로 표시됩니다.
일부 컴퓨터에서 위의 새 버전에서 이미 해결된 문제가 발생했습니다.하나는 서로 다른 이중 따옴표 처리로 인한 것이고, 다른 하나는 UAC가 윈도우즈 7 시스템에서 사용되지 않도록 설정(최저 수준으로 설정)되었기 때문에 스크립트가 계속해서 자동으로 호출되는 것입니다.
경로에서 따옴표를 제거한 후 나중에 다시 추가하여 이 문제를 해결했으며 스크립트가 권한을 다시 시작할 때 추가되는 매개 변수를 추가했습니다.
큰따옴표는 다음과 같이 제거됩니다(자세한 내용은 여기에 있습니다).
setlocal DisableDelayedExpansion
set "batchPath=%~0"
setlocal EnableDelayedExpansion
그런 다음 다음 다음을 사용하여 경로에 액세스할 수 있습니다.!batchPath!
큰따옴표가되어 있지 에, 이따옴포있않로므으지무다니라, 말방합도해고중가표함어되다▁▁to무▁라고 말해도 무방합니다."!batchPath!"
대본의 후반부에.
라인
if '%1'=='ELEV' (shift & goto gotPrivileges)
에서는 권한 상승을 위해 VBScript 스크립트에서 스크립트를 이미 호출했는지 확인하여 무한 반복을 방지합니다.다음을 사용하여 매개 변수를 제거합니다.shift
.
업데이트:
할 필요가 없도록 하기 위해
.vbs
윈도우 10의 내선 번호, 나는 라인을 교체했습니다.
"%temp%\OEgetPrivileges.vbs"
타고
"%SystemRoot%\System32\WScript.exe" "%temp%\OEgetPrivileges.vbs"
추가된 것은 스트에서립; 또추가됨입니다.cd /d %~dp0
스크립트 디렉터리를 기본값으로 설정하기 위해 Stephen(별도 답변)과 Tomásh Zato(댓글)가 제안한 대로입니다.이제 스크립트는 전달되는 명령줄 매개 변수를 따릅니다.jxmallet 덕분에 타니스.DLJ와 피터 모텐슨의 관찰과 영감.
B의 힌트에 하여 Artjum B를 했습니다.의 힌트에 따라 분석하여 교체했습니다.
SHIFT
타고SHIFT /1
의 파일 합니다.%0
된 된가 추가됨
del "%temp%\OEgetPrivileges_%batchName%.vbs"
에▁:gotPrivileges
정리할 섹션(mlt 권장 사항).추가된%batchName%
서로 다른 배치를 병렬로 실행하는 경우 영향을 방지합니다.사용해야 한다는 점에 유의하십시오.for
다음과 같은 고급 문자열 기능을 활용할 수 있습니다.%%~nk
파일 이름만 추출합니다.구조, 사항( 추가, 개변
vbsGetPrivileges
쉽게 할 수 이제 할 수 있는 만 하면 ..vbs
배치를 상승시켜야 하는 경우 파일)경우에 따라 상승에 대해 다른 호출 구문이 필요했습니다. 다음 변수를 합니다.
set cmdInvoke=0
set winSysFolder=System32
번째 를 첫번째개수음변다변로경으합니다를매변▁to▁the다로 변경합니다.set cmdInvoke=1
문제가 이미 해결되었는지 확인합니다.은 니다됩추를 추가할 입니다.cmd.exe
권한 상승을 수행하는 스크립트로 이동합니다.
또는 두 번째 매개변수를 다음으로 변경합니다.winSysFolder=Sysnative
64비트 이비도될움이수대있아경다닙니필수우는의부분가다니지만. (AD Bailey 이보습고.) 호스트 프로세스 응용 에서 스크립트 프로그램을 시작하는 합니다."Synnative"는 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=%a%, b=%b% pause
유용한 링크:
jcoder와 Matt가 언급했듯이 PowerShell은 이를 쉽게 만들 수 있으며, 새 스크립트를 만들지 않고 배치 스크립트에 포함할 수도 있습니다.
맷의 대본을 수정했습니다.
:: 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
이런 식으로 합니다.
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가 호출됩니다.
이 게시물에 답장이 너무 많아서 제 답장이 보일지도 모르겠어요.
어쨌든, 저는 다른 답변에서 제안된 다른 솔루션보다 이 방법이 더 간단하다고 생각합니다. 누군가에게 도움이 되었으면 합니다.
Matt의 훌륭한 답변을 사용하고 있지만 고급 스크립트를 실행할 때 Windows 7과 Windows 8 시스템이 다르다는 것을 알 수 있습니다.
8에서 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
Matt는 훌륭한 답변을 가지고 있지만, 대본에 전달된 모든 주장을 삭제합니다.여기 논쟁을 계속하는 나의 수정 사항이 있습니다.Windows 8의 작업 디렉터리 문제에 대한 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...
psexec의 스크립트 자체를 호출할 수 있습니다.-h
실행 옵션이 상승되었습니다.
이미 상승된 상태로 작동하고 있는지 아닌지를 어떻게 감지할 수 있을지 모르겠습니다.액세스 거부 오류가 있는 경우에만 상승된 파마로 다시 시도할 수 있습니까?
로 는단순대명또 히 다 수 있 습 니 다 사 할 용 을 령xcopy
그리고.reg.exe
늘따다다와 실행됩니다.psexec -h
그러나 사용자가 매번 암호를 입력해야 하는 경우(또는 스크립트에 암호를 포함한 경우 안전하지 않은 경우) 일반 사용자에게는 성가신 일이 될 수 있습니다.
그렇지 않은 경우 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의 답변에서 'net name' 방법을 복사했습니다.그의 답변은 훨씬 더 잘 문서화되어 있고 오류 메시지 등이 있습니다.PowerShell은 Windows 7 이상에서 이미 설치되어 사용할 수 있다는 장점이 있습니다.임시 VBScript(*.vbs) 파일이 없으며 도구를 다운로드할 필요가 없습니다.
PowerShell 실행 권한이 잠기지 않는 한 이 방법은 구성이나 설정 없이 작동해야 합니다.
의 경우 시크릿을 할 수 있습니다.__COMPAT_LAYER
~ 경변:RunAsInvoker
효과가 있을 것입니다.확인:
set "__COMPAT_LAYER=RunAsInvoker"
start regedit.exe
이와 같이 UAC는 사용자에게 관리자 권한 없이 계속 진행할 것인지 묻는 메시지를 표시하지 않습니다.
Windows용 a: 자격 증명 캐시(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
설치:
- 을 통해: 초릿을통해콜::
choco install gsudo
- 특종: 또는특종:
scoop install gsudo
- 또는 github: https://github.com/gerardog/gsudo 에서 다운로드하십시오.
보기: 동작기보 gsudo인:
저는 최근에 사용자 친화적인 접근 방식이 필요했고 여기와 다른 곳의 기여자들의 귀중한 통찰력을 바탕으로 이것을 고안했습니다.이 줄을 .bat 스크립트의 맨 위에 놓기만 하면 됩니다.피드백 환영합니다.
@pushd %~dp0 & fltmc | find "." && (powershell start '%~f0' ' %*' -verb runas 2>nul) && (popd & exit /b)
해석:
@pushd %~dp0
디렉터리 , UNC 경로 지원& fltmc
되지 않은 상태에서 할 때 합니다.| find "."
더 예쁘게 주고, 시 되는 것이 만듭니다.&& (
만약 우리가 승진하지 못했기 때문에 성공적으로 오류가 발생했다면, 이렇게 하세요...powershell start
PowerShell을 호출하고 Start-Process cmdlet을 호출합니다(시작은 별칭).'%~f0'
이 .bat 파일의 전체 경로와 이름을 전달합니다. 따옴표는 합니다.' %*'
이 .bat 파일에 모든 인수를 전달합니다.펑키한 따옴표와 이스케이프 시퀀스는 아마 작동하지 않겠지만 단순 따옴표로 묶인 문자열은 작동해야 합니다. 필요합니다.-verb runas
그 과정을 시작만 하지 마세요...관리자 권한으로 실행!2>nul)
UAC 프롬프트가 취소/무시된 경우 PowerShell의 보기 흉한 오류 출력 삭제&&
PowerShell을 사용하여 성공적으로 호출하면...함), 다음과 같이 표시됩니다.: UAC는 다음과 같습니다.
&&
여기서 .bat는 권한 상승 없이 계속 실행되므로 필요한 명령은 실패하지만 다른 명령은 정상적으로 작동합니다.스크립트를 승격되지 않은 상태로 실행하는 대신 단순히 종료하려면 이를 단일 앰퍼샌드로 만듭니다.&
(popd & exit /b)
명령행의 초기 작업 디렉터리로 돌아가 초기 .bat 처리를 종료합니다. 더 이상 필요하지 않기 때문입니다. 이미 이 .bat을 실행하는 고급 프로세스가 있습니다. 그/b
cmd합니다. 는 ..bat 파일의 cmd.exe 파일의 .bat 파일에 않습니다.
인수에 관심이 없다면 한 줄 길이의 콤팩트 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)
▁the 아래에 .@echo off
배치 파일에 있습니다.
설명.
그net sess>nul 2>&1
요소는 표고를 확인하는 항목입니다. net sess
의 줄임말일 뿐입니다.net session
스크립트에 상승된 권한이 없을 때 오류 코드를 반환하는 명령입니다.저는 이 SO 답변에서 이 아이디어를 얻었습니다.여기에 나와 있는 대부분의 답변은 기능입니다.net file
대신에 어떤 것이 동일하게 작동하는지.이 명령은 빠르고 많은 시스템에서 호환됩니다.
오류 을 " " " " " 으로합니다.||
가 합니다.검사가 성공하면 원래 배치 파일을 다시 실행하지만 자체를 삭제하기 전에 권한이 상승된 WScript를 생성하고 실행합니다.
대안
WScript 파일은 임시 파일을 사용하지만 빠르고 안정적인 방법이 가장 좋습니다.다음은 몇 가지 다른 변형과 그 단점/장점입니다.
파워셸
net sess>nul 2>&1||(powershell saps '%0'-Verb RunAs&exit)
찬성:
- 아주 짧습니다.
- 임시 파일 없음.
단점:
- 느립니다. PowerShell 시작이 느릴 수 있습니다.
- 사용자가 UAC 프롬프트를 거부할 때 빨간색 텍스트를 표시합니다.는 PowerShell 다같포수있습으로 수 .
try{...}catch{}
하지만 이를 방지하기 위해.
Mshta WSH 스크립트
net sess>nul 2>&1||(start mshta.exe vbscript:code(close(Execute("CreateObject(""Shell.Application"").ShellExecute""%~0"",,,""RunAs"",1"^)^)^)&exit)
찬성:
- 빠른.
- 임시 파일 없음.
단점:
- 신뢰할 수 없습니다.일부 Windows 10 시스템에서는 Windows Defender가 잠재적인 트로이 목마로 스크립트를 가로채기 때문에 스크립트 실행을 차단합니다.
경우 의 맨 바로 에).@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은 현재 스크립트(인수 포함)를 상승된 셸에서 시작하고 상승되지 않은 스크립트는 닫힙니다.
스크립트 시작 부분에 붙여넣었습니다.
:: 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"
:--------------------------------------
이 질문에 직접적으로 적용할 수는 없지만, 사용자를 위한 정보를 원하기 때문에 구글은 작업 스케줄러에서 상승된 .bat 파일을 실행하고 싶을 때 저를 여기로 데려왔습니다.
파일에 가기를 이었는데, 가장간방파바일대만다것니이습었가드로기는한에를단한법은을 할 수 입니다. 바로 가기에 대해 설정할 수 있기 때문입니다.Run as administrator
고급 속성에서 직접.
작업 스케줄러에서 바로 가기를 실행하여 .bat 파일을 상승된 상태로 실행합니다.
파워셸을 사용합니다.
cmd 파일이 길면 첫 번째 파일을 사용하여 권한 상승을 요구한 다음 실제 작업을 수행하는 사람을 호출합니다.
스크립트가 단순 명령인 경우 모든 것이 하나의 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"'"
단일 선형 배치 사용자 고도(인수 포함)
여기 오늘날에도 여전히 관련이 있는 배치 사용자 상승에 대한 오래된 질문에 대한 저의 한 줄짜리 버전이 있습니다.
배치 스크립트의 맨 위에 코드를 추가하기만 하면 됩니다.
조용한
이 버전은 오류 발생 시 아무것도 출력하거나 실행을 일시 중지하지 않습니다.
@setlocal disabledelayedexpansion enableextensions
@echo off
:: Admin check
fltmc >nul 2>nul || set _=^"set _ELEV=1^& cd /d """%cd%"""^& "%~f0" %* ^"&&((if "%_ELEV%"=="" ((powershell -nop -c start cmd -args '/d/x/s/v:off/r',$env:_ -verb runas >nul 2>nul) || (mshta vbscript:execute^("createobject(""shell.application"").shellexecute(""cmd"",""/d/x/s/v:off/r ""&createobject(""WScript.Shell"").Environment(""PROCESS"")(""_""),,""runas"",1)(window.close)"^) >nul 2>nul)))& exit /b)
장황한
사용자에게 관리자 권한이 요청되고 있으며 오류가 발생하면 종료하기 전에 일시 중지되는 상세 버전입니다.
@setlocal disabledelayedexpansion enableextensions
@echo off
:: Admin check
fltmc >nul 2>nul || set _=^"set _ELEV=1^& cd /d """%cd%"""^& "%~f0" %* ^"&&((if "%_ELEV%"=="" (echo Requesting administrator privileges...&((powershell -nop -c start cmd -args '/d/x/s/v:off/r',$env:_ -verb runas >nul 2>nul) || (mshta vbscript:execute^("createobject(""shell.application"").shellexecute(""cmd"",""/d/x/s/v:off/r ""&createobject(""WScript.Shell"").Environment(""PROCESS"")(""_""),,""runas"",1)(window.close)"^) >nul 2>nul))) else (echo This script requires administrator privileges.& pause))& exit /b)
echo Has admin permissions
echo Working dir: "%cd%"
echo Script dir: "%~dp0"
echo Script path: "%~f0"
echo Args: %*
pause
작업방법
- fltmc를 사용하여 관리자 권한을 확인합니다.(시스템 구성 요소, Windows 2000+에 포함)
- 사용자에게 이미 관리자 권한이 있는 경우 정상적으로 작업을 계속합니다.
- 그렇지 않은 경우 다음 중 하나를 사용하여 자체의 상위 버전을 생성합니다.
- 파워셸 (기본적으로 Windows 7+에 포함된 Windows 옵션 기능은 제거할 수 있습니다. 그렇지 않으면 Windows XP/Vista에 설치할 수 없습니다.)
- 음슈타 (시스템 구성 요소, Windows 2000+에 포함)
- 표고를 획득하지 못한 경우 무한 반복 대신 실행을 중지합니다.
이 솔루션이 다른 솔루션과 차별화되는 점은 무엇입니까?
이 문제를 해결하기 위해 말 그대로 수백 가지의 변형이 있지만 지금까지 제가 발견한 모든 것은 단점을 가지고 있으며 이것은 대부분의 단점을 해결하기 위한 시도입니다.
- 호환성.권한을 확인하는 수단으로 fltmc를 사용하고 권한 상승을 위해 powershell 또는 mshta를 사용하면 2000년 이후 모든 윈도우즈 버전에서 작동하며 대부분의 시스템 구성에 적용됩니다.
- 추가 파일을 쓰지 않습니다.
- 현재 작업 디렉터리를 보존합니다.대부분의 솔루션은 완전히 다른 개념인 "스크립트 디렉터리"와 "작업 디렉터리"를 혼동하는 것을 발견했습니다. "directory를 대신 사용하고 , "script directory"를 하세요.
%cd%
와 함께%~dp0
은 떤어사은사지지다니합용을들람▁using다지니지▁some를 사용하는 것을 옹호합니다.pushd "%~dp0"
대신 "\\SOMEONES-PC\share"와 같은 네트워크로 연결된 UNC 경로 내부의 경로가 작동하지만 이 경로는 자동으로 해당 위치를 원하는 드라이브 문자(Y:와 같은)에 매핑합니다. - 표고를 획득할 수 없는 경우 중지됩니다.사용자가 UAC 프롬프트에서 "아니오"를 클릭하거나 UAC를 사용할 수 없도록 설정하거나 그룹 정책 설정 등과 같은 여러 가지 이유로 인해 이 문제가 발생할 수 있습니다.많은 다른 솔루션들이 이 점에서 무한 루프에 진입하여 우주의 열로 인해 사망할 때까지 수백만 개의 명령 프롬프트를 생성합니다.
- 대부분의 명령줄 인수 및 이상한 경로를 지원합니다.앰퍼샌드 &, 퍼센트 기호, 관리 ^ 및 일치하지 않는 인용구 ""와 같은 것.여전히 충분히 이상한 조합을 전달하여 이 문제를 해결할 수 있지만, 이는 Windows 배치 처리의 고유한 결함이며 항상 어떤 조합으로 작업할 수는 없습니다.그러나 대부분의 일반적인 사용 사례는 다루어야 하며 인수는 권한 상승 스크립트 없이도 작동합니다.
알려진 문제
이중 따옴표의 양이 일치하지 않는 명령줄 인수를 입력하면(즉, 2로 나눌 수 없음) 추가 공간과 캐럿^이 마지막 인수로 추가됩니다.를 들어 를들면입니다."arg1" arg2" """" "arg3"
될것다니입이 될 입니다."arg1" arg2" """" "arg3" ^
스크립트에 문제가 있으면 논리를 추가하여 수정할 수 있습니다. 예를 들어 _ELEv=1(승격이 필요했음을 의미)을 확인한 다음 인수 목록의 마지막 문자가 ^ 및/또는 따옴표 양이 일치하지 않는지 확인하고 잘못된 캐럿을 제거합니다.
출력을 파일로 기록하기 위한 스크립트 예제
상승 시 새 cmd 창이 생성되고 실행 컨텍스트가 전환되기 때문에 stdout 로깅에 >를 쉽게 사용할 수 없습니다.
당신은 점점 더 이상해지는 탈출 캐릭터 조합을 통과시킴으로써 그것을 달성할 수 있습니다.elevate.bat testarg ^^^> test.txt
그러나 항상 새 cmd 창을 생성하거나 논리를 추가하여 카트를 제거해야 합니다. 이 모든 것이 복잡성을 증가시키고 많은 시나리오에서 여전히 손상될 수 있습니다.
가장 좋고 쉬운 방법은 명령줄에서 리디렉션하는 대신 배치 스크립트 내에 로깅을 추가하는 것입니다.그렇게 하면 두통을 많이 줄일 수 있을 겁니다.
다음은 스크립트에 대한 로깅을 쉽게 구현하는 방법의 예입니다.
@setlocal disabledelayedexpansion enableextensions
@echo off
:: Admin check
fltmc >nul 2>nul || set _=^"set _ELEV=1^& cd /d """%cd%"""^& "%~f0" %* ^"&&((if "%_ELEV%"=="" (echo Requesting administrator privileges...&((powershell -nop -c start cmd -args '/d/x/s/v:off/r',$env:_ -verb runas >nul 2>nul) || (mshta vbscript:execute^("createobject(""shell.application"").shellexecute(""cmd"",""/d/x/s/v:off/r ""&createobject(""WScript.Shell"").Environment(""PROCESS"")(""_""),,""runas"",1)(window.close)"^) >nul 2>nul))) else (echo This script requires administrator privileges.& pause))& exit /b)
set _log=
set _args=%*
if not defined _args goto :noargs
set _args=%_args:"=%
set _args=%_args:(=%
set _args=%_args:)=%
for %%A in (%_args%) do (if /i "%%A"=="-log" (set "_log=>> %~n0.log"))
:noargs
if defined _log (echo Logging to file %~n0.log) else (echo Logging to stdout)
echo Has admin permissions %_log%
echo Working dir: "%cd%" %_log%
echo Script dir: "%~dp0" %_log%
echo Script path: "%~f0" %_log%
echo Args: %* %_log%
echo Hello World! %_log%
pause
실행:logtest.bat -log
인수 -log를 추가하면 출력이 stdout이 아닌 파일에 기록됩니다.
마무리 생각
UAC가 존재한 지 15년이 지났는데도 간단한 "Elevate" 명령어가 배치에 도입되지 않은 것은 저를 당혹스럽게 합니다.아마도 언젠가 마이크로소프트가 그들의 똥을 정리할 것입니다.그때까지, 우리는 이 해킹을 사용해야 합니다.
사용해 보십시오.
@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>
%1 start "" mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c pushd ""%~dp0"" && ""%~s0"" ::","","runas",1)(window.close)&&exit
다음 용액은 깨끗하고 완벽하게 작동합니다.
https://www.winability.com/download/Elevate.zip 에서 Elevate zip 파일을 다운로드합니다.
zip 안에 두 개의 파일이 있을 것입니다.들어올려요.exe 및 Elevate64.exe.(Elevate64.exe는 기본 64비트 컴파일이며, 필요한 경우 일반 32비트 버전인 Elevate.exe, 32비트 및 64비트 버전의 Windows(윈도우)에서 모두 잘 작동합니다.
파일 Elevate를 복사합니다.Windows에서 항상 찾을 수 있는 폴더(예: C:/Windows)에 exe를 추가합니다.또는 배트 파일을 보관하려는 동일한 폴더에 복사할 수 있습니다.
배치 파일에서 이 명령을 사용하려면 다음과 같이 관리자 권한 상승 명령을 사용하여 실행할 명령 앞에 추가하면 됩니다.
elevate net start service ...
언급URL : https://stackoverflow.com/questions/7044985/how-can-i-auto-elevate-my-batch-file-so-that-it-requests-from-uac-administrator
'sourcecode' 카테고리의 다른 글
fatal: 올바른 개체 이름이 아닙니다. 'master' (0) | 2023.05.04 |
---|---|
Python 2와 3 사이의 numpy 어레이의 피클 비호환성 (0) | 2023.05.04 |
pgAdmin을 사용하여 Postgresql 테이블 데이터 내보내기 (0) | 2023.05.04 |
Git에서 이클립스로 메이븐 프로젝트 가져오기 (0) | 2023.05.04 |
이클립스의 아이콘은 무엇을 의미합니까? (0) | 2023.05.04 |