CMD가 관리자로 실행 중인지 / 상승 된 권한이 있는지 감지하는 방법은 무엇입니까?
배치 파일 내에서 관리자 / 상승 권한으로 실행 중인지 테스트하고 싶습니다.
"관리자 권한으로 실행"을 선택해도 사용자 이름은 변경되지 않으므로 작동하지 않습니다.
효과가 없지만 관리 권한이 필요한 범용 명령이있는 경우 해당 명령을 실행하고 권한을 테스트하기 위해 오류 코드를 확인할 수 있습니다. 지금까지 그런 명령을 찾지 못했습니다. 내가 찾은 명령은 특정하지 않은 단일 오류 코드를 반환하는 것 같으며, 이는 모든 것을 나타낼 수 있으며 다양한 이유로 인해 실패하기 쉽습니다.
이전 운영 체제를 지원하는 것이 좋겠지 만 저는 Windows 7에만 관심이 있습니다.
ADDENDUM : 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에서 종료 코드를 반환 할 수 있습니다.
이 트릭에는 하나의 명령 만 필요 net session
합니다. 명령 프롬프트에 입력 하십시오.
관리자가 아닌 경우 액세스가 거부되었습니다. 메시지가 표시됩니다.
에서 MS 테크넷 :
매개 변수없이 사용하면 net session은 로컬 컴퓨터의 모든 세션에 대한 정보를 표시합니다.
나는 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가 꺼진 후)
net.exe session 1>NUL 2>NUL || (Echo This script requires elevated rights. & Exit /b 1)
Vista, Win 7 이상에서이 작업을 수행하는 가장 쉬운 방법은 토큰 그룹을 열거하고 현재 무결성 수준을 찾는 것입니다 (또는 그룹 구성원 만 중요한 경우 관리자 sid).
관리자 권한으로 실행 중인지 확인하십시오.
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
다음 문서에서는 Windows에서 사용하는 무결성 수준 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의 크리스 잭슨 :
관리자 권한으로 실행하는 경우 토큰에는 필수 레이블 \ 높은 필수 수준이라는 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에서 나를 위해 작동하는 bat 파일을 개발했습니다. 나는 그것을 공유 할 것이라고 생각했다.
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
누군가 이것이 유용하다고 생각하기를 바랍니다. :)
A "not-a-one-liner" version of https://stackoverflow.com/a/38856823/2193477
@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
I know I'm really late to this party, but here's my one liner to determine admin-hood.
It doesn't rely on error level, just on 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%)
It returns either yes or no, depending on the user's admin status...
It also sets the value of the variable "admin" to equal yes or no accordingly.
Here's a simple method I've used on Windows 7 through Windows 10. Basically, I simply use the "IF EXIST" command to check for the Windows\System32\WDI\LogFiles folder. The WDI folder exists on every install of Windows from at least 7 onward, and it requires admin privileges to access. The WDI folder always has a LogFiles folder inside it. So, running "IF EXIST" on the WDI\LogFiles folder will return true if run as admin, and false if not run as admin. This can be used in a batch file to check privilege level, and branch to whichever commands you desire based on that result.
Here's a brief snippet of example code:
IF EXIST %SYSTEMROOT%\SYSTEM32\WDI\LOGFILES GOTO GOTADMIN
(Commands for running with normal privileges)
:GOTADMIN
(Commands for running with admin privileges)
Keep in mind that this method assumes the default security permissions have not been modified on the WDI folder (which is unlikely to happen in most situations, but please see caveat #2 below). Even in that case, it's simply a matter of modifying the code to check for a different common file/folder that requires admin access (System32\config\SAM may be a good alternate candidate), or you could even create your own specifically for that purpose.
There are two caveats about this method though:
Disabling UAC will likely break it through the simple fact that everything would be run as admin anyway.
Attempting to open the WDI folder in Windows Explorer and then clicking "Continue" when prompted will add permanent access rights for that user account, thus breaking my method. If this happens, it can be fixed by removing the user account from the WDI folder security permissions. If for any reason the user MUST be able to access the WDI folder with Windows Explorer, then you'd have to modify the code to check a different folder (as mentioned above, creating your own specifically for this purpose may be a good choice).
So, admittedly my method isn't perfect since it can be broken, but it's a relatively quick method that's easy to implement, is equally compatible with all versions of Windows 7, 8 and 10, and provided I stay mindful of the mentioned caveats has been 100% effective for me.
'Programing' 카테고리의 다른 글
C #의 팩토리 패턴 : 팩토리 클래스에서만 개체 인스턴스를 만들 수 있는지 확인하는 방법은 무엇입니까? (0) | 2020.09.15 |
---|---|
액세스 토큰을 사용하여 Facebook 사용자 ID를 얻는 방법 (0) | 2020.09.15 |
웹 사이트에 Favicon 추가 (0) | 2020.09.15 |
Sourcetree-최신 버전으로 업그레이드, git-flow 누락 (0) | 2020.09.15 |
루프의 어느 지점에서 정수 오버플로가 정의되지 않은 동작이됩니까? (0) | 2020.09.15 |