A Política de Grupo diz que eu deveria tê-lo

A Política de Grupo diz que eu deveria tê-lo

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:

insira a descrição da imagem aqui

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

    • Configurações de segurança
    • Políticas Locais
    • Atribuição de direitos de usuário
    • Desligue o sistema

      insira a descrição da imagem aqui

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 isso SE_PRIVILEGE_REMOVEDé diferente de faltar SE_PRIVILEGE_ENABLEDou SE_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 chamadaInitiateSystemShutdownouExitWindowsEx:

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 ExitWindowsExsem 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 SeShutdownPrivilegeentrada. 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\Administratorsgrupo padrão e o BUILTIN\Backup Operatorsgrupo. Que se alinham com os grupos que você vê na secpol.msccaixa de diálogo.

informação relacionada