CMD가 관리자로 실행 중인지 / 상승 된 권한이 있는지 감지하는 방법은 무엇입니까?


101

배치 파일 내에서 관리자 / 상승 권한으로 실행 중인지 테스트하고 싶습니다.

"관리자 권한으로 실행"을 선택해도 사용자 이름은 변경되지 않으므로 작동하지 않습니다.

효과가 없지만 관리 권한이 필요한 범용 명령이있는 경우 해당 명령을 실행하고 권한을 테스트하기 위해 오류 코드를 확인할 수 있습니다. 지금까지 그런 명령을 찾지 못했습니다. 내가 찾은 명령은 특정하지 않은 단일 오류 코드를 반환하는 것 같으며, 이는 모든 것을 나타낼 수 있으며 다양한 이유로 인해 실패하기 쉽습니다.

이전 운영 체제를 지원하는 것이 좋겠지 만 저는 Windows 7에만 관심이 있습니다.


한 가지 해킹은 echo > somefile관리자 권한 이 필요한 디렉토리에 시도하고 수행 하는 것입니다. 부작용으로 파일을 생성하지만 충돌을 확인하고 해결 방법으로 고유 한 파일 이름을 만들 수 있습니다.
Marc B


1
[여기에서 자체 상승 배치를 찾을 수 있습니다.] [1] [1] : stackoverflow.com/questions/4051883/…
Amr Ali


1
)) (2011 대 2013; @npocmaka 당신이 링크 된 질문은이 하나의 중복 실제로
마티유

답변:


62

ADDENDUM : Windows 8의 경우 작동하지 않습니다. 대신 이 훌륭한 답변을 참조하십시오 .


이 솔루션은 http://www.robvanderwoude.com/clevertricks.php 에서 찾았습니다.

AT > NUL
IF %ERRORLEVEL% EQU 0 (
    ECHO you are Administrator
) ELSE (
    ECHO you are NOT Administrator. Exiting...
    PING 127.0.0.1 > NUL 2>&1
    EXIT /B 1
)

작동하지 않는다고 가정하고 Win7에 대해 이야기하고 있기 때문에 적합한 경우 Powershell에서 다음을 사용할 수 있습니다.

$principal = new-object System.Security.Principal.WindowsPrincipal([System.Security.Principal.WindowsIdentity]::GetCurrent())
$principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator)

그렇지 않은 경우 (그리고 아마도 배치 파일을 명시 적으로 제안했기 때문에) 위의 내용을 .NET으로 작성하고 사용할 배치 파일의 결과에 따라 exe에서 종료 코드를 반환 할 수 있습니다.


4
AT 명령은 완벽합니다! 귀하의 Google-fu는 내 Google-fu보다 우수합니다. ;-)
Jeff

2
+1 @Rushyo, 나는 당신의 솔루션을 약간 확장하고 내가 처음 만난 것이기 때문에 여기에 게시했습니다. 감사! stackoverflow.com/questions/4051883/…
blak3r

16
ATWindows 8에서는 작동하지 않지만 더 나은 솔루션을 찾았습니다. 여기에 다른 질문에 대한 답변으로 게시했습니다 : stackoverflow.com/questions/4051883/… .
mythofechelon

4
나는 whoami / groups를 추천합니다 | findstr / b BUILTIN \ Admin | findstr / c : "사용 가능한 그룹"&& echo "관리자가 있습니다!" -95, 98, 2000, XP, Vista, 7, 8에서 작업하세요! ( "AT를 사용 Rushyo의 sugesstion 같은 나는 ..."코멘트에서)
barwnikk

1
나는 ping실종 교체를 좋아한다 sleep:)
Matthieu

96

이 트릭에는 하나의 명령 만 필요 net session합니다. 명령 프롬프트에 입력 하십시오.

관리자아닌 경우 액세스가 거부되었습니다. 메시지가 표시됩니다.

System error 5 has occurred.

Access is denied.

이 경우 관리자 내용입니다 , 당신은 다른 메시지, 가장 일반적인 복지를 얻을 :

There are no entries in the list.

에서 MS 테크넷 :

매개 변수없이 사용하면 net session은 로컬 컴퓨터의 모든 세션에 대한 정보를 표시합니다.


그것은 기능적으로 AT 명령을 사용한 Rushyo의 대답과 동일합니다.
Jeff

12
Windows 8.1에서는 AT가 더 이상 사용되지 않으므로 AT보다 선호됩니다. Rushyo의 답변을 사용하지만 ATnet 세션 또는 net.exe 세션으로 대체하면 완벽하게 작동합니다.
kayleeFrye_onDeck 2014

이것은 명령 프롬프트에서이를 수행하는 가장 쉬운 방법 인 것 같습니다 (배치 파일과는 다릅니다).
enderland

2
There are no entries in the list.Windows 10 Pro에서 인쇄
gman

1
: 그와 같은 배치 파일을 사용 뭔가net session >nul 2>&1 || (echo not admin&goto :eof)
anilech

27

