
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