배치 파일을 자동으로 상승시켜 필요한 경우 UAC 관리자 권한을 요청하려면 어떻게해야합니까?


209

배치 파일을 높게 실행하고 싶습니다. 상승하지 않은 경우 사용자가 배치를 상승 된 상태로 다시 시작할 수있는 옵션을 제공하십시오.

시스템 변수를 설정하고 두 파일을 프로그램 파일 위치에 복사 한 다음 드라이버 설치 프로그램을 시작하기 위해 배치 파일을 작성하고 있습니다. Windows 7 / Windows Vista 사용자 ( UAC 사용 가능 및 로컬 관리자 인 경우에도)를 마우스 오른쪽 단추로 클릭하고 "관리자 권한으로 실행"을 선택하지 않고 실행하면 두 파일을 복사하고 시스템 변수를 쓰는 '액세스 거부'가 표시됩니다. .

사용자가 실제로 관리자 인 경우 명령을 사용하여 배치를 자동으로 다시 시작하려고합니다. 그렇지 않으면 관리자가 아닌 경우 배치 파일을 실행하려면 관리자 권한이 필요하다고 말하고 싶습니다. xcopy 를 사용 하여 파일을 복사하고 REG ADD 를 사용하여 시스템 변수를 작성합니다. 가능한 Windows XP 컴퓨터를 처리하기 위해 해당 명령을 사용하고 있습니다. 이 주제에서 비슷한 질문을 찾았지만 배치 파일을 다시 시작하는 데 도움이되는 것은 없습니다.


2
내가 게시 한 내용을 확인하십시오-외부 도구가 필요하지 않으며 스크립트가 자동으로 관리자 권한을 확인하고 필요한 경우 자동으로 상승합니다.
Matt

1
매트의 대답이 틱 된 것인지 고려하십시오. 나에게 보인다.
akauppi


내가 게시 한 배치 스크립트 의 주석 섹션에서 새로운 Windows 10 힌트를 고려하십시오 .
Matt

4
cmd에서 : @powershell Start-Process cmd -Verb runas. Powershell에서 그냥 삭제하십시오 @powershell. 높은 권한으로 cmd를 시작합니다.
BrunoLM

답변:


20

당신은으로 스크립트 호출 자체를 가질 수 psexec에-h옵션이 상승 실행합니다.

액세스 권한 거부 오류가있는 경우에만 높은 권한으로 다시 시도 할 수 있습니까?

또는, 당신은 단순히위한 명령을 가질 수 xcopyreg.exe항상 실행할 수 psexec -h있지만,이 입력에 암호 (스크립트에 암호를 포함하는 경우 또는 안전하지 않은)마다 필요로하는 경우는 최종 사용자에 대한 성가신 것 ...


10
답변 주셔서 감사합니다. 불행히도, 저는 Windows Vista / 7 도구 이외의 다른 것을 사용할 수 없다고 생각합니다. 사무실 외부의 고객에게 나올 수 있기 때문입니다. PSExec을 합법적으로 배포 할 수 없다고 생각합니다.
PDixon724

