Crear un grupo dinámico en Active Directory con usuarios de una unidad organizativa

8

Me gustaría crear un grupo dinámico con usuarios de una unidad organizativa específica en mi Active Directory. Puedo hacer esto perfectamente usando la lista de distribución dinámica de Exchange, pero, por supuesto, los DDL Ex solo son para correo.

¿Hay alguna forma de crear esto? Encontré algunas guías que usan System Center para manejar esto, pero System Center no es una opción.

Gracias por adelantado,

Vinícius Ferrão
fuente

Respuestas:

11

No existe un grupo de seguridad dinámica en Active Directory, solo grupos de distribución dinámica.

Para lograr esto, creo que la opción más viable sería tener un script de Powershell que determine quiénes están en la unidad organizativa dada y que actualice el grupo de seguridad en consecuencia, tal vez así:

Import-Module ActiveDirectory
$groupname = PseudoDynamicGroup
$users = Get-ADUser -Filter * -SearchBase "ou=desiredUsers,dc=domain,dc=tld"
foreach($user in $users)
{
  Add-ADGroupMember -Identity $groupname -Member $user.samaccountname -ErrorAction SilentlyContinue
}
$members = Get-ADGroupMember -Identity $groupname
foreach($member in $members)
{
  if($member.distinguishedname -notlike "*ou=desiredUsers,dc=domain,dc=tld*")
  {
    Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
  }
}
Mathias R. Jessen
fuente
+1 ¿Puedo ejecutar este script en mi Active Directory periódicamente para asegurarme de que mis grupos de AD estén actualizados? ¿O tal vez de alguna manera suscribirse a algún sistema de eventos? Soy un desarrollador, no un administrador, pero puedo influir en el administrador y mi gerente
Mzn
Primero haría las eliminaciones, solo para que no vuelva a comprobar los objetos de usuario que acabamos de verificar (y agregamos)
xXhRQ8sD2L7Z
4

Estoy respondiendo mi propia pregunta. Con las ideas de PowerShell de Mathias, he encontrado esto en Internet:

https://github.com/davegreen/shadowGroupSync

Caracteristicas

  • Sincronice los objetos de usuario o computadora de una o más unidades organizativas a un solo grupo.
  • Capacidad para filtrar objetos incluidos en el grupo de sombra mediante el filtro de Active Directory de PowerShell.
  • Posibilidad de elegir el tipo de grupo de sombra (Seguridad / Distribución).

El blog del autor contiene información adicional sobre el diseño y los motivos de la herramienta.

Vinícius Ferrão
fuente
1
Si Mathias fue quien te ayudó, entonces debes aceptar su respuesta. Él te da la idea!
Mzn
3

Esto se puede hacer con Adaxes. Técnicamente, actualizará dinámicamente la pertenencia al grupo una vez que los usuarios se actualicen / muevan. Aquí hay un ejemplo de cómo mantener automáticamente la pertenencia al grupo según el atributo del Departamento, pero es muy fácil modificarlo para que haga lo mismo según la unidad organizativa. http://www.adaxes.com/tutorials_AutomatingDailyTasks_AddUsersToGroupsByDepartment.htm

Anton Pozdnyakov
fuente
1

También busqué una forma de crear grupos de seguridad dinámicos en Active Directory, y llegué a la conclusión como Mathias. Mi solución no era tan elegante como la suya, utilizo un script de PowerShell programado para eliminar a todos los usuarios de los grupos y luego llenarlos con los usuarios en la unidad organizativa. Además, me aseguré de que los grupos de unidades organizativas secundarias se agregaran al grupo de seguridad de las unidades organizativas principales donde cabía.

import-module ActiveDirectory
Get-ADGroupMember OU_GroupName | % { Remove-ADGroupMember 'OU_GroupName' -Members $_ -Confirm:$false}
Get-ADUser -SearchBase 'OU=OUName,OU=ParentOUName,DC=DomainName,DC=TopDomainName' -Searchscope 1 -Filter * | % { Add-ADGroupMember 'OU_GroupName' -Members $_ }
Add-ADGroupMember -Identity "OU_ParentName" -Members "OU_ChildOneName", "OU_ChildTwoName", "OU_ChildThreeName"

