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,

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

+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.


1
Si Mathias fue quien te ayudó, entonces debes aceptar su respuesta. Él te da la idea!
Mzn


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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.