[windows] 배치 스크립트 : 관리자 권한을 확인하는 방법

현재 배치 스크립트에 관리자 권한이 있는지 어떻게 확인합니까?

runas로 자체 호출하는 방법을 알고 있지만 관리자 권한을 확인하는 방법은 알고 있지 않습니다. 내가 본 유일한 솔루션은 거친 해킹 작업이나 외부 프로그램을 사용하는 것입니다. 글쎄, 실제로 Windows XP 이상에서 작동하는 한 해킹 작업인지는 상관하지 않습니다.



답변

이슈

blak3r / Rushyo 의 솔루션은 Windows 8 이외의 모든 환경에서 제대로 작동합니다. Windows 8에서 실행 AT하면 다음과 같은 결과가 발생합니다.

The AT command has been deprecated. Please use schtasks.exe instead.

The request is not supported.

(스크린 샷 # 1 참조)를 반환 %errorLevel% 1합니다.

 

연구

그래서 높은 권한이 필요한 다른 명령을 검색했습니다. rationallyparanoid.com 에는 몇 가지 목록이 있었으므로 표준 권한으로 실행할 때 두 OS 모두에서 액세스가 거부되는 명령을 찾기 위해 현재 Windows OS (XP 및 8)의 두 반대 극단에서 각 명령을 실행했습니다.

결국, 나는 하나를 찾았습니다 NET SESSION. 다음 과 관련이없는 진실 되고 깨끗하며 보편적 인 솔루션 :

  • 안전한 위치에서 데이터 생성 또는 상호 작용
  • FOR루프 에서 반환 된 데이터 분석
  • “관리자”에 대한 문자열 검색
  • 사용 AT(윈도우 8 호환) 또는 WHOAMI(윈도우 XP의 호환을).

각각에는 자체 보안, 유용성 및 이식성 문제가 있습니다.

 

테스팅

나는 이것이 작동한다는 것을 독립적으로 확인했다.

  • 윈도우 XP, x86
  • 윈도우 XP, x64
  • 윈도우 비스타, x86
  • 윈도우 비스타, x64
  • 윈도우 7, x86
  • 윈도우 7, x64
  • 윈도우 8, x86
  • 윈도우 8, x64
  • Windows 10 v1909, x64

(스크린 샷 # 2 참조)

 

구현 / 사용

따라서이 솔루션을 사용하려면 다음과 같이하십시오.

@echo off
goto check_Permissions

:check_Permissions
    echo Administrative permissions required. Detecting permissions...

    net session >nul 2>&1
    if %errorLevel% == 0 (
        echo Success: Administrative permissions confirmed.
    ) else (
        echo Failure: Current permissions inadequate.
    )

    pause >nul

게으른 경우 여기에서 사용할 수 있습니다 : https://dl.dropbox.com/u/27573003/Distribution/Binaries/check_Permissions.bat

 

설명

NET SESSION“서버 컴퓨터 연결을 관리하는 데 사용되는 표준 명령 입니다. 매개 변수없이 사용하면 [it]는 로컬 컴퓨터와의 모든 세션에 대한 정보를 표시합니다.”

주어진 구현의 기본 프로세스는 다음과 같습니다.

  1. @echo off
    • 명령 표시 비활성화
  2. goto check_Permissions
    • :check_Permissions코드 블록으로 이동
  3. net session >nul 2>&1
    • 명령을 실행
    • 에 의해 명령의 시각적 출력 숨기기
      1. 표준 출력 (숫자 핸들 1 / STDOUT) 스트림을nul
      2. 표준 오류 출력 스트림 (숫자 핸들 2 / STDERR)을 숫자 핸들 1과 동일한 대상으로 리디렉션
  4. if %errorLevel% == 0
    • 종료 코드 (의 값이있는 경우 %errorLevel%) 0 것을 다음이 의미 오류가 발생하지 않은 , 따라서, 바로 위 명령을 실행 성공적으로
  5. else
    • 종료 코드 ( %errorLevel%) 값 이 아닌 0 경우 오류가 발생 했으므로 바로 이전 명령이 성공적으로 실행 되지 않은 것입니다.
  6. 각 괄호 사이의 코드는 충족되는 기준에 따라 실행됩니다.

 

스크린 샷

윈도우 8AT %errorLevel% :

[imgur]

 

NET SESSIONWindows XP x86-Windows 8 x64 :

[imgur]

 

수락 된 답변을 내 것으로 변경해 주셔서 감사합니다. @Tilka. 🙂


답변

Anders 솔루션은 나를 위해 일했지만 반대가되도록 관리자를 사용하지 않는 방법을 확신하지 못했습니다.

여기 내 해결책이 있습니다. IF와 ELSE의 두 가지 경우와 사람들이 실제로 읽을 수 있도록하는 일부 아스키 아트가 있습니다. 🙂

최소 버전

Rushyo가이 솔루션을 여기에 게시했습니다. CMD가 관리자 권한으로 실행 중인지 감지하는 방법은 무엇입니까?

NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected!
) ELSE (
    ECHO NOT AN ADMIN!
)

오류 메시지, 일시 중지 및 종료를 추가하는 버전

@rem ----[ This code block detects if the script is being running with admin PRIVILEGES If it isn't it pauses and then quits]-------
echo OFF
NET SESSION >nul 2>&1
IF %ERRORLEVEL% EQU 0 (
    ECHO Administrator PRIVILEGES Detected!
) ELSE (
   echo ######## ########  ########   #######  ########
   echo ##       ##     ## ##     ## ##     ## ##     ##
   echo ##       ##     ## ##     ## ##     ## ##     ##
   echo ######   ########  ########  ##     ## ########
   echo ##       ##   ##   ##   ##   ##     ## ##   ##
   echo ##       ##    ##  ##    ##  ##     ## ##    ##
   echo ######## ##     ## ##     ##  #######  ##     ##
   echo.
   echo.
   echo ####### ERROR: ADMINISTRATOR PRIVILEGES REQUIRED #########
   echo This script must be run as administrator to work properly!
   echo If you're seeing this after clicking on a start menu icon, then right click on the shortcut and select "Run As Administrator".
   echo ##########################################################
   echo.
   PAUSE
   EXIT /B 1
)
@echo ON

WinXP-> Win8 (32/64 비트 버전 포함)에서 작동합니다.

편집 : 2012 년 8 월 28 일 Windows 8을 지원하도록 업데이트되었습니다. @BenHooper가 아래 답변에서 이것을 지적했습니다. 그의 대답을 찬성하십시오.


답변

더 많은 문제

@Lectrode에서 지적한 것처럼 net session서버 서비스가 중지 된 상태에서 명령 을 실행하려고 하면 다음 오류 메시지가 나타납니다.

The Server service is not started.

More help is available by typing NET HELPMSG 2114

이 경우 %errorLevel%변수는로 설정됩니다 2.

참고 안전 모드 (네트워킹 유무에 관계없이)에는 서버 서비스가 시작되지 않습니다.

대안을 찾고

무언가:

  • Windows XP 이상 (32 비트 및 64 비트)에서 즉시 사용할 수 있습니다.
  • 레지스트리 나 시스템 파일 / 폴더를 건드리지 않습니다.
  • 시스템 로케일에 관계없이 작동합니다.
  • 안전 모드에서도 정확한 결과를 제공합니다.

그래서 나는 바닐라 Windows XP 가상 머신을 부팅하고 C:\Windows\System32폴더 의 응용 프로그램 목록을 스크롤하면서 몇 가지 아이디어를 얻었습니다. 시행 착오 후에, 이것은 내가 생각해 낸 더러운 (pun 의도 된) 접근법입니다.

fsutil dirty query %systemdrive% >nul

fsutil dirty명령을 실행하려면 관리자 권한이 필요하며 그렇지 않으면 실패합니다. 운영 체제가 설치된 드라이브 문자를 반환 %systemdrive%하는 환경 변수 입니다. 출력이로 리디렉션 nul되어 무시됩니다. %errorlevel%변수에 설정됩니다 0만 성공적으로 실행시.

다음은 설명서의 내용입니다.

더러운 Fsutil

볼륨의 더티 비트를 쿼리하거나 설정합니다. 볼륨의 더티 비트가 설정되면 autochk 는 다음에 컴퓨터를 다시 시작할 때 볼륨에 오류가 있는지 자동으로 확인합니다.

통사론

fsutil dirty {query | set} <VolumePath>

매개 변수

query           Queries the specified volume's dirty bit.
set             Sets the specified volume's dirty bit.
<VolumePath>    Specifies the drive name followed by a colon or GUID.

비고

볼륨의 더티 비트는 파일 시스템이 일관성이없는 상태임을 나타냅니다. 더티 비트는 다음과 같은 이유로 설정 될 수 있습니다.

  • 볼륨이 온라인 상태이며 크게 변경되었습니다.
  • 변경 사항이 디스크에 적용되기 전에 볼륨이 변경되고 컴퓨터가 종료되었습니다.
  • 볼륨에서 손상이 발견되었습니다.

컴퓨터가 다시 시작될 때 더티 비트가 설정되면 chkdsk 가 실행되어 파일 시스템 무결성을 확인하고 볼륨 관련 문제를 해결하려고 시도합니다.

C 드라이브에서 더티 비트를 쿼리하려면 다음을 입력하십시오.

fsutil dirty query C:

추가 연구

위의 솔루션은 Windows XP부터 작동하지만 Windows 2000 및 Windows PE (사전 설치 환경)에는 포함되지 않는 추가 가치가 있습니다. fsutil.exe 합니다.

이전 테스트 중에 sfc매개 변수없이 명령 을 실행하면 다음과 같은 결과가 나타납니다.

  • 권한이 충분하지 않은 경우 오류;
  • 사용 가능한 매개 변수 및 사용법 목록.

즉 : 매개 변수가 없고 파티가 없습니다 . 아이디어는 출력을 구문 분석하고 오류 이외의 것이 있는지 확인할 수 있다는 것입니다.

sfc 2>&1 | find /i "/SCANNOW" >nul

오류 출력은 먼저 표준 출력으로 리디렉션 된 다음 find명령으로 파이프됩니다 . 이 시점 에서 Windows 2000 이후의 모든 Windows 버전에서 지원되는 유일한 매개 변수 를 찾아야합니다 . 검색은 대소 문자를 구분하지 않으며로 리디렉션하여 출력을 버립니다 ./SCANNOWnul

다음은 설명서에서 발췌 한 내용입니다.

Sfc

보호 된 모든 시스템 파일의 무결성을 검사하고 확인하고 잘못된 버전을 올바른 버전으로 바꿉니다.

비고

sfc.exe 를 실행하려면 Administrators 그룹의 구성원으로 로그온해야합니다 .

샘플 사용법

붙여 넣기 및 실행 예제는 다음과 같습니다.

Windows XP 이상

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
fsutil dirty query %systemdrive% >nul
exit /b

Windows 2000 / Windows PE

@echo off

call :isAdmin
if %errorlevel% == 0 (
echo Running with admin rights.
) else (
echo Error: Access denied.
)

pause >nul
exit /b

:isAdmin
sfc 2>&1 | find /i "/SCANNOW" >nul
exit /b

적용

  • 윈도우 2000
  • 윈도우 XP
  • 윈도우 비스타
  • 윈도우 7
  • 윈도우 8
  • 윈도우 8.1

  • Windows PE

답변

두 가지 방법-빠르고 역 호환 가능.

fltmc >nul 2>&1 && (
  echo has admin permissions
) || (
  echo has NOT admin permissions
)

fltmc XP 이후 모든 Windows 시스템에서 명령을 사용할 수 있으므로 이식성이 뛰어납니다.


하나 개 더 정말 빠른 솔루션에 대한 테스트 XP, 8.1, 7 – 하나 개의 특정 변수 거기에 =::콘솔 세션이 너무 쉽게 포함 변수를 만들 수없는 어떤 관리자 privileges.As이없는 경우에만 제공됩니다 =그것의 이름은이 관리자 확인하기 위해 비교적 신뢰할 수있는 방법입니다 권한 (외부 실행 파일을 호출하지 않으므로 성능이 좋습니다)

setlocal enableDelayedExpansion
set "dv==::"
if defined !dv! (
   echo has NOT admin permissions
) else (
   echo has admin permissions
)

배치 파일이 아닌 명령 줄을 통해 직접 사용하려면 다음을 사용할 수 있습니다.

set ^"|find "::"||echo has admin permissions


답변

>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"&&(
 echo admin...
)


답변

대체 솔루션 :

@echo off
pushd %SystemRoot%
openfiles.exe 1>nul 2>&1
if not %errorlevel% equ 0 (
    Echo here you are not administrator!
) else (
    Echo here you are administrator!
)
popd
Pause


답변

뿐만 아니라
자동으로 UAC for Win 7 / 8 / 8.1 ff.
: 다음은 하나 이상의 기능이 추가 된 멋진 기능입니다.이 배치 스 니펫은 관리자 권한을 검사 할뿐만 아니라 자동으로 가져옵니다! (그리고 UAC 가능 OS에 거주하는 경우 이전에 테스트합니다.)

이 트릭을 사용하면 “관리자 권한으로”배치 파일을 마우스 오른쪽 단추로 더 이상 쓸 필요가 없습니다. 잊어 버린 경우 높은 권한으로 시작하기 위해 UAC가 자동으로 나타납니다! 또한, OS가 UAC를 필요로하거나 제공하는 경우 처음에 테스트되므로 Win 8.1- 테스트가 완료 될 때까지 Win 2000 / XP에 대해 올바르게 동작합니다.

@echo off
REM Quick test for Windows generation: UAC aware or not ; all OS before NT4 ignored for simplicity
SET NewOSWith_UAC=YES
VER | FINDSTR /IL "5." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO
VER | FINDSTR /IL "4." > NUL
IF %ERRORLEVEL% == 0 SET NewOSWith_UAC=NO


REM Test if Admin
CALL NET SESSION >nul 2>&1
IF NOT %ERRORLEVEL% == 0 (

    if /i "%NewOSWith_UAC%"=="YES" (
        rem Start batch again with UAC
        echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
        echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
        "%temp%\getadmin.vbs"
        del "%temp%\getadmin.vbs"
        exit /B
    )

    rem Program will now start again automatically with admin rights!
    rem pause
    goto :eof
)

이 스 니펫은 몇 가지 좋은 배치 패턴을 통합합니다. 특히 (1) Ben Hooper가이 스레드의 관리자 테스트와 (2) BatchGotAdmin에서 읽은 UAC 활성화는 배치 사이트에서 robvanderwoude에 의해 인용되었습니다 (존중). (3) “VER | FINDSTR pattern”에 의한 OS 식별의 경우 참조를 찾을 수 없습니다.)

(다른 답변에서 언급 한대로 “NET SESSION”이 작동하지 않을 때 매우 사소한 제한 사항에 대해서는 다른 명령을 자유롭게 삽입하십시오. Windows 안전 모드 또는 특수 표준 서비스에서 실행되는 경우 중요한 사용 사례가 아닙니다. -일부 관리자에게는 해당 될 수 있습니다.)