현재 배치 스크립트에 관리자 권한이 있는지 어떻게 확인합니까?
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]는 로컬 컴퓨터와의 모든 세션에 대한 정보를 표시합니다.”
주어진 구현의 기본 프로세스는 다음과 같습니다.
@echo off
- 명령 표시 비활성화
goto check_Permissions
:check_Permissions
코드 블록으로 이동
net session >nul 2>&1
- 명령을 실행
- 에 의해 명령의 시각적 출력 숨기기
- 표준 출력 (숫자 핸들 1 /
STDOUT
) 스트림을nul
- 표준 오류 출력 스트림 (숫자 핸들 2 /
STDERR
)을 숫자 핸들 1과 동일한 대상으로 리디렉션
- 표준 출력 (숫자 핸들 1 /
if %errorLevel% == 0
- 종료 코드 (의 값이있는 경우
%errorLevel%
) 인0
것을 다음이 의미 오류가 발생하지 않은 , 따라서, 바로 위 명령을 실행 성공적으로
- 종료 코드 (의 값이있는 경우
else
- 종료 코드 (
%errorLevel%
) 값 이 아닌0
경우 오류가 발생 했으므로 바로 이전 명령이 성공적으로 실행 되지 않은 것입니다.
- 종료 코드 (
- 각 괄호 사이의 코드는 충족되는 기준에 따라 실행됩니다.
스크린 샷
NET SESSION
Windows XP x86-Windows 8 x64 :
수락 된 답변을 내 것으로 변경해 주셔서 감사합니다. @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 버전에서 지원되는 유일한 매개 변수 를 찾아야합니다 . 검색은 대소 문자를 구분하지 않으며로 리디렉션하여 출력을 버립니다 ./SCANNOW
nul
다음은 설명서에서 발췌 한 내용입니다.
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 안전 모드 또는 특수 표준 서비스에서 실행되는 경우 중요한 사용 사례가 아닙니다. -일부 관리자에게는 해당 될 수 있습니다.)