我正在为客户编写一个 PowerShell 脚本,以便在服务器退役之前从服务器中提取信息。我不得不跳过几个环节,因为他们有 2008 甚至一些 2003 服务器,它们并不总是支持相同的 Get-CimInstance 查询,但在大多数情况下它按预期工作。但是,我还无法修复的一个部分是拉出所有本地团体及其成员的列表,如下所示:
$localGroups = Invoke-Command -ScriptBlock {
[ADSI]$S = "WinNT://$($env:computername)"
$S.children.Where({$_.class -eq 'group'}) |
Select @{Name="Name";Expression={$_.name.value}},
@{Name="Members";Expression={
[ADSI]$group = "$($_.Parent)/$($_.Name),group"
$members = $Group.psbase.Invoke("Members")
($members | ForEach-Object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -join ";"
}
}
} -ComputerName $sPC | Select PSComputername,Name,Members
这在 Server 2012 及更高版本上运行良好,但在 2008 及更低版本上失败。具体错误状态:
方法调用失败,因为 [System.DirectoryServices.DirectoryEntries] 不包含名为“Where”的方法
所以操作系统不喜欢 $S.Children.Where() 调用。只是好奇是否有人知道另一种格式化它以供 2008 年及更早版本使用的方法。我可能会走旧的 WMI 呼叫路线,但这需要很长时间才能完成。