나는 Rushyo의 AT 사용 제안을 좋아하지만 이것은 또 다른 옵션입니다.

whoami /groups | findstr /b BUILTIN\Administrators | findstr /c:"Enabled group" && goto :isadministrator

이 접근 방식을 사용하면 원하는 경우 관리자가 아닌 관리자와 권한이없는 관리자를 구분할 수도 있습니다. 권한이없는 관리자는 그룹 목록에 여전히 BUILTIN \ Administrators가 있지만 사용할 수 없습니다.

그러나 일부 비 영어 시스템에서는 작동하지 않습니다. 대신 시도하십시오

whoami /groups | findstr /c:" S-1-5-32-544 " | findstr /c:" Enabled group" && goto :isadministrator

(이것은 Windows 7에서 작동하지만 이전 버전에 대해서는 잘 모르겠습니다.)


1
폴란드어 버전에서는 BUILTIN \ Administratorzy가 있으므로 다음을 권장합니다. whoami / groups | findstr / b BUILTIN \ Admin | findstr / c : "사용 가능한 그룹"&& goto : isadministrator
barwnikk

@barwnikk, whoami/groups수동으로 라인을 스캔하는 것이 좋습니다 . 너무 오래 걸리지 않을 것이고 명령은 당신의 두뇌에 맞습니다.
Pacerier

@Pacerier : 질문의 요점은 배치 파일에서 고도를 감지 하는 것 입니다. 사용자가 명령 줄에있는 경우 필요한 것은 창 제목을 보는 것뿐입니다. 승격 된 경우 항상 "관리자 :"로 시작합니다.
Harry Johnston

@HarryJohnston, 와우는 그것을 깨닫지 못했습니다. 모든 버전의 창에 "관리자"제목이 표시됩니까?
Pacerier

@Pacerier : 모든 최신 버전 (Vista 이상).
Harry Johnston

24

다른 사람들이 이전에 넣은 것과 거의 비슷하지만 배치 명령의 시작 부분에 넣을 수있는 단일 라이너입니다. (일반적으로 @echo가 꺼진 후)

net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)

2
이것은 최신 버전이며 net.exe에서 관련없는 출력을 멋지게 숨 깁니다
andersand

2
Windows 10에서 잘 작동합니다.
James Pack

훌륭하게 작동했고, 끝을 & Timeout / t 10 & Exit / b 1)로 조정하여 배치 파일에서 창이 즉시 사라지지 않도록했습니다.
WhoIsRich

12

Vista, Win 7 이상에서이 작업을 수행하는 가장 쉬운 방법은 토큰 그룹을 열거하고 현재 무결성 수준을 찾는 것입니다 (또는 그룹 구성원 만 중요한 경우 관리자 sid).

관리자 권한으로 실행 중인지 확인하십시오.

whoami /groups | find "S-1-16-12288" && Echo I am running elevated, so I must be an admin anyway ;-)

우리가 로컬 관리자에 속하는지 확인하십시오.

whoami /groups | find "S-1-5-32-544" && Echo I am a local admin

도메인 관리자에 속하는지 확인하십시오.

whoami /groups | find "-512 " && Echo I am a domain admin

다음 문서에서는 Windows에서 사용하는 무결성 수준 SID를 나열합니다. http://msdn.microsoft.com/en-us/library/bb625963.aspx


whoami / groups는 잘못된 정보를 얻는 경우가 있습니다. 참조 stackoverflow.com/questions/4051883/...
zumalifeguard

7

다음은 상승 된 지위에 초점을 맞춘 Harry의 답변을 약간 수정 한 것입니다. install.bat 파일의 시작 부분에 이것을 사용하고 있습니다.

set IS_ELEVATED=0
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" | findstr /c:"Enabled group" > nul: && set IS_ELEVATED=1
if %IS_ELEVATED%==0 (
    echo You must run the command prompt as administrator to install.
    exit /b 1
)

이것은 확실히 저에게 효과가 있었고 원리는 건전한 것 같습니다. 에서 MSFT의 크리스 잭슨 :

관리자 권한으로 실행하는 경우 토큰에는 필수 레이블 \ 높은 필수 수준이라는 ACE가 포함됩니다.


whoami / groups는 잘못된 정보를 얻는 경우가 있습니다. 참조 stackoverflow.com/questions/4051883/...
zumalifeguard

7

해결책:

at >nul
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

Windows 10에서 작동하지 않습니다.

모든 버전의 Windows에 대해 이렇게 할 수 있습니다.

openfiles >nul 2>&1
if %ErrorLevel% equ 0 ( echo Administrator ) else ( echo NOT Administrator )

6

나는 많은 (대부분?) 응답을 읽은 다음 Win 8.1에서 나를 위해 작동하는 bat 파일을 개발했습니다. 나는 그것을 공유 할 것이라고 생각했다.

