我想從 AD 中獲取計算機串列,其中包含計算機所屬的組。到目前為止還算簡單:
Get-adcomputer -filter * -properties Memberof | Sort CanonicalName | select-object -Property Name, Memberof
作業正常,但問題是組(屬性的成員Memberof)未排序,并且物件與物件之間的排序不一致。
Name Memberof
---- --------
PC001 {CN=(A) Group3,OU=OU-Path,DC=domain,DC=local, CN=(A) Group1,OU=OU-Path,DC=domain,DC=local, CN=(A) Group4,OU=OU-Path,DC=domain,DC=local, CN=(A) Group2,OU=OU-Path,DC=domain,DC=local}
PC002 {CN=(A) Group4,OU=OU-Path,DC=domain,DC=local, CN=(A) Group3,OU=OU-Path,DC=domain,DC=local, CN=(A) Group2,OU=OU-Path,DC=domain,DC=local, CN=(A) Group3,OU=OU-Path,DC=domain,DC=local}
PC003 ...
我試圖根據我之前的問題使用-ExpandProperty MemberOf例如這樣的東西來整理事情:
Get-adcomputer -filter * -properties Memberof | Sort CanonicalName | select-object -Property Name -ExpandProperty MemberOf | Sort-Object -Property MemberOf
我并不感到驚訝,沒有奏效。這是可能的,還是我必須將 Name 和 MemberOf 讀出到單獨的變數中,然后再將它們組合起來(以及如何確保它們“對齊”)?什么是作業方法?
uj5u.com熱心網友回復:
我相信解決這個問題的唯一方法是完全構建一個新物件,但是除了在控制臺上顯示物件之外,我不認為這樣做有什么意義。如果這是為了匯出資料,那么這種方法毫無意義,因為它CanonicalName是一個string值并且MemberOf是一個array:
$computers = @(
[pscustomobject]@{
CanonicalName = 'somedomain.com/Computers/Computer2'
Name = 'Computer2'
MemberOf = @(
'CN=(A) Group3,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
'CN=(A) Group1,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
'CN=(A) Group4,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
'CN=(A) Group2,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
)
}
[pscustomobject]@{
CanonicalName = 'somedomain.com/Computers/Computer1'
Name = 'Computer1'
MemberOf = @(
'CN=(A) Group3,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
'CN=(A) Group1,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
'CN=(A) Group4,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
'CN=(A) Group2,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local'
)
}
)
$computers | Sort-Object CanonicalName | ForEach-Object {
$_ | Select-Object Name, @{
Name = 'MemberOf'
Expression = { $_.MemberOf | Sort-Object }
}
}
Name MemberOf
---- --------
Computer1 {CN=(A) Group1,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local, CN=(A) Group2,....
Computer2 {CN=(A) Group1,OU=OU-Path1,OU=OU-Path2,DC=domain,DC=local, CN=(A) Group2,....
如果這是為了將資料匯出到例如 CSV,這將是您應該采用的方法:
$computers | ForEach-Object {
foreach($group in $_.MemberOf)
{
$cn, $ou = $group -split '(?<!\\),',2
[pscustomobject]@{
CanonicalName = $_.CanonicalName
Name = $_.Name
MemberOf = $cn.Replace('CN=','')
OU = $ou
}
}
} | Sort-Object CanonicalName, MemberOf | Select-Object Name, MemberOf
Name MemberOf
---- --------
computer1 (A) Group1
computer1 (A) Group2
computer1 (A) Group3
computer1 (A) Group4
computer2 (A) Group1
computer2 (A) Group2
computer2 (A) Group3
computer2 (A) Group4
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/392523.html
