Powershell 脚本:循环/数组未检索所有 AD 获取命令信息:错误“无法出价参数身份”

Powershell 脚本:循环/数组未检索所有 AD 获取命令信息:错误“无法出价参数身份”

我有一个 powershell 脚本,它使用 get 命令循环并检索 AD 信息。目前,它正在检索帐户名称和专有名称的选定信息。但如果我添加另一个参数/属性(例如成员或全名),它就不会检索该信息。我想检索更多 aduser 信息和域名,我该如何解决这个问题:

    $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

答案1

以下是对正在发生的事情的更精确的解释:

这个错误意味着身份参数,这是获取 AD*命令,类型无效。一般来说,包含准确、完整的错误消息是个好主意,但在这种情况下,我看到只有一个命令具有身份范围,获取ADGroupMemeber,你提供$组作为身份。

问题是$组不是对象类型身份的参数获取 ADGroupMember可以接受。为什么?因为尽管身份属性可以接受 ADGroup 对象,并且获取AD组返回 ADGroup 对象数组,选择对象返回 PSCustomObjects 数组,其中包含与所选属性相对应的 NoteProperties。因此,通过管道输出获取AD组通过选择,您正在将 PSCustomObjects 数组分配给$团体,并且在每次迭代中foreach循环中你提供该数组的一个成员作为身份论点,因此出现错误。

这就是问题所在。解决方案取决于你想要实现什么,而这一点并不完全清楚。

您可以通过简单地| select [...]获取AD组就像 Tim Ferrill 的回答中所建议的那样,将第二行的语句添加到该$GroupArr += $group行。但是,我认为这不会给你想要的结果,原因有二:

  1. 您正在同一个 CSV 文件中合并不同对象类型的结果。获取AD组返回 ADGroup 对象,并且获取 ADGroupMembers返回 ADPrincipal 对象(可以表示用户、计算机或组对象)。因此,对于每个组,CSV 文件将有一行代表该组,后面跟着几行代表该组的每个成员。

    也许这就是你想要的,但我怀疑不是,因为这是一组在 CSV 文件中表示的奇怪数据,因为通常 CSV 文件不打算按顺序排列,并且数据中没有任何内容可以区分表示组的行和表示组成员的行。此外,如果您有任何嵌套组,您将有重复的条目,因为任何作为其他组成员的组都将作为一个组列出一次,并为其所属的每个组列出一次。

  2. Active Directory 或由以下对象返回的对象中均没有“GroupName”属性:获取 AD*命令。团队名字在每个 PSCustomObject 中返回的属性选择语句将是一个空的 ADPropertyValueCollection,它将在表格格式中显示为{}(空集合符号),并在 CSV 文件中显示为"Microsoft.ActiveDirectory.Management.ADPropertyValueCollection"

    我认为可以肯定的是,您不希望 CSV 文件中有一列包含每个条目的完全相同的无意义值。此外,从逻辑上讲,如果您已经有了 Name 列,那么在代表组的条目中再添加 GroupName 列对我来说毫无意义,因为对于这些条目,Name 将包含组的名称。

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

但是,这只是一个推论。如果你能更具体地说明你正在寻找哪种输出,我可以解释如何实现它。

答案2

需要更改两行。第一步是返回组对象,而不是仅返回某些字段(这就是您收到该错误的原因):

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

然后仅将您需要的字段添加到数组中(这将获取您最初检索的信息):

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

其余一切都应按原样运作。

相关内容