programing

CMD가 Administrator로 실행 중인지, 상승된 권한을 가지고 있는지를 검출하는 방법

elseif 2023. 4. 19. 22:26

CMD가 Administrator로 실행 중인지, 상승된 권한을 가지고 있는지를 검출하는 방법

배치 파일 내에서 Administrator/elvated 권한으로 실행 중인지 테스트합니다.

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

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

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

에는 type 이이라는 만 필요해요net session이치노

관리자가 아닌 경우 접근 거부 메시지가 나타납니다.

System error 5 has occurred.

Access is denied.

관리자일 경우 다음과 같은 다른 메시지가 나타납니다.

There are no entries in the list.

MS Technet에서:

net session은 파라미터 없이 사용되며 로컬컴퓨터와의 모든 세션에 대한 정보를 표시합니다.

부록: 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에서 사용할 배치 파일의 결과에 따라 종료 코드를 반환합니다.

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에서는 동작하지만 이전 버전은 잘 모르겠습니다.)

다른 사람들이 이전에 사용했던 것과 거의 비슷하지만 배치 명령어 시작 부분에 배치할 수 있는 하나의 라이너로 사용할 수 있습니다(음, 보통 @echo off 후).

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

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

상승이 실행되고 있는지 확인합니다.

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

다음 문서에서는 SID 창에서 사용하는 무결성 수준을 보여 줍니다.http://msdn.microsoft.com/en-us/library/bb625963.aspx

다음은 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의 Chris Jackson은 다음과 같이 말했다.

고가화 실행 시 토큰에는 필수 라벨이라는ACE가 포함됩니다.높은 필수 수준.

솔루션:

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 )

많은 응답(대부분?)을 읽고 Win 8.1에서 사용할 수 있는 배트 파일을 개발했습니다.같이 먹으려고요

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

누군가가 이것을 유용하게 써주길 바란다:)

https://stackoverflow.com/a/38856823/2193477의 "1개도 없는" 버전

@echo off
net.exe session 1>NUL 2>NUL || goto :not_admin
echo SUCCESS
goto :eof

:not_admin
echo ERROR: Please run as a local administrator.
exit /b 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%)

사용자의 관리 상태에 따라 yes 또는 no가 반환됩니다.

또한 변수 "admin"의 값을 yes 또는 no와 동일하게 설정합니다.

다음은 Windows 7에서 Windows 10까지 사용한 간단한 방법입니다.기본적으로는 "IF EXISTING" 명령어를 사용하여 Windows를 확인합니다.시스템32\WDI\LogFiles 폴더.WDI 폴더는 Windows 7 이후 설치 시마다 존재하며 액세스하려면 관리자 권한이 필요합니다.WDI 폴더에는 항상 LogFiles 폴더가 있습니다.그래서 달리기를...WDI\LogFiles 폴더에 있는 IF EXISTIVE"는 admin으로 실행되면 true, admin으로 실행되지 않으면 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은 좋은 대체 후보일 수 있습니다.) 또는 그 목적을 위한 독자적인 후보도 작성할 수 있습니다.

다만, 이 방법에는 다음의 2개의 주의사항이 있습니다.

  1. UAC 를 무효로 하면, 모든 것이 admin 로서 동작한다고 하는 단순한 사실을 타파할 가능성이 있습니다.

  2. Windows 탐색기에서 WDI 폴더를 열고 메시지가 나타나면 "계속"을 클릭하면 해당 사용자 계정에 영구 액세스 권한이 추가되어 메서드가 해제됩니다.이 경우 WDI 폴더 보안 권한에서 사용자 계정을 삭제하여 수정할 수 있습니다.어떤 이유로든 사용자가 Windows 탐색기를 사용하여 WDI 폴더에 액세스할 수 있어야 하는 경우 코드를 수정하여 다른 폴더를 확인해야 합니다(위에서 설명한 바와 같이 이 목적을 위한 고유한 폴더를 만드는 것이 좋습니다).

이 방법은 고장날 수 있기 때문에 완벽하지는 않지만 비교적 빠르게 구현할 수 있으며 모든 버전의 Windows 7, 8, 10과 동등하게 호환됩니다.단, 상기 경고에 유의하면 100% 효과가 있습니다.

Windows 7 Enterprise 및 Windows 10 Enterprise 지원

@if DEFINED SESSIONNAME (
    @echo.
    @echo You must right click to "Run as administrator"
    @echo Try again
    @echo.
    @pause
    @goto :EOF
)

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

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

예; - 첫 번째 에코 문은 벨 문자입니다. 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)

안타깝게도 다른 사람이 제시한 'S-1-5-32-544'는 입면증명이 되지 않는다.

Windows 10 이상에서는, 언어에 의존하지 않는 어프로치는 다음과 같습니다.

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

이것은 「고필수 레벨」로, 실제로는 에스컬레이션 됩니다.

일반 명령 프롬프트:

C:\> whoami /groups | find "S-1-16-12288"
C:\>

관리자 명령 프롬프트:

C:\> whoami /groups | find "S-1-16-12288"
Mandatory Label\High Mandatory Level                          Label            S-1-16-12288                                                                                                                                                     


C:\>

.bat 파일에서 사용하려면:

whoami /groups | find "S-1-16-12288" && set ELEVATED=true || set ELEVATED=false

powershell에서도 사용할 수 있습니다.

function is_elevated() {
  Param( [String] $ToGroup = "S-1-16-12288" )
  return [bool] ( whoami /groups | select-string $ToGroup )
}

예를 들어 다음과 같습니다.

PS> cd c:/temp
PS> set-content is-elevated.ps1 "return [bool] ( whoami /groups | sls S-1-16-12288 )"
PS> ./is-elevated.ps1
False
PS> start -verb runas powershell.exe
...
PS C:\Windows\system32> cd \temp
PS C:\temp> ./is-elevated.ps1
True

Torin Darkflight 덕분에 Windows 11에서 사용할 수 있는 방법은 귀하의 방법뿐입니다.다음은 게시물을 확장하는 스크립트의 예입니다.

IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO :Running_As_An_Admin
ECHO You are NOT an Administrator. This command requires admin rights. & Echo: & Echo Quitting......
@TIMEOUT /T 10
goto :QUIT
:Running_As_An_Admin
Echo Do Admin stuff here!!!

:QUIT

언급URL : https://stackoverflow.com/questions/7985755/how-to-detect-if-cmd-is-running-as-administrator-has-elevated-privileges