Benutzern in Windows können verschiedenePrivilegien
Berechtigungen bestimmen die Art der Systemvorgänge, die ein Benutzerkonto ausführen kann. Ein Administrator weist Benutzer- und Gruppenkonten Berechtigungen zu. Zu den Berechtigungen jedes Benutzers zählen diejenigen, die dem Benutzer selbst und den Gruppen, denen der Benutzer angehört, gewährt werden.
Derzeit gibt es 35 Privilegien. Einige der interessanteren sind:
- SeSystemtimePrivilege: Erforderlich, um die Systemzeit zu ändern.
- SeTimeZonePrivileg: Erforderlich, um die Zeitzone der internen Uhr des Computers anzupassen
- SeBackupPrivilege: Dieses Privileg bewirkt, dass das System allen Dateien uneingeschränkten Lesezugriff gewährt, unabhängig von der für die Datei angegebenen Zugriffskontrollliste (ACL).
- SeCreatePagefilePrivilege: Erforderlich, um eine Auslagerungsdatei zu erstellen.
- SeRemoteShutdownPrivilege: Erforderlich, um ein System mithilfe einer Netzwerkanforderung herunterzufahren.
- SeDebugPrivilege: Erforderlich zum Debuggen und Anpassen des Speichers eines Prozesses, der einem anderen Konto gehört.
Aber das, was mich interessiert, ist:
- SeShutdownPrivileg: Erforderlich, um ein lokales System herunterzufahren.
Mir ist aufgefallen, dass ich eigentlich nichthabendieses Privileg. Von einer Eingabeaufforderung mit erhöhten Rechten:
>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
...
Dies wird bestätigt bei der VerwendungProcess Explorerum das Sicherheitstoken eines erhöhten Prozesses zu untersuchen, der unter meinem Namen ausgeführt wird:
Und dochdürfendas System herunterfahren. Warum?
Die Gruppenrichtlinie besagt, dass ich es haben sollte
Wenn Sie das Snap-In des lokalen Sicherheitsrichtlinien-Editors ( secpol.msc
) verwenden, können Sie sehen, dass ichsollenhabe das Privileg:
secpol.msc
DerErläuterungdes Privilegs:
Fahren Sie das System herunter
Mit dieser Sicherheitseinstellung legen Sie fest, welche lokal am Computer angemeldeten Benutzer das Betriebssystem mit dem Befehl „Herunterfahren“ herunterfahren können. Der Missbrauch dieses Benutzerrechts kann zu einer Dienstverweigerung führen.
Standardmäßig auf Arbeitsstationen: Administratoren, Sicherungsoperatoren, Benutzer.
Standardmäßig auf Servern: Administratoren, Backup-Operatoren.
Standardmäßig auf Domänencontrollern: Administratoren, Sicherungsoperatoren, Serveroperatoren, Druckoperatoren.
Ich bin einBenutzer. Manchmal bin ich einAdministrator, und manchmal bin ich einNichtAdministrator.
Vielleicht sollte die Frage lauten: Warum?nichtIch habe das Privileg.
Die Realität ist jedoch, dass ich über dieses Privileg nicht verfüge. Dennoch kann ich bei lokaler Anmeldung das lokale System herunterfahren.
Warum?
@Mehrdad hatte eine gute Antwort, die er gelöscht hat, die meiner Meinung nach Aufmerksamkeit verdient und die Frage schön und prägnant beantwortet:
Duhabendas Privileg. Es ist lediglich standardmäßig deaktiviert. Wenn Sie das Privileg nicht hatten, dannes würde überhaupt nicht aufgeführt werden.
Beachten dasSE_PRIVILEGE_REMOVED
ist etwas anderes als FehlenSE_PRIVILEGE_ENABLED
oderSE_PRIVILEGE_ENABLED_BY_DEFAULT
.
Zusätzliche Lektüre
Antwort1
Sie haben die Erlaubnis, aber es istdeaktiviert. Das ist es, was PowerShell Ihnen sagt.
Zum Herunterfahren des Systems verwenden Sie die Win32API-Funktion namensInitiateSystemShutdown
oderExitWindowsEx
:
ExitWindowsEx(EWX_POWEROFF, 0);
Diese Funktionen beachten:
Um den lokalen Computer herunterzufahren, muss der aufrufendeFadenmuss über das Privileg SE_SHUTDOWN_NAME verfügen. StandardmäßigBenutzer können den SE_SHUTDOWN_NAME aktivierenauf dem Computer, bei dem sie angemeldet sind, verfügen und Administratoren können das Privileg „SE_REMOTE_SHUTDOWN_NAME“ auf Remotecomputern aktivieren.
Wie Sie sehen, prüft WindowsFadenPrivilegien (jeder Thread hat Token mit Privilegien). Wenn Sie ExitWindowsEx
ohne dieSE_SHUTDOWN_NAMEBerechtigung wird die Funktion mit dem Fehler fehlschlagen:
Error code: 1314
A required privilege is not held by the client
Von Ihnen erstellte Threads erben standardmäßig Ihre Privilegien. Ein Programm kann jedoch ein deaktiviertes Privileg aktivieren, das ihm gewährt wurde, indemAdjustTokenPrivileges
:
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);
Ändern der Berechtigungen in einem Tokensagt:
AdjustTokenPrivileges
kann keine Berechtigungen hinzufügen oder entfernenvom Token. Es kannnur vorhandene Privilegien aktivieren, die derzeit deaktiviert sindoder deaktivieren Sie bestehende Berechtigungen, die derzeit aktiviert sind
Warum ist dieses Privileg standardmäßig deaktiviert? Um sicherzustellen, dass kein Programm Windows versehentlich herunterfahren kann. Anwendungen sollten dies explizit anfordern.
Es gibt ein altes, aber sehr gutes Buch:https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/über all das Zeug.
Antwort2
Dies liegt daran, dass Ihr Benutzer zu einer Gruppe gehört, für die dieses Privileg aktiviert ist.
Um selbst zu sehen, welche Gruppe(n):
- Öffnen Sie als Administrator eine PowerShell-Eingabeaufforderung (oder Eingabeaufforderung).
- Laufen
secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG
. - Sehen Sie sich den Inhalt von OutFile.cfg in Notepad oder einem ähnlichen Programm an und suchen Sie nach dem
SeShutdownPrivilege
Eintrag. Sie werden (sollten) ein paar SIDs für Benutzer und/oder Gruppen sehen, für die dieses Privileg aktiviert ist.
Ich habe also drei kurze SIDs aufgelistet. Kurze SIDs sind normalerweise Konten/Gruppen auf Computerebene. Eine davon ist beispielsweise S-1-5-32-545
.
Mithilfe von PowerShell können wir ermitteln, welches Konto/welche Gruppe diese SID repräsentiert:
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-32-545")
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$objUser.Value
Dies gibt zurück BUILTIN\Users
.
Da Sie ein Benutzer dieses Computers sind, sind Sie automatisch Mitglied dieser Gruppe und können den Computer herunterfahren.
Die anderen beiden, die ich habe S-1-5-32-544
, sind und S-1-5-32-551
. Dies sind die Standardgruppe BUILTIN\Administrators
und die BUILTIN\Backup Operators
Gruppe. Diese stimmen mit den Gruppen überein, die Sie im secpol.msc
Dialogfeld sehen.