5

我收集有關Exchange環境的統計信息,並需要收集有關所有正在使用的DNS域的統計信息。如何將複雜的Powershell陣列序列化到磁盤以供第二個腳本處理?

這是一個漫長而密集的操作,需要很長時間。我想將這些值保存到磁盤,因此我可以在摘要上運行後處理器。

我應該如何更改我在下面寫的腳本,以便我可以運行後處理器?

$dict = @{} 
$AcceptedDomains = Get-AcceptedDomain | select domainname 
foreach($ad in $AcceptedDomains) 
{ 
    $tmp = $dict[$ad.DomainName] 
    if ($tmp -eq $null) 
    { 
     $obj1 = @{CountPrimary = 0; CountWindows =0; CountSecondary = 0; IsAcceptedDomain = 0; DNS_MX = ""; DNS_SRV= ""; SSL=""} 
     $dict.Add($ad.DomainName.ToString(), $obj1) 
    } 

    $dict[$ad.DomainName.ToString()].IsAcceptedDomain = 1 
} 



foreach($currentmb in get-mailbox -resultsize unlimited|select PrimarySMTPAddress, WindowsEmailAddress, EmailAddresses) 
{ 
    $domName = $currentmb.PrimarySmtpAddress.ToString().Split("@")[1].ToString(); 
    $tmp = $dict[ $domName] 
    if ($tmp -eq $null) 
    { 
     $obj1 = @{CountPrimary = 0; CountWindows =0; CountSecondary = 0; IsAcceptedDomain = 0; DNS_MX = ""; DNS_SRV= ""; SSL=""} 
     $dict.Add($domName, $obj1) 
    } 
    $dict[$domName].CountPrimary+= 1 



    $domName = $currentmb.WindowsEmailAddress.ToString().Split("@")[1].ToString(); 
    $tmp = $dict[ $domName] 
    if ($tmp -eq $null) 
    { 
     $obj1 = @{CountPrimary = 0; CountWindows =0; CountSecondary = 0; IsAcceptedDomain = 0; DNS_MX = ""; DNS_SRV= ""; SSL=""} 
     $dict.Add($domName, $obj1) 
    } 
    $dict[$domName].CountWindows += 1 



    $secondaries = New-Object System.Collections.ArrayList($null) 
    $currentMBSmtp = $currentMB.EmailAddresses | where {$_.PrefixString -eq "SMTP"} | select SMTPAddress 
    foreach($smtp1 in $currentMBSmtp) 
    { 
     $smtp1Domain =  $smtp1.SmtpAddress.ToString().Split("@")[1].ToString() 
     $secondaries.Add($smtp1Domain) 
    } 
    foreach($domName1 in $secondaries | select -unique) 
    { 
    $tmp = $dict[ $domName1] 
    if ($tmp -eq $null) 
    { 
      $obj1 = @{CountPrimary = 0; CountWindows =0; CountSecondary = 0; IsAcceptedDomain = 0; DNS_MX = ""; DNS_SRV= ""; SSL=""} 
      $dict.Add($domName1, $obj1) 
    } 
    $dict[$domName1].CountSecondary += 1 
    } 
} 

如果能夠從佔位符告訴,我打算看看MX記錄,SSL證書和位於每個DNS域的其他方面。

目的是獲取有關正在使用的域的足夠信息,以便每個域可以根據需要進行優先級排序。

當發送到屏幕的數組$dict看起來是這樣的:(域截斷隱私)

oup.com  {DNS_SRV, CountSecondary, CountWindows, IsAcceptedDomain, DNS_MX, SSL, CountPrimary} 
isorygroup... {DNS_SRV, CountSecondary, CountWindows, IsAcceptedDomain, DNS_MX, SSL, CountPrimary} 
ces.com  {DNS_SRV, CountSecondary, CountWindows, IsAcceptedDomain, DNS_MX, SSL, CountPrimary} 
nc.net  {DNS_SRV, CountSecondary, CountWindows, IsAcceptedDomain, DNS_MX, SSL, CountPrimary} 

單個對象看起來是這樣的:

[PS] C:\scripts>$dict["sol.com"] 

Name       Value 
----       ----- 
DNS_SRV 
CountSecondary     3 
CountWindows     0 
IsAcceptedDomain    0 
DNS_MX 
SSL 
CountPrimary     0 
+1

'Export-Clixml' /'Import-Clixml' – PetSerAl

+0

@PetSerAl - 非常感謝! – LamonteCristo

+0

請@PetSerAl將其作爲答案。 – JPBlanc

回答

4

您可以使用Export-CliXml序列化和將值寫入磁盤。 Import-CliXml將其反序列化並將其重新加入。

如果對象是嵌套的,您可能需要使用-Depth參數,我相信它默認爲2個級別。增加級別會大大增加序列化所需的時間;特別是如果你有循環引用。

如果要在內存中序列化/反序列化,可以使用[System.Management.Automation.PSSerializer]::Serialize()[System.Management.Automation.PSSerializer]::Deserialize()(這些由cmdlet內部使用,因此它具有相同的表示形式)。

+0

謝謝。當我寫信給主持人時,你有沒有關於如何讓$ dict更好的提示?我的層次結構是平坦的表格,但是我使用Dict + Object來添加更多列。可能有更好的方法。 – LamonteCristo

+0

@LamonteCristo你可以創建自己的對象('[PSObject]'),並將每個「列」添加爲一個屬性。 '新對象PSObject -Property @ {Key = Value; Key2 = Value2}'。散列表可以像那樣用於初始屬性。在創建對象後,可以使用Add-Member來添加其他屬性。考慮這個psobject是單行的;你會有這些數組。這將是進一步格式化和轉換方面最通用的。 – briantist