#------------------------------------------------------------------------- # pfreplcheck.vbs # # Description # Loads public folder statistics from Exchange 2007 (PS) and Exchange 2003 (WMI) # compares itemcount to find folders out of sync during migration # # You have to specify the server name and the type as the part of the code # # the script uses the credentials of the executing User. # - You need approbiate permissions to run the commandlet "get-publicfolderstatistics" # - Make sure that you are running the script ona box with PowerShell 1.0 and exchange management components # - marke sure you are able to do a WMI conect # # (c)2009 Net at Work Netzwerksysteme GmbH # # Version 1.0-1.2 (09 Apr. 2009) Frank Carius # Initial Release build with a customer. never made public. # Version 1.3 (09 Apr. 2009) Frank Carius # First public version with sample server names and better debugging # Version 1.4 (22 Feb 2010) Frank Carius # ExchangeVersion detection # Version 1.5 (22 Feb 2010) Frank Carius # fix broken output formatting # Version 1.6 (22 Jul 2011) Frank Carius # resultsize unlimited addiert # Version 1.7 (12. Nov 2011) Frank Carius # Böser Fehler korrigiert bei der Ausgabe und beim Einlesen von Server2 # Version 1.8 (26. Mai 2014) Frank Carius nach Hinweis von ulrich Gebauer # Sonderfall "Leerzeichen am Ende". addiere nun ein "#" am Anfang und Ende um solche Fälle zu erkennen. # # Stept to use that script # Start Exchange Management shell # Execute witrh .\pfreplcheck.1.2.ps1 -server1 servername -server2 servername| Export-Csv -Path .\pf.csv # #------------------------------------------------------------------------- param ( [string]$server1="", # Name des ersten Servers [string]$server2="" # Name des zweien Servers ) function get2007pflist {param($server) # Loads Exchange 2007 public Folder statistics and returns a normalized hashtable Write-Host "get2007pflist start" $folderlist = get-publicfolderstatistics -server $server -resultsize unlimited Write-Host "get2007pflist Found " $folderlist.count " folders" $dict = @{} $folderlist | % { if ($_.folderpath -ne $null) { Write-Host " Processing:" $_.folderpath $normalpath = "/".insert(0,$_.folderpath.replace("\","/").insert(0,"/")) Write-Host " Processing:" $normalpath $dict.add(("#"+$normalpath+"#"),@{itemcount = $_.itemcount; foldersize = $_.TotalItemSize.value.tobytes()}) } else { Write-Warning -Message ("Skipping " + $_.name + " with empty folderpath") } } Write-Output $dict Write-Host "get2007pflist end" } function get2003pflist {param($server) # Loads Exchange 2003 public Folder statistics and returns a normalized hashtable Write-Host "get2003pflist start" $folderlist = Get-WmiObject -ComputerName $server -namespace "root\MicrosoftExchangeV2" -class "Exchange_PublicFolder" Write-Host "get2003pflist Found " $folderlist.count " folders" $dict = @{} $folderlist | % { Write-Host " Processing:" $_.path $dict.add(("#"+$_.path+"#"),@{itemcount = $_.messagecount; foldersize = $_.normalmessagesize}) } Write-Output $dict Write-Host "get2007pflist end" } Write-Host "PFreplCheck start" Write-Host "Checking Parameters start" if ($server1 -eq "") { write-error "Please specify -server1 servername" exit } else { write-host "server1: $server1" } if ($server2 -eq "") { write-error "Please specify -server2 servername" exit } else { write-host "server2: $server2" } Write-Host "Loading Public Folder List Server1 $server1" #$dict1 = @{} if ((get-exchangeserver -identity $server1).IsExchange2007OrLater -eq $true) { Write-Host "Loading Exchange 2007/2010 Public Folder List" $dict1 = get2007pflist $server1 } else { Write-Host "Loading Exchange 2003 Public Folder List" $dict1 = get2003pflist $server1 } Write-Host "Loading Public Folder List Server2 $server2" #$dict2 = @{} if ((get-exchangeserver -identity $server2).IsExchange2007OrLater -eq $true) { Write-Host "Loading Exchange 2007/2010 Public Folder List" $dict2 = get2007pflist $server2 } else { Write-Host "Loading Exchange 2003 Public Folder List" $dict2 = get2003pflist $server2 } Write-Host "Comparing DICT1 with DICT2" foreach ($folder in $dict1.keys) { Write-Verbose "Processing dict1 $folder" $result = ("" | select path,s1count,s1size,s2count,s2size,status) $result.path = $folder $result.s1count = $dict1.Get_Item($folder).itemcount $result.s1size = $dict1.Get_Item($folder).foldersize $result.s2count = "" $result.s2size = "" $result.status = "" if ($dict2.ContainsKey($folder)) { Write-Verbose " Patch found. Checking content" $result.s2count=$dict2.Get_Item($folder).itemcount $result.s2size=$dict2.Get_Item($folder).foldersize if ($result.s1count -eq $result.s2count){ Write-Host "Folder $folder.path identical" $result.status="consistent" } else { Write-warning "Folder $folder not identical" $result.status="different" } #remove processed entry #$dict1.remove($folder) # not allowed because foreach enumeration will be changed $dict2.remove($folder) } else { Write-Warning "Folder $folder not found on System 2 - not replicated ?" $result.status="missing in 2" } Write-Output $result } Write-Host "Checking unmatched folders in dict2" foreach ($folder in $dict2.keys) { write-warning "Folder $folder not existing on System 1 - not replicated" $result = ("" | select path,s2count,s2size,status) $result.path = $folder $result.s2count = $dict2.Get_Item($folder).itemcount $result.s2size = $dict2.Get_Item($folder).foldersize $result.status = "missing in 1" Write-Output $result # Send output to Pipeline } Write-Host "PFreplCheck end"