【问题标题】:Fastest way to load Active Directory with dummy data?使用虚拟数据加载 Active Directory 的最快方法是什么?
【发布时间】:2018-12-17 17:36:15
【问题描述】:

在准备测试时,我们需要加载一个具有多达 400,000 个用户和 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

关于加载具有大量新用户/组/映射的广告的最快方式有什么建议吗?

谢谢

【问题讨论】:

  • 对于初学者:基准测试(部分)你的脚本。看看哪个部分需要很长时间才能完成。您提供的示例太少,无法给我任何真正的原因指示(因为您只列出了一些创建用户的命令)
  • 我的理解是 AD cmdlet 比 ADSI 的东西要慢一些……您是否尝试过用 ADSI 调用替换运行时间最长的 AD cmdlet?

标签: powershell active-directory


【解决方案1】:

用于 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() 用于您想要设置的任何其他属性。您也可以通过这种方式创建组,只需在 Create() 方法中使用 "group" 而不是 "user"

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

  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 询问),因为它是您的 CN=user传递给 Create() 加上 OU。所以对于上面的例子,新用户的DN是:

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 是每个成员的 distinguishedName 数组。

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

【讨论】:

    猜你喜欢
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2016-01-28
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多