jojo.ac
Goto Top

Exchange ActiveSync Device Liste in große weltweit verteile Umgebung

Hallo @all,

ich muss regelmäßig eine Liste aller Exchange Active Sync Geräte erstellen.
Ein entsprechende Powershell Script ist vorhanden und erfüllt prima seinen zweck. leider lässt die Geschwindigkeit zu wünschen übrig. (9-12 Stunden bei ca. 10.000 EAS Geräten)
Bei dem weltweit verseiltem und per WAN verbundenen Exchange System eigentlich keine große Überraschung. aber kennt jemand noch einen schnelleren Weg?
Hat jemand Erfahrung mit so verteilten Systemen?

Bin für jede Hilfe dankbar.

/Jojo


Um es kurz zu beschreiben. Hier die wichtigsten Code Zeilen.

$CASMailboxes = Get-CASMailbox -Filter {HasActivesyncDevicePartnership -eq $true} -ResultSize Unlimited -IgnoreDefaultScope | Where-Object {$_.DisplayName -notlike "CAS_{*"}  

ForEach ($CASMailbox in $CASMailboxes)  
    {  
            $Devices = Get-ActiveSyncDeviceStatistics -Mailbox $CASMailbox.Identity 
            $User = Get-User -Identity $CASMailbox.Identity
            $Mailbox = Get-Mailbox -Identity $CASMailbox.Identity
ForEach ($Device in $Devices) 
            { 
                $Obj = New-Object PSObject 
                $Obj | Add-Member NoteProperty -Name "MailboxName" -Value $CASMailbox.Name   
                $Obj | Add-Member NoteProperty -Name "Mail" -Value $CASMailbox.PrimarySmtpAddress   
                $Obj | Add-Member NoteProperty -Name "GID" -Value $Mailbox.CustomAttribute2   
                $Obj | Add-Member NoteProperty -Name "NetID" -Value $Mailbox.CustomAttribute7   
                $Obj | Add-Member NoteProperty -Name "Office" -Value $Mailbox.Office   
                $Obj | Add-Member NoteProperty -Name "Department" -Value $User.Department   
                $Obj | Add-Member NoteProperty -Name "CountryOrRegion" -Value $User.CountryOrRegion   
                $Obj | Add-Member NoteProperty -Name "Company" -Value $User.Company   
                $Obj | Add-Member NoteProperty -Name "City" -Value $User.City   
                $Obj | Add-Member NoteProperty -Name "DeviceType" -Value  $Device.DeviceType   
                $Obj | Add-Member NoteProperty -Name "DeviceId" -Value  $Device.DeviceId   
                $Obj | Add-Member NoteProperty -Name "DeviceModel" -Value $Device.DeviceModel   
                $Obj | Add-Member NoteProperty -Name "DeviceIMEI" -Value $Device.DeviceIMEI   
                $Obj | Add-Member NoteProperty -Name "DeviceOS" -Value $Device.DeviceOS   
                $Obj | Add-Member NoteProperty -Name "DeviceUserAgent" -Value $Device.DeviceUserAgent   
                $Obj | Add-Member NoteProperty -Name "DeviceFriendlyName" -Value $Device.DeviceFriendlyName   
                $Obj | Add-Member NoteProperty -Name "FirstSyncTime" -Value $Device.FirstSyncTime.ToShortDateString()  
                $Obj | Add-Member NoteProperty -Name "LastSyncAttemptTime" -Value $Device.LastSyncAttemptTime.ToShortDateString()   
                $Obj | Add-Member NoteProperty -Name "LastSuccessSync" -Value $Device.LastSuccessSync.ToShortDateString()   
                $Obj | Add-Member NoteProperty -Name "DevicePolicy" -Value $Device.DevicePolicyApplied   
                $Obj | Add-Member NoteProperty -Name "DeviceActiveSyncVersion" -Value $Device.DeviceActiveSyncVersion   
                $Obj | Add-Member NoteProperty -Name "IsRemoteWipeSupported" -Value $Device.IsRemoteWipeSupported   
                $Obj | Add-Member NoteProperty -Name "DeviceAccessState" -Value $Device.DeviceAccessState   
                $Obj | Add-Member NoteProperty -Name "DeviceAccessStateReason" -Value $Device.DeviceAccessStateReason   
                $Obj | Add-Member NoteProperty -Name "DeviceAccessControlRule" -Value $Device.DeviceAccessControlRule   
                $Obj | Add-Member NoteProperty -Name "NumberOfFoldersSynced" -Value $Device.NumberOfFoldersSynced   
                $Obj | Add-Member NoteProperty -Name "ServerName" -Value $CASMailbox.ServerName.ToUpper()   
                 

            } 
$return += $Obj
$return | Export-Csv -Path $outFile -Delimiter (Get-Culture).TextInfo.ListSeparator -Encoding UTF8 -NoTypeInformation

Content-Key: 310837

Url: https://administrator.de/contentid/310837

Ausgedruckt am: 19.03.2024 um 05:03 Uhr

Mitglied: 129813
129813 25.07.2016 aktualisiert um 20:17:31 Uhr
Goto Top
Hi,
creating objects like this
New-Object PSObject
is slow.
Use the optimized version available starting with PS 3.0
[pscustomobject] @{Column1=Value1;Column2=Value2;ColumnN=ValueN}
But creating custom objects is not needed here. You could instead use calculated properties in a select statement, this would again save much time because you can directly pipe it to export-csv in one step.

Regards
Mitglied: emeriks
emeriks 25.07.2016 um 21:07:16 Uhr
Goto Top
Hi,
"-IgnoreDefaultScope" suggeriert mir, dass das auch mehrere Domänen sind? Falls ja, läufst Du wahrscheinlich schneller, wenn Du entweder auf Parallel Tasking umstellst und je Domäne einen Task parallel laufen lässt. Oder je Domäne ein Script und alle parallel ausführen. Aber sowas über WAN abzufragen dauert sowieso. Hier könnte Remote Scripting abhelfen, also die Script-Ausführung auf den Servern am Standort auszulösen und abschließend die Ergebnisse einzusammeln.

Vielleicht kann Kollege @colinardo da was aus dem Ärmel schütteln?

E.
Mitglied: jojo.ac
jojo.ac 26.07.2016 um 10:46:23 Uhr
Goto Top
Thank you highload,

it looks like there is no difference between using hash tables or not in this script.
Anyhow I could use this in an other script to speed up.

In my case it looks like the WAN is the issue.
Maybe splitting it up will be the best option.

/jojo
Mitglied: 129813
129813 26.07.2016 um 10:52:31 Uhr
Goto Top
Zitat von @jojo.ac:

it looks like there is no difference between using hash tables or not in this script.
This is not a hashtable, this results in a custom object.
Anyhow I could use this in an other script to speed up.
Parallel processing like @emeriks said.
In my case it looks like the WAN is the issue.
Maybe splitting it up will be the best option.
Make a "workflow"-script with parallel processing and psremoting.
Mitglied: jojo.ac
jojo.ac 26.07.2016 um 11:06:34 Uhr
Goto Top
Danke emeriks,

mit dem "-IgnoreDefaultScope" oder ohne ergibt verhältnismäßig kein großen Unterschied.

Das Remotescripting je Server Farm, könnte eine Alternative sein. leider bin ich noch zu blöd es wirklich umzusetzen. .-)
Vielleicht sogar mit Prallel Tasking.
da hilft wohl nur lesen und üben. face-smile


/jojo
Mitglied: jojo.ac
jojo.ac 26.07.2016 um 11:09:23 Uhr
Goto Top
I guess this ist the most efficient way.

but for this I have to learn a litte bit more. nothing I could adapt within some minutes or hours.

/jojo
Mitglied: emeriks
emeriks 26.07.2016 um 11:12:02 Uhr
Goto Top
mit dem "-IgnoreDefaultScope" oder ohne ergibt verhältnismäßig kein großen Unterschied.
Hinsichtlich Leistung natürlich nicht. Warum hast du diesen Paremeter denn drin, wenn Ihr nicht mehrere Domänen habt? Das war die Frage.
Mitglied: jojo.ac
jojo.ac 26.07.2016 um 11:44:37 Uhr
Goto Top
ja face-smile
es sind ein paar Domänen. face-smile
Mitglied: emeriks
emeriks 26.07.2016 um 11:49:03 Uhr
Goto Top
ja face-smile
es sind ein paar Domänen. face-smile
Na dann. Lass je Domäne und/oder Exchange Server einen eigenen Task/Script laufen. Parallel.
Und, wahrscheinlich viel schneller, lass es remote auf den Servern laufen, sofern Du die Berechtigungen dafür hast.