首先,我没有接受过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(或其他一些属性);但按此顺序。
答案 0 :(得分:1)
我做了一些修改,但这应该可以完成工作。
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]
类型加速器。单独的New-Object
命令不能避免哈希表的无序性。由于[PSCustomObject]
速度更快并且没有排序问题,因此最好将New-Object
用于自定义对象。
有关将New-Object
与哈希表配合使用的行为示例,请参见下文:
# 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
有关哈希表的更多信息,请参见About Hash Tables。