5

Zbieram statystyki dotyczące środowiska Exchange i muszę zbierać statystyki dotyczące wszystkich używanych domen DNS.W jaki sposób można przekształcić złożoną tablicę Powershell na dysk w celu przetworzenia przez drugi skrypt?

Jest to długa i intensywna operacja, która może zająć dużo czasu. Chcę zachować te wartości na dysku, więc mogę uruchomić postprocesor w podsumowaniu.

Jak zmienić skrypt, który napisałem poniżej, aby móc uruchomić post-procesor?

$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 
    } 
} 

Jeśli można powiedzieć od zastępcze, zamierzam patrzeć na rekordy MX, CERT SSL i innych aspektów każdej domeny DNS znajduje.

Celem jest uzyskanie wystarczających informacji o używanych domenach, aby w razie potrzeby można było nadać priorytet każdej domenie.

Tablica $dict gdy wysłany na ekran wygląda następująco: (Domeny obcięty do prywatności)

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} 

pojedynczy obiekt wygląda tak:

[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 - Niesamowite dzięki! – LamonteCristo

+0

Proszę @PetSerAl umieścić go jako odpowiedź. – JPBlanc

Odpowiedz

4

Można użyć Export-CliXml do serializacji i zapisz wartości na dysku. Import-CliXml w celu deserializacji i przywrócenia.

Może być konieczne użycie parametru -Depth, jeśli obiekty są zagnieżdżone, domyślnie są to 2 poziomy. Zwiększenie poziomów może znacznie zwiększyć czas potrzebny na serializację; zwłaszcza jeśli masz odwołania kołowe.

Jeśli chcesz serializować/deserializować w pamięci, możesz użyć [System.Management.Automation.PSSerializer]::Serialize() i [System.Management.Automation.PSSerializer]::Deserialize() (są one używane wewnętrznie przez cmdlety, więc jest to ta sama reprezentacja).

+0

Dzięki. czy masz jakieś wskazówki, jak sprawić, by $ dict wyglądało ładniej, gdy piszę do gospodarza? Moja hierarchia to płaski stół, ale używam Dict + Object, aby dodać więcej kolumn. Prawdopodobnie istnieje lepsze podejście. – LamonteCristo

+0

@LamonteCristo można utworzyć własny obiekt ('[PSObject]') i dodać każdą "kolumnę" jako właściwość. 'New-Object PSObject -Property @ {Key = Wartość; Key2 = Value2} '. Można użyć takiego hashtable dla początkowych właściwości. Możesz użyć 'Add-Member', aby dodać dodatkowe właściwości po utworzeniu obiektu. Rozważmy psobject jako pojedynczy wiersz; miałbyś wiele takich. Byłoby to najbardziej uniwersalne pod względem dalszego formatowania i transformacji. – briantist