Os usuários do Windows podem receber váriosprivilégios
Os privilégios determinam o tipo de operações do sistema que uma conta de usuário pode executar. Um administrador atribui privilégios a contas de usuários e grupos. Os privilégios de cada usuário incluem aqueles concedidos ao usuário e aos grupos aos quais o usuário pertence.
Existem atualmente 35 privilégios. Alguns dos mais interessantes são:
- SeSystemtimePrivilege: Necessário para modificar a hora do sistema.
- SeTimeZonePrivilege: Necessário para ajustar o fuso horário associado ao relógio interno do computador
- SeBackupPrivilege: esse privilégio faz com que o sistema conceda todo o controle de acesso de leitura a qualquer arquivo, independentemente da lista de controle de acesso (ACL) especificada para o arquivo.
- SeCreatePagefilePrivilege: necessário para criar um arquivo de paginação.
- SeRemoteShutdownPrivilege: necessário para desligar um sistema usando uma solicitação de rede.
- SeDebugPrivilege: necessário para depurar e ajustar a memória de um processo pertencente a outra conta.
Mas o que me interessa é:
- SeShutdownPrivilege: necessário para desligar um sistema local.
Percebi que na verdade nãoteresse privilégio. Em um prompt de comando elevado:
>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
...
Isto é confirmado ao usarExplorador de processospara examinar o token de segurança de um processo elevado em execução como eu:
E ainda assim eupodedesligue o sistema. Por que?
A Política de Grupo diz que eu deveria tê-lo
Se você usar o snap-in do editor de Política de Segurança Local ( secpol.msc
), poderá ver que eudevetenha o privilégio:
secpol.msc
OExplicaçãodo privilégio:
Desligue o sistema
Essa configuração de segurança determina quais usuários conectados localmente no computador podem desligar o sistema operacional usando o comando Desligar. O uso indevido deste direito do usuário pode resultar em negação de serviço.
Padrão em estações de trabalho: administradores, operadores de backup, usuários.
Padrão em servidores: administradores, operadores de backup.
Padrão em controladores de domínio: Administradores, Operadores de Backup, Operadores de Servidor, Operadores de Impressão.
Eu sou umDo utilizador. Às vezes eu sou umAdministrador, e outras vezes sou umNão Administrador.
Talvez a questão devesse ser por quenãoEu tenho o privilégio.
Mas a realidade é que não tenho esse privilégio; e ainda assim, quando logado localmente, posso desligar o sistema local.
Por que?
@Mehrdad teve uma boa resposta, que ele excluiu, que acho que merece atenção e responde à pergunta de maneira adequada e sucinta:
Vocêtero privilégio. Está apenas desativado por padrão. Se você não teve o privilégio entãonão estaria listado de forma alguma.
Perceber issoSE_PRIVILEGE_REMOVED
é diferente de faltarSE_PRIVILEGE_ENABLED
ouSE_PRIVILEGE_ENABLED_BY_DEFAULT
.
Leitura bônus
Responder1
Você tem permissão, mas édesabilitado. Isso é o que o PowerShell está lhe dizendo.
Para desligar o sistema você usa a função Win32API chamadaInitiateSystemShutdown
ouExitWindowsEx
:
ExitWindowsEx(EWX_POWEROFF, 0);
Essas funções observam:
Para desligar o computador local, a chamadafiodeve ter o privilégio SE_SHUTDOWN_NAME. Por padrão,os usuários podem ativar o SE_SHUTDOWN_NAMEprivilégio no computador em que estão conectados e os administradores podem ativar o privilégio SE_REMOTE_SHUTDOWN_NAME em computadores remotos.
Como você pode ver, o Windows verificafioprivilégios (qualquer thread possui token com privilégios). Se você ligar ExitWindowsEx
sem oSE_SHUTDOWN_NAMEprivilégio, a função falhará com o erro:
Error code: 1314
A required privilege is not held by the client
Threads que você cria por padrão herdam seus privilégios; mas um programa pode ativar um privilégio desabilitado que lhe foi concedido usandoAdjustTokenPrivileges
:
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);
Alterando privilégios em um tokendiz:
AdjustTokenPrivileges
não é possível adicionar ou remover privilégiosdo token. Podehabilite apenas privilégios existentes que estão desabilitados no momentoou desabilitar privilégios existentes que estão atualmente habilitados
Então, por que esse privilégio está desabilitado por padrão? Para garantir que nenhum programa desligue o Windows acidentalmente. Os aplicativos devem solicitar isso explicitamente.
Existe um livro antigo, mas muito bom:https://www.amazon.com/Programming-Windows-Security-Keith-Brown/dp/0201604426/sobre todas essas coisas.
Responder2
É porque seu usuário pertence a um grupo que tem esse privilégio habilitado.
Para ver por si mesmo qual(is) grupo(s):
- Abra um prompt do PowerShell (ou comando) como Admin.
- Correr
secedit /export /areas USER_RIGHTS /cfg OUTFILE.CFG
. - Visualize o conteúdo de OutFile.cfg no Bloco de Notas ou similar e procure a
SeShutdownPrivilege
entrada. Você (deverá) ver alguns SIDs para usuários e/ou grupos que têm esse privilégio habilitado.
Portanto, tenho três SIDs curtos listados. SIDs curtos geralmente são contas/grupos no nível do computador. Por exemplo, um deles é S-1-5-32-545
.
Usando o PowerShell, podemos determinar qual conta/grupo o SID representa:
$objSID = New-Object System.Security.Principal.SecurityIdentifier ("S-1-5-32-545")
$objUser = $objSID.Translate([System.Security.Principal.NTAccount])
$objUser.Value
Isso retorna BUILTIN\Users
.
Como você é um usuário desse computador, você é automaticamente um membro desse grupo, o que significa que pode desligar o computador.
Os outros dois que tenho são S-1-5-32-544
, e S-1-5-32-551
. Estes são o BUILTIN\Administrators
grupo padrão e o BUILTIN\Backup Operators
grupo. Que se alinham com os grupos que você vê na secpol.msc
caixa de diálogo.