【问题标题】:How to fix cannot convert system.object[] error如何修复无法转换 system.object[] 错误
【发布时间】:2019-07-23 03:02:14
【问题描述】:

运行此脚本时收到以下错误:

Get-ADGroupMember:无法将“System.Object[]”转换为类型 参数所需的“Microsoft.ActiveDirectory.Management.ADGroup” '身份'。不支持指定的方法。

此外,用户从 Win7 组移动到 Win10 组,但取决于他们是否是 if 语句中其他组的成员,if 语句中的任何组都不会为任何用户移动。请帮忙。

仅供参考,用户列表文件在文本文件中包含 Active Directory 用户名,如下所示:

jsmith
ksmith
etc.

grouplist 文本文件包含如下 Active Directory 组:

Nitro7
Project7
Visio7
Zoom7
SnagIt7
OneNote7

代码:

Import-Module ActiveDirectory

$users = Get-Content -Path .\userlist.txt
$group = Get-Content -Path .\grouplist.txt
$members = Get-ADGroupMember -Identity $group -Recursive


foreach ($user in $users){
Remove-ADGroupMember -Identity "Win7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Win10" -Members $user -Confirm:$false -Verbose

If ($members.SamAccountName -contains $user) {
Remove-ADGroupMember -Identity "Nitro7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Nitro10" -Members $user -Confirm:$false -Verbose
}

If ($members.SamAccountName -contains $user) {
Remove-ADGroupMember -Identity "Project7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Project10" -Members $user -Confirm:$false -Verbose
}

If ($members.SamAccountName -contains $user) {
Remove-ADGroupMember -Identity "OneNote7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "OneNote10" -Members $user -Confirm:$false -Verbose
}

If ($members.SamAccountName -contains $user) {
Remove-ADGroupMember -Identity "Zoom7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Zoom10" -Members $user -Confirm:$false -Verbose
}

If ($members.SamAccountName -contains $user) {
Remove-ADGroupMember -Identity "SnagIt7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "SnagIt10" -Members $user -Confirm:$false -Verbose
}

If ($members.SamAccountName -contains $user) {
Remove-ADGroupMember -Identity "Visio7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Visio10" -Members $user -Confirm:$false -Verbose
}
}

【问题讨论】:

  • $members 是什么样子的?看起来 $members 应该类似于...$members = foreach ($g in $groups) {Get-ADGroupMember -Identity $group.someproperty}
  • 我不确定你的意思? $members 只是脚本顶部定义的一个变量。
  • 我认为m0lochwalker 是在询问 $Var 的内容结构是什么。你用一组集合来调用它的代码......文档说[-Identity] <ADGroup>......并且该参数值是一个组,而不是组集合
  • Lee,我没有正确使用 grouplist.txt 来收集组吗?
  • @Jeff - 要将您的消息发送给特定的人,请使用@ 和他们的名字,就像您这样做时出现的那样。 [grin] ///// 是的,正如m0lochwalker 指出的那样,您使用的 cmdlet 不正确 ...您使用了一个文档明确声明您的集合必须有一项。 m0lochwalker 发布的示例代码看起来在调整以适合您的数据源文件时可以工作。

标签: powershell active-directory


【解决方案1】:

Get-ADGroupMember-Identity 属性是a singleton, not an array

但是,-Identity 属性确实接受输入管道。所以,你也许可以这样做:

$members = $group | Get-ADGroupMember -Recursive

虽然,IMX,一些 AD 命令由于它们的年龄而有点不稳定。我希望您可能需要执行以下操作:

$members = foreach ($g in $group) { Get-ADGroupMember -Identity $g -Recursive }

但是,您脚本的其余部分逻辑有点混乱,所以我无法确定您打算做什么。

{snip}


根据您的 cmets,这就是我要做的。

首先,我会更改您的群组文件。而不是组的纯文本列表,我会将其设置为包含两列的 CSV 文件:旧组和新组。

所以,grouplist.csv 看起来像这样:

"OldGroupName","NewGroupName"
"Nitro7","Nitro10"
"OneNote7","OneNote10"
"Project7","Project10"
"SnagIt7","SnagIt10"
"Visio7","Visio10"
"Win7","Win10"
"Zoom7","Zoom10"

现在您已经为每个旧组和要将用户迁移到的组有了一个映射。

现在,我们这样做:

$users = Get-Content .\userlist.txt
$groups = Import-Csv .\grouplist.csv

foreach ($group in $groups) {
    $UsersToModify = Get-ADGroupMember $group.OldGroupName -Recursive | Where-Object SamAccountName -in $users
    Remove-ADGroupMember -Identity $group.OldGroupName -Members $UsersToModify -Confirm:$false -Verbose -WhatIf
    Add-ADGroupMember -Identity $group.NewGroupName -Members $UsersToModify -Confirm:$false -Verbose -WhatIf
}