2
그래도 PSExec은 Microsoft 도구이지만 Sysinternals 직원을 구입 한 이후에도 EULA는 배포를 금지합니다. (
ewall

2
내 옵션이 꽤 제한적이라고 생각합니다. VB로 코딩하는 방법을 알고 있다면 관리자 매니페스트로 exe로 만들 수 있지만 어디서부터 시작 해야할지조차 알 수 없습니다. 배치가 시작될 때 Windows Vista / 7을 실행하는 경우 관리자로 실행하라는 경고가 표시됩니다. 모두 감사합니다.
PDixon724

1
자유롭게 재배포 가능하고 통합 및 학습하기 쉬운 타사 도구는 AutoIt입니다 . 이 페이지 는 스크립트가 상승 된 권한을 요청하는 방법을 보여줍니다.
ewall

4
psexec -h작동하지 않습니다 : 'PSEXESVC 서비스를 설치할 수 없습니다 : 액세스가 거부되었습니다.'. psexec를 실행하려면 관리자 권한이 있어야합니다.
Nicolas

319

외부 도구를 사용할 필요없이 쉬운 방법이 있습니다 -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=Sysnative64 비트 시스템에서 도움이 될 수 있지만 대부분의 경우 필요하지는 않습니다. (ADBailey가이를보고했습니다). "Sysnative"는 32 비트 스크립트 호스트 (예 : Visual Studio 빌드 프로세스 또는 다른 32 비트 응용 프로그램에서 스크립트 호출)에서 64 비트 응용 프로그램을 시작하는 경우에만 필요합니다.

  • 매개 변수가 어떻게 해석되는지 더 명확하게하기 위해 다음과 같이 표시합니다 P1=value1 P2=value2 ... P9=value9. 경로와 같은 매개 변수를 큰 따옴표로 묶어야하는 경우에 특히 유용합니다 (예 :) "C:\Program Files".

  • VBS 스크립트를 디버깅하려는 경우 여기에//X 제안 된대로 첫 번째 매개 변수로 WScript.exe에 매개 변수를 추가 할 수 있습니다 (CScript.exe에 대해 설명되어 있지만 WScript.exe에서도 작동 함).

유용한 링크:


9
큰 대답이지만, 어떤 경우에는 분명히 필요한 것을하기 위해 모든 것을해야한다는 것이 약간 놀랍습니다.
jcoder

50
실제로 Windows 배치 언어에서 ELEVATE와 같은 명령이 명확하게 누락되었습니다.
Matt

2
아마도 그것이 더 복잡한 것들에 대한 승인 스크립팅 lanaguge 것으로 보인다 파워 쉘과 쉽게,하지만 난 :( 지금까지 내용을 방해하지
jcoder

1
powershell의 구문은 완전히 다르지만 (동사 명사 구문) .NET 어셈블리를 쉽게 호출 할 수 있습니다. 그러나 처리하는 것이 조금 더 어렵습니다 (스크립트 서명 등).
Matt

2
@Matt 당신은 당신의 답변에 대한 거부 된 수정 뒤에 진실 있는지 확인할 수 있습니까 ?
Artjom B.

41

jcoder와 Matt이 언급했듯이 PowerShell은 쉽게 만들었으며 새 스크립트를 만들지 않고도 배치 스크립트에 포함시킬 수도 있습니다.

Matt의 스크립트를 수정했습니다.

:: 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

3
맞습니다. PowerShell이 ​​설치되어 있으면 PowerShell을 사용하여 배치 파일을 표고로 실행할 수 있습니다 (코드 조각에 감사드립니다!). 그리고 네, 라벨이 필요하지 않습니다. 힌트를 주셔서 감사합니다, 그것은 +1의 가치가 있습니다 ... :-)
Matt

2
cmd에서 호출하면 Powershell.exe에는 -verb runas 옵션이 없습니다. 이미 PowerShell에있는 경우 존재합니다.
Adil

1
나는이 솔루션을 정말로 좋아하며 나를 위해 훌륭하게 작동합니다. Windows 8.1에서는 : gotPrivileges 레이블이 필요합니다.
ShaunO

이 배치 파일이 UNC 경로에서 원격 인 경우 문제가 발생합니다.
Ryan Beesley 2016 년

시작시 변경 디렉토리를 추가하고 흐름을 단순화하고 약간 정리했습니다. 프로세스 의 보안상의 이유로 작업 디렉토리를 WorkingDirectory매개 변수를 통해 변경할 수 없음Start-Processrunas
ceztko

28

Matt의 훌륭한 답변을 사용하고 있지만 고급 스크립트를 실행할 때 Windows 7과 Windows 8 시스템간에 차이가 있습니다.

Windows 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

1
좋은 힌트, 스티븐 따라서 스크립트는 cd %~dp0현재 경로를 유지하기 위해 끝나야 합니다 (Win7에서도 작동한다고 가정하므로 Win8 +에만 필요하더라도 동일한 명령을 사용할 수 있습니다). 이것을 위해 +1!
Matt

2
이것은 Windows 7을 실행하는 시스템에서도 필요했습니다.
meh-uk

1
아니면 pushd %~dp0대신에 ... 왜? 왜냐하면popd
Jaroslav Záruba

27

나는 이것을 이렇게한다 :

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를 호출합니다).

이 게시물에는 답장이 너무 많아서 답을 볼 수 있을지도 모르겠습니다.

어쨌든 다른 답변에 제안 된 다른 솔루션 보다이 방법이 더 간단하다는 것을 알았습니다. 누군가에게 도움이되기를 바랍니다.


4
cd % ~ dp0은 네트워크 드라이브에서 작동하지 않습니다. 대신 pushd % ~ dp0을 사용하십시오.
Stavm

1
나는이 대답의 단순함을 좋아합니다. 그리고 마지막으로 Jscript를 사용해야하는 이유!
Joe Coder

1
마법! 대단히 감사합니다.
Daniele Orlando

1
@ 늑대 나는 당신을 잘못 이해했다는 것을 깨닫기 위해 큰 대답을 입력했습니다 ... 나는 지금 당신이 의미하는 것을 얻었습니다. 을 포함하도록 수정하겠습니다 /d. 친구 감사합니다 :) (PS : 피아니스트도 여기 있습니다!)
Matheus Rocha

