0

我正在编写一个脚本来查找特定 OU 中机器上的本地管理员。我创建了两个函数来执行此任务,每个函数本身都可以正常工作,但是当我将两者结合起来时,我没有得到任何结果。有人知道我在这里做错了什么吗?

    Function GetCompList{
Get-ADObject -Filter { ObjectClass -eq "computer" } -SearchBase "OU=Resources,DC=Contoso,DC=LOCAL" `
| Select-Object Name
}

Function Admin_Groups{
foreach($i in GetCompList){
$adsi = [ADSI]"WinNT://$i"
$Object = $adsi.Children | ? {$_.SchemaClassName -eq 'user'} | % {
    New-Object -TypeName PSCustomObject -Property @{
        UserName = $_.Name -join ''
        Groups = ($_.Groups()  |Foreach-Object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}) -join ',' 
    }    
} 
$Object |? {$_.Groups -match "Administrators*"}

}
}

Admin_Groups
4

1 回答 1

1

您的GetCompList函数正在返回一个对象集合。当你运行一个函数时,你可能会得到这个:

Name
------
Comp1
Comp2
Comp3

在 的foreach循环中Admin_Groups,您将 的输出GetCompList用作基元数组 - 只是一个名称列表,而不是一堆对象。所以,你有两个选择:

  1. select-object name将in更改GetCompListselect-object -expandproperty Name以获取简单的名称数组
  2. 在中,将循环主体中的Admin_Groups每个引用更改为。由于您在字符串中使用它,因此这样做有点难看。$iforeach$i.Name

在这个特定的例子中,我的偏好是选项 #1,使该功能:

Function GetCompList{
    Get-ADObject -Filter { ObjectClass -eq "computer" } -SearchBase "OU=Resources,DC=Contoso,DC=LOCAL" | Select-Object -expandproperty Name
}

我还建议您重命名函数以匹配 PowerShell 的动词-名词约定,并使用get-verb.

Get-CompList
Get-AdminGroups

如果做不到这一点,至少要让你的函数名称保持一致——要么使用_分隔名称中的单词,要么不使用。不要混搭。

于 2013-11-13T15:31:43.813 回答