【问题标题】:Add multiple users to multiple groups from one import csv从一个导入 csv 将多个用户添加到多个组
【发布时间】:2013-05-20 14:19:20
【问题描述】:

我有一个包含 2 列的 csv,一列是 AD 组名称,一列是用户帐户名称。我正在尝试读取 csv 并将用户导入到相应的组中。

到目前为止,这是我必须要做的。它说两个参数(身份,成员)都是空的,这没有任何意义,因为正确指定了标题。

import-module activedirectory
$list = import-csv "C:\Scripts\Import Bulk Users into bulk groups\bulkgroups3.csv"

Foreach($user in $list){       
    add-adgroupmember -identity $_.Group -member $_.Accountname
}

这是 csv 文件中的内容

Group             Accountname 
group1            user1 
group1            user2 
group1            user3 
group2            user4 
group2            user5 
group3            user6 
group3            user7 
group3            user8 
group4            user9 
group5            user10 

编辑命令和错误

这是我的脚本,我收到的错误和 csv。

Import-Csv "C:\Scripts\Import Bulk Users into bulk groups\bulkgroups.csv" | 
ForEach { get-aduser $_.Accountname | add-adgroupmember $_.Group}

【问题讨论】:

  • 您在 foreach 循环中专门为 $user 调用了当前对象,因此请查看 EBGreen 的答案。此外,对于未来的问题。如果您包含 CSV 文件的示例,那就太好了,这样我们就知道了。您使用的是什么分隔符。
  • 我尝试添加 csv,但我没有看到插入附件的选项。下面的布局是我在 CSV 文件中的所有内容,它是 2 列。我不知道我是否知道分隔符是什么。这是csv中对象之间的分隔吗?在那种情况下,它只是 |在每一行。
  • 是的,它是分隔符。在记事本中打开 csv 文件以查看其内容和分隔符。那么你可以包括它而不是上面的那个:) 现在不需要,只是一个小费。 Excel(或类似软件)按行显示,但 CSV 是纯文本文件,行为行,列由分隔符分隔(通常为 ,;

标签: powershell import active-directory bulk active-directory-group


【解决方案1】:

改变这个:

add-adgroupmember -identity $_.Group -member $_.Accountname

到这里:

add-adgroupmember -identity $user.Group -member (Get-ADUser $user.Accountname)

【讨论】:

  • 感谢您的快速回复。我进行了更改,看起来它正在从 csv 中提取正确的信息,但现在我得到“在:dc=domain,dc=com 下找不到具有身份的对象”。这是这个问题的另一部分。如果我为单个用户运行命令 get-aduser 或 add-adgroupmember,它会找到广告对象并且工作正常,但如果我添加 foreach 或 foreach-object,它不再对 AD 中的用户/对象进行罚款,我正在尝试了解为什么会这样。使用foreach时需要指定搜索范围吗?
  • 我是个笨蛋。我在所有帐户名之后都有一个空格。叹息。这可以解释为什么 get-qaduser 有效,因为它使用通配符,除非您指定 -samaccountname。所以你的脚本没有错。这都是我的错,我再次非常感谢你的帮助。如果你不介意的话,我确实有一个更简单的问题。指定帐户时 get-aduser 是否使用通配符?我的域中有不明确的帐户,例如 c42q、c42q1234。我是否需要向 get-aduser 添加任何内容以确保它只将 c42q 添加到组中?
  • 默认不使用通配符。要使用通配符,您必须明确使用 -Filter 块
  • 谢谢!你们真棒。再次感谢您的帮助。
【解决方案2】:

@EBGreen 已回答您的代码有什么问题。只是在这里想出一个替代方案。您可以尝试同时添加组的所有成员,而不是为每个成员运行一次命令。 Member 参数支持数组,试试这个:

Import-Csv "C:\Scripts\Import Bulk Users into bulk groups\bulkgroups3.csv" | Group-Object Group | % {
    #Foreach Group, get ADUser object for users and add members
    $users = $_.Group | % { Get-ADUser $_.Accountname }
    Add-ADGroupMember -Identity $_.Name -Member $users
}

编辑我已经在 2012 DC 上成功测试了这个,在 test.csv 中有以下内容(值代表现有的组名和现有的 samaccountname/用户名):

Group,Accountname
"Mytestgroup","kim_akers"
"Mytestgroup","user1"

EDIT2 更深层次的 OU 应该没有任何问题。我用一个 7 层深的 OU 进行了测试,它没有问题。如果您在一个 OU 中拥有所有用户(或找到包含所有子 OU 的最近 OU),请查看此脚本是否有帮助。请记住在-Searchbase 参数中将DN 替换为“base OU”。

Import-Csv "C:\Scripts\Import Bulk Users into bulk groups\bulkgroups3.csv" | Group-Object Group | % {
    #Foreach Group, get ADUser object for users and add members
    $users = $_.Group | % { Get-ADUser -Searchbase "OU=mybaseou,OU=test,OU=users,OU=contoso,DC=Contoso,DC=com" -Filter { samaccountname -eq $_.Accountname } }
    Add-ADGroupMember -Identity $_.Name -Member $users
}

【讨论】:

  • 查看更新的答案。另外,请在提供错误图片时提供脚本副本。前任。您说您之前从我的脚本中收到了错误,当时您实际上是在使用非功能性管道命令。因此,如果我有机会帮助您,我将始终需要脚本和异常(您可以将文本复制到代码块而不是图片中)。 ;-) 使用代码块而不是图片也有助于覆盖敏感信息,正如我在图片中看到的那样,您的 netbios 域名是“ifb”,这限制了潜在的域名,呵呵。
  • 但是请注意,如果作为参数传递给 -Members 参数的集合有太多成员,这显然会中断:stackoverflow.com/questions/21226365/…
  • 不是因为它的成员太多。这是因为它试图在一次运行中添加整个集合。当您尝试添加已存在的用户时,cmdlet 会中断/取消,因此一旦它检测到集合中已经是组成员的用户,它就会中止整个操作(= 未添加用户)。如您所见,解决方案是为集合中的每个用户运行一次命令。
  • 这就是我的意思。我并不是说 AD 对组内成员数量的限制;如果是这样的话,我一次添加一个成员的解决方案就没有意义了。事实上,一个广告组可以拥有数百万的成员。我的意思是对 collection 或作为 Add-ADGroupMember 可以一次处理的参数传递的数组中的成员数量进行限制。
  • 不,集合参数的大小没有限制。这将发生在 1、2 甚至 1000 个成员的集合中。问题是当你传递一个像$users 这样的集合时,它会同时添加它们,所以如果集合中的每个成员都不是完美的,它会全部取消。如果其中至少有一个成员已经是成员,即使集合中有 2 个成员也会发生这种情况。如果您/我在运行 ad-adgroupmember -members $users 之前从 $users 中删除了所有现有成员,您可以毫无问题地添加数千个成员。
猜你喜欢
  • 1970-01-01
  • 2014-02-09
  • 1970-01-01
  • 2023-01-07
  • 2023-02-01
  • 1970-01-01
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多