현재 명령 프롬프트가 관리자로 시작되었는지 확인


21

사용자 입력을 받아 시스템 전체를 변경하는 스크립트를 작성하려고합니다. 나는 이것이 매우 일반적인 것이 필요하지만 상단에 간단히 '관리자 권한으로'실행되고 있는지 확인해야합니다. 그렇지 않다면, 그들에게 메시지를 표시하고 싶습니다. 그렇다면 계속 진행하고 싶습니다. 이것을 확인하는 지속적인 방법이 있습니까? 관리자로 새 세션을 시작하지 않고 현재 관리자로 실행 중인지 감지 하고 싶습니다.



@ g-man 어떻게 관련되어 있습니까?
Canadian Luke REINSTATE MONICA

또한 관리자 권한으로 실행하거나 그렇지 않은 경우 다르게 동작하는 명령을 요청하거나 최소한 명령으로 응답합니다.
G-남자 '는 분석 재개 모니카'말한다

답변:


16

스택 오버플로 에서 이것을 찾았습니다 .

@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

삭제 된 이유는 무엇입니까?
Canadian Luke REINSTATE MONICA

이것은 관리자 계정 제한된 사용자로 실행할 때 모두 작동 하지만 '관리자로 실행'을 선택하십시오
Canadian Luke REINSTATE MONICA

2
같은 생각이지만 조건부 실행 연산자를 사용합니다 net session >nul 2>&1 && echo Success || echo Failure. 이 간단한 구문이 더 편리하다는 것을 알았습니다.
dbenham

6
"서버"서비스가 실행 중이어야합니다.
ivan_pozdeev

8

무결성 수준이 높은지 확인합니다. (Windows Vista 이상에서 작동)

@echo off

whoami /groups | find "S-1-16-12288" > nul

if %errorlevel% == 0 (
 echo Welcome, Admin
) else (
 echo Get lost, User
)

1
whoami는 XP에서 지원되지 않습니다 내 천막은 Windows XP에서 Windows 8까지 모든 OS를 더 잘 지원합니다
Alex

2
명령 프롬프트를 열면 작동합니다. CMD As Administrator를 실행해도 여전히 사용자로 실행되고 있음을 보여줍니다.
Canadian Luke REINSTATE MONICA

2
더 많은 OS에 대한 @Alex 지원은 훌륭하지만이 방법은 신뢰할 수없는 부정을 제거하지 않고 현재 세션에 부여 된 권한을 직접 쿼리하여 긍정적으로 추론하기 때문에 더욱 안정적입니다.
Iszi

2
주, whoami / groups는 잘못된 정보를 얻는 최첨단 사례가 있습니다. 참조 stackoverflow.com/questions/4051883/...
zumalifeguard

1
whoamiXP에서 @week 가 없습니다.
ivan_pozdeev

4

이 방법 또는 다른 방법으로 결함이있는 SE ( 1 , 2 , 3) 에 대한 여러 가지 질문에 대한 많은 답변이 Windows가 안정적인 내장 유틸리티를 제공하지 않는다는 것을 분명히 보여주었습니다. . 이제 자신의 시간을 내야 할 때입니다.

더 이상 더러운 핵이 없으면 :

다음 프로그램을 컴파일하거나 (지침에 따라) 사전 컴파일 된 사본을 얻으 십시오 . 한 번만 수행하면 Sysinternals Suite.exe 와 같이 어디에서나 복사 할 수 있습니다 .

코드는 UAC, 도메인, 전이 그룹 등을 포함하거나 포함하지 않고 Win2k + 1 에서 작동합니다 . 권한을 확인할 때 시스템 자체와 동일한 방식을 사용하기 때문입니다. chkadmin"Admin"또는 "Non-admin"을 인쇄하고 종료 코드를 각각 0 또는 1로 설정합니다. /q스위치로 출력을 억제 할 수 있습니다 .

chkadmin.c:

#include <malloc.h>
#include <stdio.h>
#include <windows.h>
#pragma comment (lib,"Advapi32.lib")

