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

用于从一个OU检索PC成员资格的Powershell脚本,powershell,active-directory,ou,Powershell,Active Directory,Ou,首先,我没有接受过Powershell的正式培训,所以我编写的大部分代码都是经过改编的,或者相对简单。检索计算机的扩展属性或重新组织返回的列列表时遇到问题 在我的组织中,PC可以是我所知的本地OU的成员,也可以是我无权访问的企业OU。扫描一下我当地的OU团体并不能得到我想要的所有结果。我能够找到将这种逻辑应用于用户和组成员身份的答案,但似乎无法使其在PC上运行 Import-Module ActiveDirectory $OU = "OU=Computers,OU={ORG UNIT}" $Pa

首先,我没有接受过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,我希望输出文件是Group Name、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头的顺序,@{}指示PowerShell您正在使用哈希表。哈希表的默认行为是无序的。为了避免这种行为,您需要使用[ordered]属性创建哈希表,或者在创建对象时只使用[pscustomobject]类型加速器。新的Object命令本身并不能避免散列表的无序性。由于[PSCustomObject]速度更快,并且没有排序问题,因此最好只使用它来支持自定义对象的新对象

有关将新对象与哈希表一起使用的行为示例,请参见下文:

# 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

有关哈希表的更多信息,请参阅。

这太完美了,谢谢!谢谢你提供关于哈希表的更多信息!