用伪数据加载Active Directory的最快方法?

时间:2018-12-17 17:36:16

标签: powershell active-directory

在准备测试时,我们需要加载最多包含40万名用户和100,000个组的Windows Server VM,以及它们之间的各种映射。

已编写了Powershell脚本来实现此目的,该脚本在Server 2012 R2 VM(4核,8GB RAM)上运行。但是,以脚本运行的速度来看,它似乎可能需要一个多月才能完成。

我们已经使用net命令和Add-AD命令尝试了该脚本,以查看速度是否有所提高。似乎没有。该脚本使用多个For循环来迭代创建用户,创建组并将某些用户编号添加到组编号中。

命令示例为:

#net users $userName mypassword /add
#New-ADUser -Name $userName -SamAccountName $userName -DisplayName $userName -AccountPassword mypassword -Enabled $true

and

net group $groupName $userName /add
#Add-ADGroupMember -Identity $groupName -Members $userName

关于以最快的方式加载大量新用户/组/映射的广告的任何建议吗?

谢谢

1 个答案:

答案 0 :(得分:6)

用于AD的PowerShell cmdlet很方便,但是效率 无效。

直接使用ADSI可能会更快,因为它可以让您更好地控制正在发生的事情。 PowerShell使用[ADSI]"LDAP://thepath"的快捷方式来创建对象(从技术上讲,它们是DirectoryEntry对象,但是此处的示例使用IADs方法)。

有创建用户here的说明,但是我可以总结一下:

[ADSI]$OU = "LDAP://OU=IT,OU=Departments,OU=Employees,DC=Globomantics,DC=Local"
$new = $OU.Create("user","CN=Ginger Snaps")
$new.put("samaccountname","gsnaps")
$new.setinfo()

#Account is created disabled, so we need to enable and set a password
#(the password can't be set until it's created)
$new.put("userAccountControl",544)
$new.setpassword("P@ssw0rd")
$new.setinfo()

对于要设置的其他任何属性,请使用$new.put()。您也可以通过这种方式创建组,只需在"group"方法中使用"user"而不是Create()

这仍然需要一段时间。网络连接对您的伤害最大。所以你必须:

  1. 尽可能地靠近DC(如果可以,请在DC上运行 ),并且
  2. 减少网络请求的数量

如果确实要在DC上运行此命令,则(如果域中有多个DC)请确保以您所在的DC为目标。您可以通过将DC名称插入LDAP://字符串中来做到这一点,如下所示:

"LDAP://dc1.domain.com/OU=IT,OU=Departments,OU=Employees,DC=Globomantics,DC=Local"

第2个数字受以下事实的限制,即您必须对每个新用户进行2个请求(一个创建,一个设置密码)。但是您可以执行其他操作来减少数量,例如首先创建所有用户并存储每个新用户的distinguishedName,您可以计算自己(而不是询问AD),因为它是{{1 }},您将传递给CN=user和OU。因此,对于上面的示例,新用户的DN为:

Create()

拥有所有这些成员后,即可创建组并一次性添加所有成员。例如:

CN=Ginger Snaps,OU=IT,OU=Departments,OU=Employees,DC=Globomantics,DC=Local

[ADSI]$OU = "LDAP://OU=IT,OU=Departments,OU=Employees,DC=Globomantics,DC=Local" $new = $OU.Create("group","CN=group1") $new.put("samaccountname","group1") $members = @("CN=Ginger Snaps,OU=IT,OU=Departments,OU=Employees,DC=Globomantics,DC=Local", ` "CN=Another User,OU=IT,OU=Departments,OU=Employees,DC=Globomantics,DC=Local") $new.put("member", $members) $new.setinfo() 是每个成员$members的数组。

这样,您将有一个网络请求创建一个已设置了成员的整个组,而不是一个网络请求每个成员。