Como posso obter uma visão geral de todos os usuários com um usuário específico no Windows?

0

Eu preciso verificar se apenas o grupo de administradores (sid: S-1-5-32-544) tem o privilégio de apropriar-se 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 eu já encontrei e experimentei é o seguinte comando:

secedit /export /areas USER_RIGHTS /cfg output.txt

A saída no arquivo parece bastante útil:

[Unicode]
Unicode=yes
[Privilege Rights]
SeNetworkLogonRight = *S-1-5-32-544
...
SeTakeOwnershipPrivilege = *S-1-5-32-544
...
[Version]
signature="$CHICAGO$"
Revision=1

Com este método acima eu teria que ler o arquivo no meu script Powershell, procurar o privilégio e apagar o arquivo depois.

Existe algum outro método para fazer isso no Powershell sem módulos externos ou executáveis?

Obrigado pelo seu fornecimento.

Felicidades

David

    
por dwettstein 05.09.2014 / 16:20

5 respostas

0

Existe outra maneira de usar o LsaEnumerateAccountsWithUserRight Função da API do Win32. Isso tem que ser codificado em C # ( PInvoke ) no seu script e a definição do código seria muito longo e confuso.

Evitaria o acima e incluiria 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()
        }
}
    
por 05.09.2014 / 20:05
0

Não é uma solução de PS pura, mas uma opção, no entanto. :)

Você pode usar o utilitário AccessChk da Microsoft ( baixe-o aqui ) em vez de SecEdit.

Ao contrário do SecEdit, o AccessChk envia saída para o stdout, para que você possa capturar facilmente sua saída em uma variável PS e, em seguida, verificar essa variável (sem 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"
}
    
por 05.09.2014 / 20:03
0

Promoção sem vergonha: confira o módulo Carbono (eu sou criador / mantenedor). Ele tem uma função Get-Privilege que retornará todos os privilégios de uma entidade.

    
por 05.09.2014 / 23:20
-1

Talvez este comando seja útil

Get-WmiObject -Class win32_userprofile
    
por 15.09.2014 / 18:55
-1

Aqui está a solução:

(Get-WmiObject -Namespace root\rsop\computer -Class RSOP_UserPrivilegeRight | Where-Object {$_.UserRight -eq "SeTakeOwnershipPrivilege"}).AccountList
    
por 18.04.2016 / 21:35