使用OU中的用户在Active Directory中创建动态组


8

我想与来自Active Directory中特定OU的用户创建一个动态组。我可以使用Exchange动态分发列表完美地做到这一点,但是,当然,Ex DDL仅用于邮件。

有什么办法可以创建这个吗?我找到了一些使用System Center来处理此问题的指南,但是System Center不是一个选择。

提前致谢,

Answers:


11

在Active Directory中没有动态安全组,只有动态通讯组。

为此,我认为最可行的选择是让Powershell脚本确定谁在给定的OU中并相应地更新安全组,也许像这样:

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是否可以在Active Directory上定期运行这样的脚本,以确保我的AD组是最新的?或者也许以某种方式订阅了一些事件系统?我不是开发商,而是管理员,但我可以影响管理员和我的经理
Mzn 2014年

我会先执行删除操作,只是这样它不会重新检查我们刚刚检查(并添加)的用户对象
xXhRQ8sD2L7Z

4

我在回答我自己的问题。借助Mathias的PowerShell思想,我已经在互联网上找到了这一点:

https://github.com/davegreen/shadowGroupSync

特征

  • 将用户或计算机对象从一个或多个OU同步到单个组。
  • 使用PowerShell Active Directory筛选器筛选影子组中包含的对象的能力。
  • 能够选择影子组类型(安全性/分发)。

作者的博客包含了有关设计和动机为工具的其他信息。


1
如果Mathias是帮助您的人,那么您应该接受他的回答。他给你洞察力!
Mzn 2014年


1

我还寻找了一种在Active Directory中创建动态安全组的方法,并得出了Mathias的结论。我的解决方案不如他的优雅,我使用计划的powershell脚本从组中删除所有用户,然后在OU中填充用户。另外,我确保将子OU组添加到了适合的父OU安全组中。

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"

不知道这在大型公司中能否很好地扩展,但是脚本在我们的300个用户公司中仅使用了几分钟。


从实际角度出发,您的解决方案很好(对于几百个用户)。但是,通过首先添加所有内容(并消除重复项的警告/错误),然后仅删除不匹配项,您可以1)最小化AD对象的属性更新数量,并且2)解决了有人进行身份验证和缺少安全性的风险如果您的脚本正在运行时它们碰巧联机,请按其令牌分组。
Mathias R. Jessen


0

对另一位成员留下的声明。如果您不是从域控制器运行此程序,则需要通过替换$ domainController提供一个静态条目,或者可以添加另一个,然后添加$ DomainController并传递该信息。

要将用户添加到组

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

要删除用户,您可以执行相同的操作。

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

现在要使用此功能,您可以执行此操作...

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

要么

最好有一个禁用的用户OU或可能发生这种情况的地方,或者如果您切换OU的站点或组等

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

这种回答毫无用处,根本没有增加问题的价值。功能效率低下,没有内在价值;这两个功能1.进行的呼叫数量增加一倍; 2。仅在使用用户CN的情况下才有效(限制本机cmdlet功能); 3。不遵循PowerShell函数的建议的Verb-Noun命名模式, 4.第二个功能实际上将用户添加到一个组中,而不是将其删除。6年前公认的答案是准确,完整和实用的。我认为没有理由需要任何其他答案。
分号

你这个狂热者!它确实使您头脑狭窄

还有一件事。我的组织中有超过5000个用户使用了这个确切的脚本,并且效果很好。您只需要向函数提供信息即可。还要注意,我们在任务DC上完成了触发器,在任务DC中,当创建或禁用新用户时,它将触发一个触发事件。请在框外思考……

$ DomainController未定义。您的“ RemoveUserFromGroup”函数使用“ Add-ADGroupMember” cmdlet。仅当用户不在组中时,您的“删除”(如果Remove-ADGroupMember cmdlet实际上只是一个错字)。您也没有远程引用从指定的OU获取用户的任务。充其量,这是一个按需工作的局部解决方案,即已经提交并接受了完整的解决方案。
分号

敬畏,我明白您在说什么。大声笑-我只是复制顶部并将其粘贴到底部。我已经纠正了它... $ DomainController被放在那里,以防万一该用户不从DC运行脚本。同样,提供了用户和组。如果需要,您可以运行一个简单的Get-ADUser -Filter *,但这似乎很平常...最好只读取DC事件日志并拉出新用户,而不要遍历每个用户。但是,嘿,有多种方法可以给猫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.