用于从一个 OU 检索 PC 成员资格的 Powershell 脚本

Powershell script to retrieve PC Membership from one OU

首先,我没有受过Powershell的正规培训,所以我写的大部分是改编的代码或者比较简单。我在检索机器的扩展属性或重新组织返回的列列表时遇到问题。

在我的组织中,PC 可以是我知道的本地 OU 的成员,也可以是我无权访问的企业 OU 的成员。扫描我的本地 OU 组不会为我提供我正在寻找的所有结果。我能够找到将此逻辑应用于用户和组成员资格的答案,但似乎无法使其适用于 PC。

Import-Module ActiveDirectory
$OU = "OU=Computers,OU={ORG UNIT}"
$Path = "C:\{FILE LOC}\AD-groupPClist_$(get-date -f yyyyMMdd_HHmm).csv"

$PC = ForEach ($P in (Get-ADComputer -Filter * -SearchBase $OU))
{
$Machine = Get-ADComputer $P -Properties MemberOf
$Groups = ForEach ($Group in ($Machine.MemberOf))
{
    (Get-ADGroup $Group).Name
}
$Groups = $Groups | Sort
ForEach ($Group in $Groups)
{
    New-Object PSObject -Property @{
    Group = $Group
    PCName= $Machine.Name
    }
}
}
$PC | Export-CSV $Path -NoTypeInformation

当我尝试添加 DNSHostName 列(例如)时,它显示为结果中的第一列,即使它列在第三列。在这种情况下,如果我添加 DNSHostName,我希望输出文件是组名、PCName、DNSHostName(或其他一些属性);但按照这个顺序。

我做了一些修改,但这应该可以完成。

Import-Module ActiveDirectory
$OU = "OU=Computers,OU={ORG UNIT}"
$Path = "C:\{FILE LOC}\AD-groupPClist_$(get-date -f yyyyMMdd_HHmm).csv"

$PC = ForEach ($P in (Get-ADComputer -Filter * -SearchBase $OU -Properties MemberOf)) {
    Foreach ($Group in $P.MemberOf) {
        [PSCustomObject]@{
            Group = (Get-ADGroup $Group).Name
            PCName = $P.Name
            DNSHostName = $P.DNSHostName
        }
    }
}
$PC | Sort-Object Group | Export-Csv $Path -NoTypeInformation

关于属性或 CSV headers 的顺序,@{} 指示 PowerShell 您正在使用散列 table。散列 table 的默认行为是无序的。要解决此问题,您需要使用 [ordered] 属性创建散列 table,或者在创建 object 时仅使用 [pscustomobject] 类型加速器。单独的 New-Object 命令无法避免散列 table 的无序性质。由于 [PSCustomObject] 速度更快并且没有排序问题,因此最好只使用它来支持自定义 object 的 New-Object

请参阅下面的使用 New-Object 和散列 table 的行为示例:

# Unordered output example

New-Object -TypeName psobject -Property `
     @{
       property3 = 'value3'
       property2 = 'value2'
       property1 = 'value1'
     }

property1 property2 property3
--------- --------- ---------
value1    value2    value3

# Example enforcing order

New-Object -TypeName psobject -Property `
     ([ordered]@{
       property3 = 'value3'
       property2 = 'value2'
       property1 = 'value1'
     })

property3 property2 property1
--------- --------- ---------
value3    value2    value1

有关哈希 table 的更多信息,请参阅 About Hash Tables