1
이것은 훌륭하게 작동하지만 cd명령을 시작 으로 옮기는 것이 좋습니다 (이것은 경로가 상승 스크립트에서도 사용 가능하도록 보장합니다. 그렇지 않으면 상승 스크립트는 system32에서 실행됩니다). net 명령을 nul로 리디렉션하여 출력을 숨겨야합니다.net session >nul 2>&1
Nulano

23

Matt는 훌륭한 답변을 제공하지만 스크립트에 전달 된 모든 인수를 제거합니다. 인수를 유지하는 수정 사항은 다음과 같습니다. 또한 Windows 8의 작업 디렉토리 문제에 대한 Stephen의 수정 프로그램을 통합했습니다.

@ECHO OFF
setlocal EnableDelayedExpansion

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...

1
유용한 답변입니다. 그러나 ECHO UAC.ShellExecute....라인에서 "batchArgs!"변수를 확장하지 않습니다. 사용하십시오 "!batchArgs!". 편집 내용이 거부되었으므로 의견을 말하십시오.
양파

1
@fliedonion 잘 발견! 수정 내용이 오타이므로 수정이 거부되어 왜 편집이 거부되었는지 잘 모르겠습니다. 직접 변경하고 Win 8.1에서 테스트했습니다. 이제이 코드를 사용하는 모든 스크립트를 찾으려면 ...
jxmallett

2
test.bat "a thing"또는 같은 인용 인수를 사용할 때 스크립트가 중단되었습니다 "test script.bat" arg1 arg2. 모두 해결되었습니다.
jxmallett

관리자와 일반 사용자가 동일한 매핑을 가지고 있지 않기 때문에 내 잘못으로 인해 매핑 된 네트워크 드라이브에서 스크립트를 실행하는 것이 문제였습니다. 여전히 : 출력을 볼 수있는 방법이 있습니까? 나를 위해 .vbs를 찾아서 / c를 / K로 변경 한 다음 수동으로 보았습니다.
Andreas Reiff

21

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'메서드를 복사했습니다. 그의 대답은 훨씬 잘 문서화되어 있으며 오류 메시지 등이 있습니다. 이것은 Windows 7 이상에서 PowerShell이 ​​이미 설치되어 있고 사용 가능하다는 이점이 있습니다. 임시 VBScript (*. vbs) 파일이 없으므로 도구를 다운로드 할 필요가 없습니다.

이 방법은 PowerShell 실행 권한이 잠겨 있지 않는 한 구성이나 설정없이 작동합니다.


따옴표로 묶은 공백으로 구분 된 인수 목록을 제공하면 하나로 취급 할 /c %~fnx0 %*'때 부분은 첫 번째 부분 이외의 모든 부분을 남기는 것처럼 보입니다. 에서 예 test.bat "arg1 arg2 arg3"만을 ARG1 앞으로 전달
니콜라스 Mommaerts

무슨 일이 있어도 Start-Process는 인수 목록의 모든 큰 따옴표를 제거하는 것으로 보입니다.
Nicolas Mommaerts

나를 위해 작동합니다! 에 사용하고 있습니다 netsh int set int %wifiname% Enable/Disable.
Marslo