setlocal
set runState=user
whoami /groups | findstr /b /c:"Mandatory Label\High Mandatory Level" > nul && set runState=admin
whoami /groups | findstr /b /c:"Mandatory Label\System Mandatory Level" > nul && set runState=system
echo Running in state: "%runState%"
if not "%runState%"=="user" goto notUser
  echo Do user stuff...
  goto end
:notUser
if not "%runState%"=="admin" goto notAdmin
  echo Do admin stuff...
  goto end
:notAdmin
if not "%runState%"=="system" goto notSystem
  echo Do admin stuff...
  goto end
:notSystem
echo Do common stuff...
:end

누군가 이것이 유용하다고 생각하기를 바랍니다. :)


whoami / groups는 잘못된 정보를 얻는 경우가 있습니다. 참조 stackoverflow.com/questions/4051883/...
zumalifeguard

감사합니다! 다른 "whoami"솔루션은 Windows 8.1에서 작동하지 않았습니다. 이건 해냈어.
라이언


1

내가이 파티에 정말 늦었다는 것을 알고 있지만 여기에 관리자 권한을 결정하는 한 가지 라이너가 있습니다.

오류 수준에 의존하지 않습니다 systeminfo.

for /f "tokens=1-6" %%a in ('"net user "%username%" | find /i "Local Group Memberships""') do (set admin=yes & if not "%%d" == "*Administrators" (set admin=no) & echo %admin%)

사용자의 관리자 상태에 따라 예 또는 아니오를 반환합니다.

또한 변수 "admin"의 값을 이에 따라 yes 또는 no로 설정합니다.


사용자가 관리자 로컬 그룹의 직접적인 구성원 인 경우에만 작동합니다. 사용자가 Administrators 그룹의 구성원 인 도메인 그룹 (예 : "Domain Admins")의 구성원 인 경우 작동하지 않습니다.
Harry Johnston

1

관리자 권한이있는 사용자로 실행하는 경우 환경 변수 SessionName이 정의되지 않으며 배치 파일을 실행할 때 여전히 관리자 권한이 없습니다.

관리자 권한을 확인하려면 "net session"명령을 사용하고 오류 반환 코드 "0"을 찾아야합니다.

예; -첫 번째 echo 문은 벨 문자입니다. net session >nul 2>&1 if not %errorlevel%==0 (echo echo You need to start over and right-click on this file, echo then select "Run as administrator" to be successfull. echo.&pause&exit)


0

다음은 Windows 7에서 Windows 10까지 사용한 간단한 방법입니다. 기본적으로 "IF EXIST"명령을 사용하여 Windows \ System32 \ WDI \ LogFiles 폴더를 확인합니다. WDI 폴더는 7 개 이상의 모든 Windows 설치에 존재하며 액세스하려면 관리자 권한이 필요합니다. WDI 폴더에는 항상 그 안에 LogFiles 폴더가 있습니다. 따라서 WDI \ LogFiles 폴더에서 "IF EXIST"를 실행하면 관리자로 실행하면 true를 반환하고 관리자로 실행하지 않으면 false를 반환합니다. 이것은 배치 파일에서 권한 수준을 확인하고 그 결과에 따라 원하는 명령으로 분기하는 데 사용할 수 있습니다.

다음은 예제 코드의 간단한 스 니펫입니다.

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)

:GOTADMIN
(Commands for running with admin privileges)

이 방법은 WDI 폴더에서 기본 보안 권한이 수정되지 않았다고 가정합니다 (대부분의 상황에서 발생하지 않을 수 있지만 아래의주의 사항 # 2 참조). 이 경우에도 관리자 액세스가 필요한 다른 공통 파일 / 폴더를 확인하기 위해 코드를 수정하기 만하면됩니다 (System32 \ config \ SAM이 좋은 대체 후보가 될 수 있음). 또는이를 위해 특별히 직접 만들 수도 있습니다. 목적.

이 방법에는 두 가지주의 사항이 있습니다.

  1. UAC를 비활성화하면 어쨌든 모든 것이 관리자로 실행된다는 단순한 사실을 깨뜨릴 수 있습니다.

  2. Windows 탐색기에서 WDI 폴더를 열고 메시지가 표시 될 때 "계속"을 클릭하면 해당 사용자 계정에 대한 영구 액세스 권한이 추가되어 방법이 손상됩니다. 이 경우 WDI 폴더 보안 권한에서 사용자 계정을 제거하여 해결할 수 있습니다. 어떤 이유로 든 사용자가 Windows 탐색기를 사용하여 WDI 폴더에 액세스 할 수 있어야하는 경우 다른 폴더를 확인하도록 코드를 수정해야합니다 (위에서 언급했듯이이 목적을 위해 특별히 직접 생성하는 것이 좋습니다). .

따라서 내 방법은 망가질 수 있기 때문에 완벽하지는 않지만 구현하기 쉽고 모든 버전의 Windows 7, 8 및 10과 동일하게 호환되는 비교적 빠른 방법이며 언급 된주의 사항에 유의해야합니다. 나에게 100 % 효과적이었습니다.


0

Win7 Enterprise 및 Win10 Enterprise에서 작동

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.