¿Cómo puedo obtener una descripción general de todos los usuarios con un usuario específico directamente en Windows?

¿Cómo puedo obtener una descripción general de todos los usuarios con un usuario específico directamente en Windows?

Necesito verificar que solo el grupo de administradores (sid: S-1-5-32-544) tenga el privilegio de tomar posesión de archivos o carpetas (SeTakeOwnershipPrivilege).

¿Cómo puedo obtener una descripción general de todos los usuarios/grupos que tienen este privilegio?

Lo que ya encontré y probé es el siguiente comando:

secedit /export /areas USER_RIGHTS /cfg output.txt

El resultado del archivo parece bastante útil:

[Unicode]
Unicode=yes
[Derechos de privilegio]
SeNetworkLogonRight = *S-1-5-32-544
...
SeTakeOwnershipPrivilege = *S-1-5-32-544
...
[Versión]
firma="$CHICAGO$"
Revisión=1

Con este método anterior, tendría que leer el archivo en mi script de Powershell, buscar el privilegio y luego eliminar el archivo.

¿Existe algún otro método para hacer esto en Powershell sin módulos o ejecutables externos?

Gracias por su suministro.

Salud

David

Respuesta1

Hay otra manera de usar elLsaEnumerateAccountsWithUserRightFunción API Win32. Esto tiene que estar codificado en C# (PInvocar) en su script y la definición del código sería muy larga y confusa.

Yo evitaría lo anterior y en su lugar envolvería el ejecutable. ¿Por qué reinventar la rueda?

# 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()
        }
}

Respuesta2

No es una solución puramente PS, pero al menos es una opción. :)

Puede utilizar la utilidad AccessChk de Microsoft (descarguelo aqui) en lugar de SecEdit.

A diferencia de SecEdit, AccessChk genera salida a la salida estándar, por lo que puede capturar fácilmente su salida en una variable PS y luego verificar esa variable (sin necesidad de un archivo intermedio).

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"
}

Respuesta3

Promoción descarada: echa un vistazo alMódulo de carbono(Soy el creador/mantenedor). Tiene unObtener privilegiofunción que devolverá todos los privilegios de un director.

Respuesta4

Aquí está la solución:

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

información relacionada