2
위의 Nicolas Mommaerts와 같은 문제가있었습니다. 나는 그것이 왜 작동하는지 이해하지 못하지만 (최상의 종류의 수정), 다음과 같이 작동합니다 (끝에 모든 추가 인용 부호를 주목하십시오) net file 1>nul 2>nul && goto :run || powershell -ex unrestricted -Command "Start-Process -Verb RunAs -FilePath '%comspec%' -ArgumentList '/c ""%~fnx0""""'"
quakes

또 다른 문제점 (불편)은 서버 서비스가 실행 중이 아닌 경우 (이유로 인해 비활성화 된 경우) 스크립트가 일시 중지 (사용자 입력 대기) 한다는 것입니다. 일반적으로 HOSTS 파일 위치 에 쓰려고 시도하여 관리자 권한을 테스트 하지만 가능한 Windows 서비스 에 의존 하거나 파일 쓰기를 시도 하는 대신 powershell 명령 -Verb runas 를 호출하는 것이 좋습니다 .
script'n'code

15

일부 프로그램의 경우 super secret __COMPAT_LAYER환경 변수를 설정 RunAsInvoker 하면 작동 합니다.

set "__COMPAT_LAYER=RunAsInvoker"
start regedit.exe

이와 같이 사용자에게 관리자 권한없이 계속하라는 메시지가 표시되는 UAC는 없습니다.


1
Microsoft 사이트에 대한 링크가 더 이상 작동하지 않았으므로 archive.org의 컨텐츠로 변경했습니다. 누구나 Microsoft 사이트의 콘텐츠에 대한 링크를 찾을 수 있지만 반드시 업데이트하십시오.
RockPaperLizard

1
그것은에 아직 매체의 무결성 하지 상승 있도록 편집 HKLM 수 없습니다 regedit. 방금 uac를 건너 뛰었습니다.
HackingAddict1337

5

스크립트 시작 부분에 이것을 붙여 넣었습니다.

:: 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"
:--------------------------------------

2
스크립트에서 arg 처리를 좋아합니다. 그러나 참고cacls Windows 7 및 최신 윈도우 버전에서 사용되지 않습니다.
Matt

Fsutil dirty 가 더 좋습니다
Wolf

1
라인 pushd "%CD%"이 현재 작업 디렉토리를 저장하고 현재 작업 디렉토리를 변경 한다는 것을 알고 있습니까?
Wolf

3

내가 쓴 gsudo, 창문 에 올리고 있음 : 현재 콘솔 자격 증명 캐시는 (어떤 상황에 맞는 새 창으로 전환하지 않음), (UAC 팝업을 감소), 또한 끌어 올리고 PowerShell에서 명령을sudo .

관리자 권한이 필요한 명령이나 원하는 경우 전체 배치를 올릴 수 있습니다. 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

설치:

작동중인 gsudo를 참조하십시오. 슈도 데모


멋있는. 감사. 어떤 Windows 버전에서 작동합니까?
RockPaperLizard

테스트 스위트는 Server 2019에서 실행되며 로컬 개발 상자는 Windows 10 1909입니다. 다른 구형 OS와의 호환성을 테스트하지 않았습니다.
Gerardo Grignoli

감사합니다 Gerardo. 누군가 다른 버전의 Windows에서 시도하면 결과를 게시하십시오.
RockPaperLizard

방금 Windows 8.1에서 gsudo v0.7을 테스트하고 작동했습니다. .Net Framework 4.6거기 에 설치하는 것은 쉬운 일이 아닙니다 . 운 좋게도 choco install dotnet4.6.2일부 의존성을 가져 왔습니다. 그런 다음 잘못된 프롬프트 gsudo config Prompt "$p# "ConHost표시 되는 문제가 해결되었습니다 (빨간색 날카로운 대신 시퀀스 문자 이스케이프). @ RockPaperLizard
Gerardo

너무 Gerardo 감사합니다. 4.6 이전의 모든 .Net Framework 버전에서 작동하도록 다시 컴파일 할 수 있습니까, 아니면 4.6과 관련된 일부 기능에 의존합니까?
RockPaperLizard

2

이 질문에 직접 적용 할 수는 없지만 사용자를위한 정보를 원하기 때문에 작업 스케줄러에서 상승 한 .bat 파일을 실행하려고 할 때 Google에서 여기로 데려 왔습니다.

가장 간단한 방법은 .bat 파일의 바로 가기를 만드는 것입니다. 바로 가기의 Run as administrator경우 고급 속성에서 직접 설정할 수 있기 때문입니다 .

작업 스케줄러에서 바로 가기를 실행하면 .bat 파일이 상승됩니다.


0

Powershell 사용

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"'"

0

이 시도:

@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>


0

인수를 전달할 필요가없는 경우 한 줄 길이의 간단한 UAC 프롬프트 스크립트가 있습니다. 이것은 최상위 투표 답변의 고도 스크립트와 비슷한 기능을하지만 독 문자의 가능한 모든 조합을 처리하는 완벽한 방법이 없기 때문에 인수를 전달하지 않습니다.

@echo off
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)

:: Your batch file goes here

-3

다음 솔루션은 깨끗하고 완벽하게 작동합니다.

  1. https://www.winability.com/download/Elevate.zip 에서 Elevate zip 파일을 다운로드 하십시오.

  2. zip 안에는 Elevate.exe와 Elevate64.exe라는 두 파일이 있습니다. (후자는 기본 32 비트 버전 인 Elevate.exe가 32 비트 및 64 비트 버전의 Windows 모두에서 제대로 작동하지만 필요한 경우 기본 64 비트 컴파일입니다.)

  3. Elevate.exe 파일을 Windows에서 항상 찾을 수있는 폴더 (예 : C : / Windows)에 복사하십시오. 또는 박쥐 파일을 보관할 폴더에 복사하는 것이 좋습니다.

  4. 배치 파일에서 사용하려면 다음과 같이 elevate 명령을 사용하여 관리자로 실행하려는 명령을 추가하십시오.

 elevate net start service ...

2
이 명령은 사용자에게이 명령을 실행할 수 있는지 묻는 대화 상자 창만 엽니 다. 따라서 사용자 상호 작용없이 실행해야하는 배치 파일에서이 명령을 사용할 수 없습니다.
Radon8472

사용자 상호 작용없이 상승 할 수 있다면 엄청난 보안 허점이 될 것입니다. 모든 바이러스는이 방법을 사용하여 사용자의 승인없이 스스로를 상승시킵니다.
Andrei Belogortseff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.