Powershell脚本:循环/arrays不回收所有AD获取命令信息:错误“无法出价参数标识”

我有一个PowerShell脚本,使用get命令循环和检索AD信息。 目前它检索所选信息的帐户名称和区分名称。 但是,如果我添加另一个参数/属性,例如成员或全名,它不会检索该信息。 如何通过我想要检索更多的用户信息和域名:

$GrpArr = @() $Groups = get-adgroup -filter '*' -SearchBase "DC=hp,DC=dlink,DC=com" -ErrorAction "Silentlycontinue"| select samaccountname, DistinguishedName, GroupName, Name foreach ($group in $groups) { $GrpArr += $group $members = get-adgroupmember $group | select samaccountName, DistinguishedName, GroupName, Name foreach ($member in $members) { $GrpArr += $member #$GrpArr += $domain } } $GrpArr | Export-csv -ErrorAction "Silentlycontinue" -Path C:\Output.csv -NoTypeInformation 

以下是关于发生的更精确的解释:

该错误意味着Identity参数( Get-AD *命令的第一个位置参数)具有无效types。 一般来说,包含完全准确的错误消息是一个好主意,但在这种情况下,我可以看到只有一个具有Identity参数的命令Get-ADGroupMemeber ,并且提供了$ group作为标识。

问题在于$ group不是Get-ADGroupMemberIdentity参数可以接受的对象types。 为什么? 因为尽pipeIdentity属性可以接受ADGroup对象,并且Get-ADGroup返回ADGroup对象的数组,但是Select-Object返回一个PSCustomObjects数组,其中包含与所选属性相对应的NoteProperties。 所以,通过将Get-ADGroup的输出通过select进行pipe道输出,您将为PSoCustomObjects数组分配$ Groups ,并且在foreach循环的每次迭代中,您都将提供该数组的一个成员作为Identity参数, 。

那就是问题所在。 解决scheme取决于你想要完成什么,这是不完全清楚的。

只需移动| select [...]即可解决错误 如Tim Ferrill的回答所示,从第二行的Get-ADGroup语句中select$GroupArr += $group行。 但是,我不认为这会给你想要的结果,原因有两个:

  1. 您将来自不同对象types的结果合并到同一个CSV文件中。 Get-ADGroup返回ADGroup对象, Get-ADGroupMembers返回ADPrincipal对象(可以表示用户,计算机或组对象)。 因此,对于每个组,CSV文件将具有代表该组的一行代码,该行代表该组中每个成员的行。

    也许这就是你想要的,但是我不怀疑,因为这是CSV文件中表示的一组奇怪的数据,因为通常CSV文件并不打算sorting,数据中也没有任何东西可以区分代表组的行和线代表组成员。 此外,如果您有任何嵌套组,则会有重复的条目,因为任何属于任何其他组的成员都将作为一个组列出一次,而对于其所属的每个组也会列出一次。

  2. 在Active Directory或Get-AD *命令返回的对象中没有“GroupName”属性。 由select语句返回的每个PSCustomObject中的GroupName属性的值将是一个空的ADPropertyValueCollection,它将以表格格式显示为{} (空集合符号),在CSV文件中显示为"Microsoft.ActiveDirectory.Management.ADPropertyValueCollection"

    我认为这是一个安全的假设,您不希望CSV文件具有包含每个条目完全相同的无意义值的列。 另外,从逻辑上讲,当你已经有一个Name列的时候,你希望在表示组的GroupName列中没有意义,因为对于那些条目,Name将包含组的名称。

如果我不得不猜测,我猜你想要的是一个CSV文件,其中有一行代表每个组成员,包括成员的sAMAccountName,distinguishedName和name属性的列,以及包含组名的GroupName列是(这意味着对于多个组的成员的安全主体,将会有多个条目,每个条目具有不同的GroupName)。

但是,这只是一个推论。 如果你可以更具体地说明你正在寻找什么types的输出,我可以解释如何实现这一点。

两行需要更改。 第一步是返回组对象而不是唯一的特定字段(这就是为什么你会得到这个错误):

  $Groups = get-adgroup -filter '*' -SearchBase "DC=hp,DC=dlink,DC=com" -ErrorAction "Silentlycontinue" 

然后添加只需要数组的字段(这会得到您最初检索的信息):

 $GrpArr += $group | select samaccountname, DistinguishedName, GroupName, Name 

其他一切应该按原样工作。