SeShutdownPrivilege가 없을 때 시스템을 종료하는 방법


20

Windows 사용자에게는 다양한 권한 이 부여 될 수 있습니다

권한은 사용자 계정이 수행 할 수있는 시스템 작업 유형을 결정합니다. 관리자는 사용자 및 그룹 계정에 권한을 할당합니다. 각 사용자의 권한에는 사용자 및 사용자가 속한 그룹에 부여 된 권한이 포함됩니다.

현재 35 개의 권한이 있습니다. 더 흥미로운 것들 중 일부는 다음과 같습니다.

  • SeSystemtimePrivilege : 시스템 시간을 수정하는 데 필요합니다.
  • SeTimeZonePrivilege : 컴퓨터의 내부 시계와 관련된 시간대를 조정하는 데 필요
  • SeBackupPrivilege :이 권한으로 인해 시스템은 파일에 대해 지정된 ACL (액세스 제어 목록)에 관계없이 모든 읽기 액세스 제어를 파일에 부여합니다.
  • SeCreatePagefilePrivilege : 페이징 파일을 생성하는 데 필요합니다.
  • SeRemoteShutdownPrivilege : 네트워크 요청을 사용하여 시스템을 종료하는 데 필요합니다.
  • SeDebugPrivilege : 다른 계정이 소유 한 프로세스의 메모리를 디버그하고 조정하는 데 필요합니다.

그러나 내가 관심있는 것은 :

  • SeShutdownPrivilege : 로컬 시스템을 종료하는 데 필요합니다.

나는 실제로하지 않는 것으로 나타났습니다 이 권한을. 관리자 권한 명령 프롬프트에서 :

>whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                  Description                               State
=============================== ========================================= ========
SeIncreaseQuotaPrivilege        Adjust memory quotas for a process        Disabled
SeSecurityPrivilege             Manage auditing and security log          Disabled
SeTakeOwnershipPrivilege        Take ownership of files or other objects  Disabled
   ...
SeShutdownPrivilege             Shut down the system                      Disabled
   ...

이는 프로세스 탐색기 를 사용하여 나와 같이 실행중인 고급 프로세스의 보안 토큰을 검사 할 때 확인됩니다 .

여기에 이미지 설명을 입력하십시오

그러나 시스템을 종료 할 수 있습니다 . 왜?

그룹 정책에 따르면

로컬 보안 정책 편집기 스냅인 ( secpol.msc)을 사용하면 다음 권한 있어야합니다.

  • secpol.msc

    • 보안 설정
    • 지역 정책
    • 사용자 권한 할당
    • 시스템을 종료

      여기에 이미지 설명을 입력하십시오

Explaination 특권의 :

시스템을 종료

이 보안 설정에 따라 컴퓨터에 로컬로 로그온 한 사용자가 시스템 종료 명령을 사용하여 운영 체제를 종료 할 수 있습니다. 이 사용자 권한을 잘못 사용하면 서비스 거부가 발생할 수 있습니다.

워크 스테이션의 기본값 : 관리자, 백업 운영자, 사용자

서버의 기본값 : 관리자, 백업 운영자.

도메인 컨트롤러의 기본값 : 관리자, 백업 운영자, 서버 운영자, 인쇄 운영자.

저는 User 입니다. 때때로 저는 관리자 이고 다른 경우에는 NotAdministrator 입니다.

아마도 질문은 왜 내가 특권을 가지고 있지 않아야 하는가하는 입니다.

그러나 현실은 내가 특권이 없다는 것입니다. 그러나 로컬로 로그인하면 로컬 시스템을 종료 할 수 있습니다.

왜?


@ Mehrdad는 좋은 답변을 얻었습니다. 그는 삭제했습니다.

당신 특권이 있습니다. 기본적으로 비활성화되어 있습니다. 권한 이 없으면 목록에 전혀 표시되지 않습니다 .
주의SE_PRIVILEGE_REMOVED 부족과 다른 SE_PRIVILEGE_ENABLEDSE_PRIVILEGE_ENABLED_BY_DEFAULT.

보너스 독서


도메인이 처리하는 그룹 정책은 로컬 그룹 정책보다 우선합니다. 로컬 권한 대신 도메인 권한을 조정하십시오. "whoami / priv :, 어떤 사용자 그룹에 속했습니까? 내가 요청한 내용을 완전히 이해하지 못하면 질문을 편집하십시오. 요청한 내용 만 정확히 추측하기 때문입니다.
Ramhound

