【问题标题】:At wits end with powershell add-adgroupmember以 powershell add-adgroupmember 告终
【发布时间】:2016-05-09 17:40:07
【问题描述】:

几个小时以来,我一直在尝试使用 Add-ADGroupmember 将用户添加到组中。我总是得到错误-

Add-ADGroupMember:无法验证参数“身份”上的参数。参数为空。为参数提供一个有效值,然后再次尝试运行该命令。”

这是我正在使用的脚本 -

import-module ActiveDirectory
import-csv y:\d1.csv -Delimiter ";" | Foreach-Object {add-adgroupmember -Identity $_.group -Members $_.name}    
group;name
"CN=example,OU=example,DC=example,DC=example,DC=example";"CN=example,OU=example,OU=example,DC=example,DC=example,DC=example"
"CN=example-AE,OU=example,DC=example,DC=example,DC=example";"CN=example,OU=example,OU=example,DC=example,DC=example,DC=example"

我有 2000 个用户要添加到大约 100 个组中,也许有更好的方法?我在这里缺少一些简单的东西吗?

【问题讨论】:

  • 还是不开心,有没有办法输出到txt文件?
  • 要解决这些类型的问题(读取文件和使用当前对象)而不是使用实际的 cmdlet,请尝试 Write-Host 并查看数据是否正确。从那里复制输出并对其进行测试,如果可行,您应该准备好完全运行该命令。
  • write-host不是用来写字符串到屏幕上的,可以输出当前的命令吗?
  • 是的,但我使用它来确保我在 PowerShell 中的循环正在获取我想要的数据并输出正确的字符串。它实际上是用于将输出写入控制台,但它对排除命令很有帮助。
  • 干杯,我正在检查正确的语法,我现在要试试。

标签: powershell active-directory


【解决方案1】:

有时,此类问题是由输入数据文件中的意外数据(或缺少)引起的。我认为Get-Content 的问题比Import-Csv 的问题更大,但是...

确保您没有从 CSV 传递空白数据(例如文件底部的空白行等)。您可以尝试通过 Where-Object 检查将 Import-Csv cmdlet 的输出通过管道传输,以确保只有有效数据才能进入 Foreach-Object 循环:

Import-Csv y:\d1.csv -Delimiter ";" | 
  Where-Object{-not [String]::IsNullOrEmpty($_.group)} |
    Foreach-Object {Add-ADGroupMember -Identity $_.group -Members $_.name}

显然您也可以对 Name 属性执行类似的检查。

【讨论】:

  • [string]::IsNullOrWhiteSpace() 可能更可取,尽管这并不重要。
【解决方案2】:

我会做一些故障排除 这是您的代码的长版本。并尝试 get-adgroup 和 get-aduser 将确保它有效,然后才能继续。

import-module ActiveDirectory
$csv = import-csv y:\d1.csv -Delimiter ";" 
Foreach-Object ($c in $csv ) {
get-adgroup $c.group
get-aduser $c.name

get-adgroup $c.group | add-adgroupmember Members $c.name
} 

您甚至可以尝试通过这样做将其限制在第一行

import-module ActiveDirectory
$csv = import-csv y:\d1.csv -Delimiter ";" 
$c = $csv[0]
get-adgroup $c.group
get-aduser $c.name
get-adgroup $c.group | add-adgroupmember Members $c.name

【讨论】:

  • 使用第一个脚本时出现错误-“在 \\zeus\Shares\Scripts\Dashboardcsv\mylittlecutelittle.ps1:3 char:20 + Foreach-Object ($c in $csv ) { + ~~ 表达式或语句中出现意外的标记。在 \\zeus\Shares\Scripts\Dashboardcsv\mylittlecutelittle.ps1:3 char:19 + Foreach-Object ($c in $csv ) { + ~ Missing closing ')'在表达式中。在 \\zeus\Shares\Scripts\Dashboardcsv\mylittlecutelittle.ps1:3 char:28 + Foreach-Object ($c in $csv )" 抱歉格式错误
  • 第二个脚本收到错误-“Get-ADGroup:无法验证参数'Identity'的参数。参数为空或参数集合的元素包含空值。在\\zeus\ Shares\Scripts\Dashboardcsv\mylittlecutelittle.ps1:4 char:13 + get-adgroup $c.group" 这肯定表明没有从 CSV 中提取任何内容。
  • 如果您的第一行不起作用,那么最好将该文件移动到本地。您至少必须能够运行 $csv = import-csv .\blah.csv -delimiter ";"如果您对此有疑问,那么我们就有问题。您还使用什么powershell版本?试试,$psversiontable
  • 当我运行这个时,我没有得到任何回报,我应该或不应该看到什么?我将尝试在本地磁盘上运行它,尽管它当前所在的 DC 我确实尝试在其上运行它以达到相同的效果。我正在运行 powershell 版本 5.0.10586.122
  • 我在前面添加了 write-host,它确实反馈了 csv 中的所有内容。
【解决方案3】:

如果您的 CSV 使用分号 ; 作为分隔符,那么您需要告诉 Import-Csv

import-csv y:\d1.csv -Delimiter ';'

【讨论】:

  • 我很抱歉,我在最新版本的脚本中有这个,但由于某种原因没有在这里复制。我认为由于专有名称有一堆逗号,我应该更改分隔符以确保安全。现在已将其编辑到 OP 中。
  • 我会将 CSV 读入一个变量。 $csv = import-csv Y:\d1.csv -delim ';' 然后你可以使用$csv.group$csv.name,这更容易阅读/关注。
猜你喜欢
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
相关资源
最近更新 更多