
Preciso verificar se apenas o grupo de administradores (sid: S-1-5-32-544) tem o privilégio de se apropriar de arquivos ou pastas (SeTakeOwnershipPrivilege).
Como posso obter uma visão geral de todos os usuários/grupos que possuem esse privilégio?
O que já encontrei e tentei é o seguinte comando:
secedit /export /areas USER_RIGHTS /cfg output.txt
A saída no arquivo parece bastante útil:
[Unicode]
Unicode = sim
[Direitos de privilégio]
SeNetworkLogonRight = *S-1-5-32-544
...
SeTakeOwnershipPrivilege = *S-1-5-32-544
...
[Versão]
assinatura = "$CHICAGO$"
Revisão=1
Com este método acima eu teria que ler o arquivo em meu script Powershell, procurar o privilégio e excluir o arquivo posteriormente.
Existe algum outro método para fazer isso no Powershell sem módulos externos ou executáveis?
Obrigado pelo seu fornecimento.
Saúde
Davi
Responder1
Existe outra maneira de usar oLsaEnumerateAccountsWithUserRightFunção API Win32. Isso deve ser codificado em C# (PInvoke) no seu script e a definição do código seria muito longa e confusa.
Eu evitaria o que foi dito acima e agruparia o executável. Por que reinventar a roda?
# Check this priviledge.
$privilege = 'SeDenyInteractiveLogonRight'
# Create temp file for executable output.
$tempFile = [System.IO.Path]::GetTempFileName()
# Run the executable and wait for it to finish.
Start-Process -FilePath secedit.exe -ArgumentList "/export /areas USER_RIGHTS /cfg $tempFile" -Wait -WindowStyle Hidden
# Run through lines in the output file.
Get-Content $tempFile -Encoding Unicode | Where-Object {
# Where the privilege is listed.
$_ -match $privilege } | ForEach-Object {
# Seperate the key and values.
$_.split('=')[1].split(',') | ForEach-Object {
# Ouput the user/SID values
$_.trim()
}
}
Responder2
Não é uma solução PS pura, mas mesmo assim é uma opção. :)
Você pode usar o utilitário AccessChk da Microsoft (baixe aqui) em vez de SecEdit.
Ao contrário do SecEdit, o AccessChk envia para o stdout, para que você possa facilmente capturar sua saída em uma variável PS e, em seguida, verificar essa variável (sem a necessidade de um arquivo intermediário).
Algo como:
$privToCheckFor = "SeTakeOwnershipPrivilege"
$groupPrivs = .\accesschk -a administrators *
if ((Out-String -InputObject $groupPrivs).IndexOf($privToCheckFor) -ge 0) {
Write-Host "Has Privilege"
} else {
Write-Host "Doesn't Have Privilege"
}
Responder3
Promoção sem vergonha: confira oMódulo de carbono(Eu sou o criador/mantenedor). Tem umObter privilégiofunção que retornará todos os privilégios de um principal.
Responder4
Aqui está a solução:
(Get-WmiObject -Namespace root\rsop\computer -Class RSOP_UserPrivilegeRight | Where-Object {$_.UserRight -eq "SeTakeOwnershipPrivilege"}).AccountList