Les utilisateurs de Windows peuvent obtenir différents privilèges .
Les privilèges déterminent le type d'opérations système qu'un compte d'utilisateur peut effectuer. Un administrateur attribue des privilèges aux comptes d'utilisateurs et de groupes. Les privilèges de chaque utilisateur incluent ceux accordés à l'utilisateur et aux groupes auxquels l'utilisateur appartient.
Il y a actuellement 35 privilèges. Certains des plus intéressants sont:
Mais celui qui m'intéresse est:
J'ai remarqué que je n'ai pas ce privilège . A partir d'une invite de commande élevée:
>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
...
Ceci est confirmé lorsque vous utilisez Process Explorer pour examiner le jeton de sécurité d'un processus élevé s'exécutant en tant que moi:
Et pourtant, je peux arrêter le système. Pourquoi?
Si vous utilisez le composant logiciel enfichable éditeur de stratégie de sécurité locale (secpol.msc
), vous pouvez constater que je devrais avoir le privilège suivant:
secpol.msc
L'explication du privilège:
Arrêtez le système
Ce paramètre de sécurité détermine quels utilisateurs connectés localement à l'ordinateur peuvent arrêter le système d'exploitation à l'aide de la commande Arrêter. L'utilisation abusive de ce droit d'utilisateur peut entraîner un déni de service.
Par défaut sur les postes de travail: Administrateurs, Opérateurs de sauvegarde, Utilisateurs.
Par défaut sur les serveurs: Administrateurs, Opérateurs de sauvegarde.
Valeur par défaut sur les contrôleurs de domaine: administrateurs, opérateurs de sauvegarde, opérateurs de serveur, opérateurs d'impression.
Je suis un utilisateur . Parfois, je suis un administrateur et d'autres fois, je suis NotAdministrator .
Peut-être que la question devrait être pourquoi ne pas j'ai le privilège.
Mais la réalité est que je n'ai pas le privilège; et pourtant, lorsque connecté localement, je peux éteindre le système local.
Pourquoi?
@Mehrdad avait une bonne réponse, qu'il a supprimée, ce qui mérite, à mon avis, une attention particulière et répond à la question de manière succincte:
Vous avez le privilège. Il est simplement désactivé par défaut. Si vous n'aviez pas le privilège alors , il ne figurerait pas du tout .
Notez queSE_PRIVILEGE_REMOVED
est différent de l'absence deSE_PRIVILEGE_ENABLED
ou deSE_PRIVILEGE_ENABLED_BY_DEFAULT
.
Vous avez la permission, mais c'est désactivé . C'est ce que PowerShell vous dit.
Pour arrêter le système, utilisez la fonction Win32API appelée InitiateSystemShutdown
ou ExitWindowsEx
:
ExitWindowsEx(EWX_POWEROFF, 0);
Ces fonctions notent:
Pour éteindre l'ordinateur local, le thread appelant doit disposer du privilège SE_SHUTDOWN_NAME. Par défaut, les utilisateurs peuvent activer le privilège SE_SHUTDOWN_NAME sur l'ordinateur auquel ils sont connectés et les administrateurs peuvent activer le privilège SE_REMOTE_SHUTDOWN_NAME sur des ordinateurs distants.
Comme vous pouvez le constater, Windows vérifie les privilèges de thread (tout thread a un jeton avec privilèges). Si vous appelez ExitWindowsEx
sans le privilège SE_SHUTDOWN_NAME , la fonction échouera avec l'erreur suivante:
Error code: 1314
A required privilege is not held by the client
Les fils que vous créez par défaut héritent de vos privilèges. mais un programme peut activer un privilège désactivé qui lui a été accordé en utilisant 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);
Modification des privilèges dans un jeton dit:
AdjustTokenPrivileges
ne peut pas ajouter ou supprimer des privilèges du jeton. Il peut uniquement activer les privilèges existants actuellement désactivés ou désactiver les privilèges existants actuellement activés.
Alors, pourquoi ce privilège est-il désactivé par défaut? Pour vous assurer qu'aucun programme ne peut arrêter Windows par accident. Les applications devraient demander cela explicitement.
Il existe un livre ancien mais très bon: https://www.Amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/ à propos de tout ça.
C'est parce que votre utilisateur appartient à un groupe sur lequel ce privilège est activé.
Pour voir par vous-même quel (s) groupe (s):
secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG
.SeShutdownPrivilege
. Vous devriez (devriez) voir quelques SID pour les utilisateurs et/ou les groupes pour lesquels ce privilège est activé.Donc, j'ai trois courts SID énumérés. Les SID courts sont généralement des comptes/groupes au niveau de l'ordinateur. Par exemple, l'un d'eux est S-1-5-32-545
.
En utilisant PowerShell, nous pouvons déterminer le compte/groupe que SID représente:
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-32-545")
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$objUser.Value
Ceci retourne BUILTIN\Users
.
Puisque vous êtes un utilisateur de cet ordinateur, vous êtes automatiquement membre de ce groupe, ce qui signifie que vous pouvez l'éteindre.
Les deux autres que j'ai sont S-1-5-32-544
et S-1-5-32-551
. Ce sont le groupe standard BUILTIN\Administrators
et le groupe BUILTIN\Backup Operators
. Qui s'aligne avec les groupes que vous voyez dans la boîte de dialogue secpol.msc
.