외부 도구를 사용할 필요없이 쉬운 방법이 있습니다 -Windows 7, 8, 8.1 및 10에서 잘 실행되며 이전 버전과도 호환됩니다 (Windows XP에는 UAC가 없으므로 높이가 필요하지 않습니다). 스크립트가 진행됩니다).
이 코드를 확인하십시오 ( Windows 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=%~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 대화 상자를 표시하고 관리자 계정과 암호를 묻습니다.
Windows 7, 8, 8.1, 10 및 Windows XP에서 테스트했습니다. 모두 잘 작동합니다. 장점은 시작 지점 후에 디버깅 목적으로 Windows 서비스를 다시 설치하고 다시 실행하려는 경우 (예 : 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)
같은 줄에 있어야합니다. 가독성을 높이기 위해 여기에 여러 줄로 표시됩니다!
일부 컴퓨터에서는 위의 새 버전에서 이미 해결 된 문제가 발생했습니다. 하나는 다른 큰 따옴표 처리로 인한 것이고 다른 하나는 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 및 Peter Mortensen에게 감사합니다.
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
고도를 수행하는 스크립트에 추가 됩니다.
또는 두 번째 매개 변수를로 변경하면 winSysFolder=Sysnative
64 비트 시스템에서 도움이 될 수 있지만 대부분의 경우 필요하지는 않습니다. (ADBailey가이를보고했습니다). "Sysnative"는 32 비트 스크립트 호스트 (예 : Visual Studio 빌드 프로세스 또는 다른 32 비트 응용 프로그램에서 스크립트 호출)에서 64 비트 응용 프로그램을 시작하는 경우에만 필요합니다.
매개 변수가 어떻게 해석되는지 더 명확하게하기 위해 다음과 같이 표시합니다 P1=value1 P2=value2 ... P9=value9
. 경로와 같은 매개 변수를 큰 따옴표로 묶어야하는 경우에 특히 유용합니다 (예 :) "C:\Program Files"
.
VBS 스크립트를 디버깅하려는 경우 여기에//X
제안 된대로 첫 번째 매개 변수로 WScript.exe에 매개 변수를 추가 할 수 있습니다 (CScript.exe에 대해 설명되어 있지만 WScript.exe에서도 작동 함).
유용한 링크: