사용자 입력을 받아 시스템 전체를 변경하는 스크립트를 작성하려고합니다. 나는 이것이 매우 일반적인 것이 필요하지만 상단에 간단히 '관리자 권한으로'실행되고 있는지 확인해야합니다. 그렇지 않다면, 그들에게 메시지를 표시하고 싶습니다. 그렇다면 계속 진행하고 싶습니다. 이것을 확인하는 지속적인 방법이 있습니까? 관리자로 새 세션을 시작하지 않고 현재 관리자로 실행 중인지 감지 하고 싶습니다.
사용자 입력을 받아 시스템 전체를 변경하는 스크립트를 작성하려고합니다. 나는 이것이 매우 일반적인 것이 필요하지만 상단에 간단히 '관리자 권한으로'실행되고 있는지 확인해야합니다. 그렇지 않다면, 그들에게 메시지를 표시하고 싶습니다. 그렇다면 계속 진행하고 싶습니다. 이것을 확인하는 지속적인 방법이 있습니까? 관리자로 새 세션을 시작하지 않고 현재 관리자로 실행 중인지 감지 하고 싶습니다.
답변:
스택 오버플로 에서 이것을 찾았습니다 .
@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
net session >nul 2>&1 && echo Success || echo Failure
. 이 간단한 구문이 더 편리하다는 것을 알았습니다.
무결성 수준이 높은지 확인합니다. (Windows Vista 이상에서 작동)
@echo off
whoami /groups | find "S-1-16-12288" > nul
if %errorlevel% == 0 (
echo Welcome, Admin
) else (
echo Get lost, User
)
whoami
XP에서 @week 가 없습니다.
이 방법 또는 다른 방법으로 결함이있는 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 + 이고 다른 하나 는 더 오래되었습니다 .
내가 찾은 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 도메인 컨트롤러로 구성된 시스템 이외의 비표준 구성입니다.
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가 왜 '확인'을 사용하여 오류 수준을 먼저 지웠는 지 잘 모르겠습니다.