Criando um grupo dinâmico no Active Directory com usuários de uma UO


8

Gostaria de criar um grupo dinâmico com usuários de uma UO específica no meu Active Directory. Posso fazer isso perfeitamente usando a Lista de Distribuição Dinâmica do Exchange, mas é claro que os DDLs Ex são apenas para correio.

Existe alguma maneira de criar isso? Encontrei alguns guias usando o System Center para lidar com isso, mas o System Center não é uma opção.

Desde já, obrigado,

Respostas:


11

Não existe um grupo de segurança dinâmica no Active Directory, apenas grupos de distribuição dinâmica.

Para fazer isso, acho que a opção mais viável seria ter um script do Powershell determinando quem está na UO fornecida e atualizando o grupo de segurança de acordo, talvez assim:

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 Posso executar esse script periodicamente no meu Active Directory para garantir que meus grupos de anúncios estejam atualizados? Ou talvez, de alguma forma, se inscreva em algum sistema de eventos? Eu sou um desenvolvedor não um administrador, mas eu posso influenciar o administrador e meu gerente
MZN

Eu faria as remove primeiro, apenas para que ele não verifique novamente usuário objetos que verifiquei apenas (e acrescentou)
xXhRQ8sD2L7Z

4

Estou respondendo minha própria pergunta. Com as idéias do Mathias do PowerShell, eu encontrei isso na internet:

https://github.com/davegreen/shadowGroupSync

Recursos

  • Sincronize objetos de usuário ou computador de uma ou mais UOs para um único grupo.
  • Capacidade de filtrar objetos incluídos no grupo de sombra usando o Filtro do Active Directory do PowerShell.
  • Capacidade de escolher o tipo de grupo de sombra (Segurança / Distribuição).

O blog do autor contém informações adicionais sobre o design e os motivos da ferramenta.


1
Se Mathias foi quem te ajudou, você deve aceitar a resposta dele. Ele lhe deu uma visão!
Mzn


1

Também procurei uma maneira de criar grupos de segurança dinâmicos no Active Directory e cheguei à conclusão como Mathias. Minha solução não era tão elegante quanto a dele, eu uso um script do PowerShell agendado para remover todos os usuários dos grupos e preenchê-los com os usuários da UO. Além disso, assegurei-me de que os grupos de sub OUs fossem adicionados ao grupo de segurança das OUs pai onde ele coubesse.

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"

Não tenho certeza se isso aumenta bem em uma grande empresa, mas o script usa apenas alguns minutos em nossa empresa de 300 usuários.


Do ponto de vista prático, sua solução é boa (para algumas centenas de usuários). No entanto, adicionando todas as primeiras (e suprimindo avisos / erros para duplicatas) e removendo apenas não correspondências, você 1) minimiza o número de atualizações de atributos no objeto AD e 2) solução alternativa para o risco de alguém autenticar e perder uma Segurança Agrupe em seu token, caso eles fiquem online enquanto o script estiver em execução.
Mathias R. Jessen


0

À declaração deixada por outro membro. Se você não executar isso em um Controlador de Domínio, precisará fornecer uma entrada estática substituindo $ domainController ou poderá adicionar outra, seguida de $ DomainController e passar essas informações.

Para adicionar um usuário a um 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 remover um usuário, você pode fazer a mesma coisa.

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

Agora, para usar isso, você pode fazer isso ...

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

ou

Seria melhor ter uma UO de usuários desabilitados ou algo em que isso possa ocorrer ou se você alternar UOs como site ou grupo

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

Essa resposta não serve para nada e não agrega valor à pergunta. As funções são ineficientes e não fornecem valor inerente; ambas as funções 1. dobram a quantidade de chamadas a serem feitas, 2. Funcionam especificamente apenas se o CN do usuário for usado (limite a funcionalidade dos cmdlets nativos), 3. não seguem o padrão de nomeação Verb-Noun recomendado para as funções do PowerShell, e 4. a segunda função adiciona usuários a um grupo, em vez de removê-los. A resposta aceita há 6 anos é precisa, completa e funcional. Não vejo razão para que seja necessária uma resposta adicional.
Ponto

Seu fanático! Isso é que você tem apenas uma mente tacanha

Mais uma coisa. Eu tenho esse script exato na minha organização com mais de 5000 usuários e funciona muito bem. Você só precisa alimentar a função com as informações. Observe também que temos gatilhos executados em um DC de tarefas em que um evento disparado é executado quando um novo usuário é criado ou desativado. Por favor, pense fora da caixa ................

$ DomainController é indefinido. Sua função "RemoveUserFromGroup" usa o cmdlet "Add-ADGroupMember". Seu "Remover" (se o cmdlet Remove-ADGroupMember era realmente apenas um erro de digitação usado) funcionará apenas se o usuário não estiver no grupo. Também não faz referência nem remotamente à tarefa de obter usuários de uma UO especificada. Na melhor das hipóteses, é uma solução parcial de necessidade de trabalho - quando uma solução completa já foi enviada e aceita.
Ponto

Awe, eu entendo o que você estava falando. LOL - apenas copiei a parte superior e colei na parte inferior. Eu já o corrigi ... $ DomainController foi colocado lá para o caso de esse usuário não executar o script de um controlador de domínio. Novamente, o usuário e o grupo são fornecidos. Você pode executar um simples Get-ADUser -Filter *, se quiser, mas isso parece mundano ... Seria melhor apenas ler os logs de eventos do DC e puxar o novo usuário em vez de percorrer todos os usuários. Mas hey, há mais de uma maneira de esfolar um gato
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.