[注意:删除-WhatIf 以实际执行操作。]

对于每个组,我们获取组成员列表,将其过滤为$users 中的用户名并将其保存到$UsersToModify。然后,我们将该用户列表传递给 Remove 和 Add 命令。我们只需要每组调用一次。

我知道你对 Win7 到 Win10 有一个特殊的例外,但我看不出脚本的逻辑真正需要在哪里改变以适应这种情况。如果您想始终将$users 中的所有用户添加到 Win10,您可以手动添加:

$UsersToAddtoWin10 = $users | Get-ADUser
Add-ADGroupMember -Identity Win10 -Members $UsersToAddtoWin10 -Confirm:$false -Verbose -WhatIf

【讨论】:

  • 当且仅当他们是“7”组的成员时,我只想从“7”组中删除用户并将其添加到新的“10”组中。例如,如果用户只是 Nitro7 的成员,我只希望将用户从 Nitro7 中删除并添加到 Nitro 10,而不是添加到任何其他“10”组。如果用户是 6 个“7”组中的 3 个组的成员,我只希望将他们从这 3 个“7”组中删除并添加到相应的“10”组中。我接近了吗?
  • 我也希望用户无论如何从 Win7 移动到 Win10,这就是为什么我没有将那部分放在 if 语句中。
  • 如果用户只是其中几个组的成员,我将如何删除“7”组并仅添加相应的“10”组?
【解决方案2】:
Import-Module ActiveDirectory

$users = Get-Content -Path .\userlist.txt

foreach ($user in $users){

Remove-ADGroupMember -Identity "View_Win7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "View_Win10" -Members $user -Confirm:$false -Verbose

[array]$grps=Get-ADUser $user -Property memberOf | Select -ExpandProperty memberOf | Get-ADGroup | Select Name

foreach($grp in $grps){

if($grp.Name -match "Nitro7") {
Remove-ADGroupMember -Identity "Nitro7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Nitro10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "Project7") {
Remove-ADGroupMember -Identity "Project7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Project10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "OneNote7") {
Remove-ADGroupMember -Identity "OneNote7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "OneNote10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "Zoom7") {
Remove-ADGroupMember -Identity "Zoom7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Zoom10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "SnagIt7") {
Remove-ADGroupMember -Identity "SnagIt7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "SnagIt10" -Members $user -Confirm:$false -Verbose
}

If ($grp.Name -match "Visio7") {
Remove-ADGroupMember -Identity "Visio7" -Members $user -Confirm:$false -Verbose
Add-ADGroupMember -Identity "Visio10" -Members $user -Confirm:$false -Verbose
}
}
}

【讨论】:

  • 我用这段代码解决了这个问题。有更简单的方法来完成同样的事情吗?
  • 是的,请查看我的回答。通过为每个用户获取 MemberOf 属性,您走上了正确的轨道,这就是我在回答中所做的。如果您的 $groups 列表仅包含您要从中删除的组,那么我的代码没有风险并且可以很好地工作。很高兴它正在工作。
  • 谢谢@m0lochwalker
  • 如果您对该脚本有任何疑问,请告诉我。
【解决方案3】:

考虑到您的 $user 和 $group 列表与您显示的完全一样,让我们​​看看这是否适合您...

#get your users...

$users = Get-Content -Path .\userlist.txt

#get your groups...

$groups = Get-Content -Path .\grouplist.txt

#for each user...

foreach ($user in $users) {

    #get their group memberships, expand the property...

    $memberOf = Get-ADUser -Identity $user -Properties MemberOf | Select -ExpandProperty memberof

    #for each membership found in $groups that also ends in '7'...

    foreach ($membership in ($memberOf | Where-Object {($_ -match ($groups -join "|")) -and ($_ -like '*7')})) {

        #remove the user from the matched group...

        Remove-ADGroupMember -Identity $membership -Members $user -Confirm:$false

        #add the user to a group with the same name, replacing 7 with 10...

        Add-ADGroupMember -Identity $membership.Replace("7","10") -Members $user -Confirm:$false

    }

}

重要

请注意,此 -match 运算符将返回 $groups 中包含的任何其他组也以 7 结尾。如果您有符合存储在 $groups 中的标准的其他组名,您将需要对 $memberOf 进行更多过滤> $membership 迭代。

此脚本还将 $membership(匹配组的 DistinguishedName)中字符“7”的每个实例替换为“10”,以便将 $user 添加到新组中。所以,请确保这不是问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 2020-08-04
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多