보안 토큰에 권한이 없을 때 시스템을 종료 할 수있는 이유를 묻습니다. 권한이 로컬 컴퓨터 또는 도메인 컨트롤러에서 제공되는지 여부 : 어느 쪽이든 내가 가지고 있지 않습니다.
Ian Boyd

물론 :) ... 주변의 모든 권한 문제를 전원 플러그를 가져옵니다 제거하는 것은 ... 다시 시작하는 방식에 따라 달라집니다
태양 마이크

답변:


29

권한이 있지만 비활성화되어 있습니다. 이것이 바로 PowerShell이 ​​말하는 것입니다.

셧다운 시스템에 당신은라는 Win32API 함수를 사용 InitiateSystemShutdown또는 ExitWindowsEx:

ExitWindowsEx(EWX_POWEROFF, 0);

이 기능은 다음을 참고하십시오.

로컬 컴퓨터를 종료하려면 호출 스레드 에 SE_SHUTDOWN_NAME 권한이 있어야합니다. 기본적으로 사용자 는 로그온 한 컴퓨터 에서 SE_SHUTDOWN_NAME 권한을 활성화 할 수 있으며 관리자는 원격 컴퓨터에서 SE_REMOTE_SHUTDOWN_NAME 권한을 활성화 할 수 있습니다.

보다시피 Windows는 스레드 권한을 검사 합니다 (모든 스레드에는 권한이있는 토큰이 있음). SE_SHUTDOWN_NAME 권한 ExitWindowsEx없이 호출 하면 오류와 함께 함수가 실패합니다.

Error code: 1314
A required privilege is not held by the client

기본적으로 생성 한 스레드는 권한을 상속받습니다. 그러나 프로그램은 다음을 사용하여 부여 된 비활성화 된 권한을 활성화 할 수 있습니다 AdjustTokenPrivileges.

TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = LookupPrivilegeValue(NULL, "SeShutdownPrivilege");
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

HANDLE processToken = OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES);
AdjustTokenPrivileges(processToken, false, tp, 0, NULL, NULL);
CloseHandle(processToken);

토큰에서 권한 변경 은 다음과 같이 말합니다.

AdjustTokenPrivileges 토큰에서 권한추가하거나 제거 할 수 없습니다 . 그것은 수 있습니다 만 현재 비활성화하는 권한을 기존의 수 또는 현재 사용하는 기존 권한을 해제


그렇다면 왜이 권한이 기본적으로 비활성화되어 있습니까? 프로그램이 실수로 Windows를 종료 할 수 없도록합니다. 애플리케이션은이를 명시 적으로 요청해야합니다.

고대이지만 아주 좋은 책이 있습니다 : https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ 그 모든 것에 대해.


나는 실제로 2 년 전에 그 책을 샀습니다. 다시 읽어야합니다.
Ian Boyd

C를 알고 있다면 VS 커뮤니티 (무료)를 다운로드하고 개인이 아닌 PC를 프로그래밍 방식으로 종료하십시오. 그런 다음이 개인 정보를 프로그래밍 방식으로 활성화하고 다시 시도하십시오). 그것은 Windows에 대해 무엇이든 연구하는 가장 좋은 방법입니다.)
user996142

@ user996142-종료하면 무엇입니까? 당신 말이 맞아 :)
Jules

5

사용자가 해당 권한이 활성화 된 그룹에 속해 있기 때문입니다.

어떤 그룹을 직접 확인하려면 :

  • 관리자 권한으로 PowerShell (또는 명령) 프롬프트를 엽니 다.
  • 를 실행하십시오 secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG.
  • OutFile.cfg의 내용을 메모장 등에서보고 SeShutdownPrivilege항목을 찾으십시오 . 해당 권한이 활성화 된 사용자 및 / 또는 그룹에 대한 몇 가지 / 몇 가지 SID가 표시됩니다.

그래서 세 개의 짧은 SID가 나열되어 있습니다. 짧은 SID는 일반적으로 컴퓨터 수준 계정 / 그룹입니다. 예를 들어, 그들 중 하나는입니다 S-1-5-32-545.

PowerShell을 사용하여 SID가 나타내는 계정 / 그룹을 결정할 수 있습니다.

$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-32-545")
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$objUser.Value

이 반환합니다 BUILTIN\Users.

해당 컴퓨터의 사용자이므로 자동으로 해당 그룹의 구성원이므로 컴퓨터를 종료 할 수 있습니다.

내가 가진 다른 두 있습니다 S-1-5-32-544, 그리고 S-1-5-32-551. 이들은 표준 BUILTIN\Administrators그룹과 BUILTIN\Backup Operators그룹입니다. secpol.msc대화 상자에 표시 되는 그룹과 일치하는 라인

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.