No estoy seguro si esto escala bien en una gran compañía, pero el script solo usa unos minutos en nuestra compañía de 300 usuarios.

Espen Olsen
fuente
Desde un punto de vista práctico, su solución está bien (para unos pocos cientos de usuarios). Sin embargo, al agregar todo primero (y suprimir advertencias / errores para duplicados), y luego eliminar solo las no coincidencias, 1) minimiza el número de actualizaciones de atributos para el objeto AD y 2) soluciona el riesgo de que alguien se autentique y pierda un Security Agrupe en su token, si se conectan mientras se ejecuta su script.
Mathias R. Jessen
0

A la declaración dejada por otro miembro. Si no ejecuta esto desde un controlador de dominio, deberá proporcionar una entrada estática reemplazando $ domainController o puede agregar otra, seguida de $ DomainController y pasar esa información.

Para agregar un usuario a un grupo

Function AddUserToGroup($Group, $User, $DomainController)
{
 if(!(Get-ADGroupMember -Identity $group | ?{$_.name -eq $User}))
 {
  Add-ADGroupMember -Identity $group -Members $User -Server $DomainController
 }
 else
 {
  return  "The user: $User is already in the $group"
 }
}

Para eliminar un usuario, puede hacer lo mismo.

Function RemoveUserFromGroup($Group, $User, $DomainController)
{
 if((Get-ADGroupMember -Identity $group | ?{$_.name -eq $User}))
 {
  Remove-ADGroupMember -Identity $group -Members $User -Server $DomainController
 }
 else
 {
  return "The user: $User is not a member of $group"
 }
}

Ahora para usar esto puedes hacer esto ...

$Users = Get-Aduser -Filter *
Foreach($user in $users)
{
  AddUserToGroup "SomeGroup" $user.name "ServerName"  
}

o

Sería mejor tener una unidad organizativa de usuarios deshabilitados o algo donde esto pueda tener lugar o si cambia unidades organizativas como sitio o grupo

$Users = Get-Aduser -Filter * 
Foreach($user in $users)
{
  RemoveUserToGroup "SomeGroup" $user.name "ServerName"  
}

fuente
Esta respuesta no sirve para nada y no agrega ningún valor a la pregunta. Las funciones son ineficientes y no proporcionan ningún valor inherente; ambas funciones 1. duplican la cantidad de llamadas a realizar, 2. Específicamente solo funcionan si se usa el CN ​​del usuario (limitan la funcionalidad de cmdlets nativos), 3. no siguen el patrón de nomenclatura Verb-Noun recomendado de las funciones de PowerShell, y 4. la segunda función en realidad AGREGA usuarios a un grupo, en lugar de eliminarlos. La respuesta aceptada de hace 6 años es precisa, completa y funcional. No veo ninguna razón por la que se necesitara una respuesta adicional.
Semicolon
¡Zelote! Hace que seas de mente estrecha
Una cosa más. Tengo este script exacto en mi organización con más de 5000 usuarios y funciona bien. Solo necesita alimentar la función con la información. También tenga en cuenta que tenemos desencadenadores realizados en una tarea DC donde se ejecuta un evento desencadenado cuando se crea o deshabilita un nuevo usuario. Por favor, piense fuera de la caja ................
$ DomainController no está definido. La función "RemoveUserFromGroup" usa el cmdlet "Add-ADGroupMember". Su "Eliminar" (si el cmdlet Remove-ADGroupMember fue realmente solo un error tipográfico utilizado) solo funciona si el usuario no está en el grupo. Tampoco hace referencia ni remotamente a la tarea de obtener usuarios de una unidad organizativa específica. En el mejor de los casos, es una solución parcial de necesidad de trabajo, cuando ya se presentó y aceptó una solución completa.
Semicolon
Asombro, veo de qué estabas hablando. LOL: acabo de copiar la parte superior y pegarla en la parte inferior. Desde entonces lo he corregido ... $ DomainController se colocó allí en caso de que este usuario no ejecute el script desde un DC. Nuevamente, se proporciona el usuario y el grupo. Puede ejecutar un simple Get-ADUser -Filter * si lo desea, pero eso parece mundano ... Sería mejor simplemente leer los registros de eventos de DC y atraer al nuevo usuario en lugar de recorrer a cada usuario. Pero bueno, hay más de una forma de pelar un gato