Pruebe el permiso de lectura de GPO con PowerShell (MS16-072 – KB3159398)
El pasado martes de parches, Microsoft lanzó el boletín de seguridad MS16-072. Esta actualización cambia la forma en que se descargan las políticas de grupo en una computadora, lo que podría provocar que los GPO no se apliquen.
Un síntoma común de esto es que GPO ya no asigna sus unidades a los usuarios.
Para citar el artículo KB3159398:
Este problema puede ocurrir si al objeto de política de grupo le faltan permisos de lectura para el grupo de usuarios autenticados o si está utilizando filtrado de seguridad y le faltan permisos de lectura para el grupo de computadoras del dominio.
Las políticas de grupo que no funcionan pueden ser un gran problema, pero no temas, estas son, por supuesto, una solución. Una vez más citando el artículo de KB:
Para resolver este problema, utilice la Consola de administración de políticas de grupo (GPMC.MSC) y siga uno de los siguientes pasos:
- Agregue el grupo Usuarios autenticados con permisos de lectura en el objeto de política de grupo (GPO).
- Si está utilizando filtrado de seguridad, agregue el grupo Computadoras del dominio con permiso de lectura.
-“¿Pero qué pasa si tengo cientos de GPO? ¡Eso podría llevarme todo el día! "
-“¡No si usas PowerShell! "
Obtener permisos en un GPO con PowerShell
En primer lugar, necesitamos obtener una lista de todos los GPO de nuestro dominio. Para hacer esto necesitamos el módulo GroupPolicy que viene con las herramientas RSAT para Políticas de Grupo. Me aseguro de tener el módulo ejecutando el siguiente comando:
Get-Module -Name GroupPolicy -ListAvailableAhora puedo enumerar todos los GPO del dominio con el comando Get-GPO y el parámetro -Todos.
Para obtener los permisos de un GPO utilizo el comando Get-GPPermission con los parámetros Id (Id del GPO), TargetType (obtener permisos para un usuario, computadora o grupo) y TargetName (nombre del principal para obtener permisos). En este escenario, quiero asegurarme de que el grupo Usuarios autenticados tenga acceso de lectura a todos mis GPO, por lo que ese será mi objetivo y quiero obtener permisos de todos los GPO, por lo que tendré que recorrer todos los GPO que ejecutan Get-GPPermission. una vez por GPO.
Import-Module -Name GroupPolicy
# Get all GPOs
$GPOList = Get-GPO -All
$GroupName = 'Authenticated Users'
# Loop
foreach($GPO in $GPOList)
{
Get-GPPermission -Guid $GPO.Id -TargetType Group -TargetName $GroupName
}
Esto me daría permisos para usuarios autenticados en todos los GPO y en algunas ocasiones podría recibir un error que indique que el GPO no tiene el principio de seguridad que solicité, lo que significa que los usuarios autenticados no tienen acceso al GPO. ¡Ajá! Esto es lo que estoy buscando ¿no?
Si incluyo mi comando Get-GPPermission en un bloque Try y agrego -ErrorAction Stop para que todos los errores terminen y sean detectables, tengo un buen comienzo.
Una vez que tenga los permisos, quiero asegurarme de que los usuarios autenticados realmente tengan derechos de lectura o de aplicación (Aplicar también implica lectura de acuerdo con la documentación en MSDN).
Si el comando Get-GPPermission arroja un error o los permisos no contienen Leer o Aplicar, querremos asegurarnos de que el GPO tenga configurados los permisos correctos para devolver el objeto GPO.
Esto resultó en un código parecido a este:
$GPOList = Get-GPO -All
$VerbosePreference = 'Continue'
$GroupName = 'Authenticated Users'
$InvalidGPOList = foreach($GPO in $GPOList)
{
Try
{
$GPPermission = Get-GPPermission -Guid $GPO.Id -TargetType Group -TargetName $GroupName -ErrorAction Stop
if(
$GPPermission.Permission.HasFlag([Microsoft.GroupPolicy.GPPermissionType]::GpoRead)
)
{
$Message = 'GPO: [{0}] is OK!' -f $GPO.DisplayName
}
else
{
$Message = 'No read access found group {0} in GPO: [{1}]' -f $GroupName, $GPO.DisplayName
$GPO
}
}
Catch
{
if($_.FullyQualifiedErrorId -like 'NoSecurityGroupFoundInGpoWithId*')
{
$GPO
$Message = 'No access found group {0} in GPO: [{1}]' -f $GroupName, $GPO.DisplayName
}
else
{
throw
}
}
Finally
{
Write-Verbose -Message $Message
}
}
Write-Output -InputObject $InvalidGPOList
Ahora me doy cuenta de que esto está lejos de ser perfecto, me dará un falso positivo en todos los GPO donde los usuarios autenticados tienen permisos personalizados, pero me dará una lista de GPO con un problema potencial.
Podría hacer esto mucho mejor usando el módulo ActiveDirectory y Get-Acl para obtener la ACL real del GPO, verificar si hay más de un grupo (es posible que desee darle acceso al grupo Todas las computadoras) e incluso usar Set- GPPermission para modificar automáticamente los permisos en cualquier GPO defectuoso. Si haces algo de esto, escribe una publicación de blog sobre cómo te fue y ¡déjame tomar ahora!