int main(int argc, char** argv) {
    BOOL quiet = FALSE;
    DWORD cbSid = SECURITY_MAX_SID_SIZE;
    PSID pSid = _alloca(cbSid);
    BOOL isAdmin;

    if (argc > 1) {
        if (!strcmp(argv[1],"/q")) quiet=TRUE;
        else if (!strcmp(argv[1],"/?")) {fprintf(stderr,"Usage: %s [/q]\n",argv[0]);return 0;}
    }

    if (!CreateWellKnownSid(WinBuiltinAdministratorsSid,NULL,pSid,&cbSid)) {
        fprintf(stderr,"CreateWellKnownSid: error %d\n",GetLastError());exit(-1);}

    if (!CheckTokenMembership(NULL,pSid,&isAdmin)) {
        fprintf(stderr,"CheckTokenMembership: error %d\n",GetLastError());exit(-1);}

    if (!quiet) puts(isAdmin ? "Admin" : "Non-admin");
    return !isAdmin;
}

컴파일하려면 Windows SDK 명령 프롬프트에서 실행하십시오.

cl /Ox chkadmin.c

(VS2012 +를 사용 하는 경우 2k / XP를 타겟팅해야하는 경우 추가 조정이 필요합니다 )


이 방법은 https : //.com/questions/4230602/detect-if-program-is-running-with-full-administrator-rights/4230908#4230908에서 제공합니다.

1 MSDN은 API가 XP +라고 주장하지만 이는 사실이 아닙니다. CheckTokenMembership 2k + 이고 다른 하나 는 더 오래되었습니다 .


3

내가 찾은 CMD 스크립트를 사용하여 관리자 권한을 확인하는 가장 깨끗한 방법은 다음과 같습니다.

@echo off

REM  Calling verify with no args just checks the verify flag,
REM   we use this for its side effect of setting errorlevel to zero
verify >nul

REM  Attempt to read a particular system directory - the DIR
REM   command will fail with a nonzero errorlevel if the directory is
REM   unreadable by the current process.  The DACL on the
REM   c:\windows\system32\config\systemprofile directory, by default,
REM   only permits SYSTEM and Administrators.
dir %windir%\system32\config\systemprofile >nul 2>nul

REM  Use IF ERRORLEVEL or %errorlevel% to check the result
if not errorlevel 1 echo has Admin privs
if     errorlevel 1 echo has only User privs

이 방법은 CMD.exe 기본 제공 기능 만 사용하므로 매우 빠릅니다. 또한 SID 또는 그룹 구성원을 확인하는 대신 프로세스의 실제 기능을 확인하므로 효과적인 권한이 테스트됩니다. 그리고 이것은 Windows 2003 및 XP와 같은 방식으로 작동합니다. 일반 사용자 프로세스 또는 관련이없는 프로세스는 관리자 또는 상승 된 프로세스가 성공할 때 디렉토리 프로브에 실패합니다.

경우이 테스트는 실패 Everyone, BUILTIN\Users또는 기타 유사한 그룹이 systemprofile에 대한 읽기 권한을 부여한다. 물론, 이는 NT 도메인 권한 \ 인증 된 사용자에게 시스템 프로파일에 대한 읽기 / 실행 권한을 부여하는 Windows 도메인 컨트롤러로 구성된 시스템 이외의 비표준 구성입니다.


> 확인 확인이 꺼져 있습니다. > 확인 /? 파일이 디스크에 올바르게 쓰여 졌는지 확인하도록 cmd.exe에 지시합니다. 확인 [ON | OFF] 현재 VERIFY 설정을 표시하려면 매개 변수없이 VERIFY를 입력하십시오. 이 명령은 스크립트에 어떤 도움이됩니까?
Canadian Luke REINSTATE MONICA

3
@Canadian Luke, 일부 기본 제공 명령 명령은 오류가없는 경우 오류 수준을 지우지 않습니다. 따라서 사람들은와 같은 핵을 사용하여 오류 수준을 지우는 습관을 들이게되었습니다 verify. cd .오류 수준을 0으로 설정하고 출력을 생성하지 않으며 (0을 사용하여 길이가 0 인 파일을 만드는데도 유용한 (cd space dot) 을 사용하는 경향이 있습니다 cd . >somefile. 즉, Windows 2000, XP, Vista, 2003, 2008, 2012, 7, 8 및 10에서 'dir'을 테스트했습니다. 모든 'dir'에 대해 이전에 설정된 경우 성공하면 오류 수준을 0으로 지 웁니다. 'dir'. 따라서 william가 왜 '확인'을 사용하여 오류 수준을 먼저 지웠는 지 잘 모르겠습니다.
user3347790
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.