Como listar os privilégios do Windows para qualquer usuário

6

Estou tentando escrever um script para listar os privilégios (por exemplo, SeShutDownPrivilege etc) de todas as contas de usuário. Eu preferiria que meu script fosse executado como um usuário padrão, mas posso executá-lo como uma conta de administrador, se necessário. Aqui estão as abordagens que tentei até agora:

  • usando tokensz (de link ): funciona ( tokensz /compute_tokensize /dump_groups ) para o usuário atualmente logado. Mas quando logado como administrador de domínio, ao tentar outro usuário ( tokensz /compute_tokensize /dump_groups /user:[another.user] ), recebo o erro SEC_E_LOGON_DENIED

  • whoami /all funciona, mas apenas para o usuário atualmente conectado

  • ntrights.exe parece não conseguir listar privilégios, apenas adicionar e remover.

  • secedit /export /areas USER_RIGHTS /cfg out.txt : lista todos os privilégios e os SIDs que têm esse privilégio, mas essa lista aparece incompleta; a saída de tokensz mostra um usuário John.Smith com SeShutdownPrivilege , mas a saída de secedit para SeShutdownPrivilege lista os grupos com os quais John.Smith não é membro.

Eu posso usar executáveis portáveis (por exemplo, tokensz.exe , ntrights.exe ) e utilitários internos, mas não serão capazes de instalar aplicativos ou extensões

    
por A G 13.04.2016 / 15:41

3 respostas

2

Você pode usar o AccessChk para realizar essa tarefa.

Accesschk “domain\user” -a * listará todas as permissões de um determinado usuário do domínio.

Você pode chamar esse programa em um script do PowerShell, concatenar os resultados em um arquivo de texto e filtrar apenas as permissões que deseja conhecer.

    
por 13.04.2016 / 17:13
3

Para quem procura um script do PowerShell, isso deve ser feito:

gwmi Win32_UserProfile | foreach-object {
 $sid = New-Object System.Security.Principal.SecurityIdentifier($_.SID)
 $user = $sid.Translate([System.Security.Principal.NTAccount])
 $username = $user.Value
 $username
 $chkCmd = "accesschk """ + $username + """ -a * -q"
 iex $chkCmd
 ""
}

Ele obtém a lista de usuários que têm um perfil na máquina local , determina seus nomes a partir do SID e invoca accesschk - como recomendado pela Ramhound - neles. O registro de cada usuário começa com o nome de usuário em DOMAIN\user format, contém cada direito em uma linha e termina com uma linha em branco. (SID translation courtesy of este artigo .) Você pode despejar suas coisas em um arquivo com o redirecionamento operador, > .

Uma ressalva do AccessChk é que parece produzir uma lista vazia para usuários de domínio que não têm direitos de administrador local. Portanto, esta versão que produz as informações acima para cada usuário conhecido no domínio e na máquina é um pouco ruim, mas pode se tornar útil com uma versão futura da ferramenta:

gwmi Win32_UserAccount | foreach-object {
 $username = $_.Caption
 $username
 $chkCmd = "accesschk """ + $username + """ -a * -q"
 iex $chkCmd
 ""
}

Se você está se perguntando do que o secedit está falando, é só pegar a lista de entidades (no formulário SID) para as quais os direitos foram atribuídos na atribuição de direitos de usuário (ver secpol.msc ). Portanto, você geralmente verá os SIDs para grupos como Usuários ou Administradores, em vez de pessoas específicas.

    
por 13.04.2016 / 19:15
1

Este script pode ajudá-lo. Ele oferece as seguintes funções, todas usando o PowerShell puro:

  • Grant-UserRight
  • Revoke-UserRight
  • Get-UserRightsGrantedToAccount
  • Get-AccountsWithUserRight
  • Grant-TokenPrivilege
  • Revoke-TokenPrivilege
por 19.09.2017 / 17:05