Home
%3CLINGO-SUB%20id%3D%22lingo-sub-917622%22%20slang%3D%22en-US%22%3EMaking%20your%20public%20folder%20migrations%20faster%20and%20more%20reliable%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-917622%22%20slang%3D%22en-US%22%3E%3CP%3EThe%20key%20for%20a%20successful%20migration%20(of%20any%20type)%20is%20to%20ensure%20that%20source%20data%20is%20in%20a%20healthy%20condition.%20Public%20folder%20migrations%20are%20no%20different%2C%20especially%20if%20you%20have%20been%20using%20public%20folders%20for%20years.%20Orphaned%20ACLs%2C%20mis-matched%20Mail%20Enabled%20Public%20Folder%20objects%20(MEPF%E2%80%99s)%2C%20or%20corrupted%20dumpster%20folders%20can%20cause%20public%20folder%20migrations%20to%20slow%20down%20considerably%2C%20if%20not%20fail%20altogether.%3C%2FP%3E%0A%3CP%3EWe%20are%20happy%20to%20provide%20admins%20with%20a%20%3CA%20href%3D%22https%3A%2F%2Fwww.microsoft.com%2Fen-us%2Fdownload%2Fconfirmation.aspx%3Fid%3D100414%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%22%3ESource%20Validation%20script%3C%2FA%3E%20(clicking%20will%20start%20download%20of%20the%20script)%20which%20can%20scan%20and%20report%20on%20issues%20found%20with%20public%20folder%20deployments.%20The%20script%20can%20be%20used%20to%20scan%20legacy%20public%20folder%20deployments%20hosted%20on%20Exchange%20Server%202010%20or%20modern%20public%20folder%20deployments%20on%20Exchange%20Server%202013%2C%20Exchange%20Server%202016%20or%20Exchange%20Server%202019.%20It%20is%20recommended%20to%20use%20this%20script%20to%20scan%20public%20folder%20deployments%20before%20the%20start%20of%20a%20migration%20and%20fix%20any%20issues%20reported%20before%20proceeding%20with%20migration.%3C%2FP%3E%0A%3CP%3ECurrently%2C%20the%20script%20checks%20and%20reports%3A%3C%2FP%3E%0A%3CUL%3E%0A%3CLI%3EOrphaned%20ACLs%3C%2FLI%3E%0A%3CLI%3EHealth%20of%20Mail%20Enabled%20Public%20Folder%20(MEPF)%20objects*%3C%2FLI%3E%0A%3CLI%3EHealth%20of%20Dumpster%20folders*%3C%2FLI%3E%0A%3CLI%3ECheck%20if%20the%20source%20fits%20in%20the%20current%20EXO%20limits.%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CP%3E*These%20tests%20are%20valid%20for%20public%20folder%20deployments%20on%20Exchange%202013%20and%20above.%3C%2FP%3E%0A%3CH2%20id%3D%22toc-hId-1846176853%22%20id%3D%22toc-hId-1846176853%22%20id%3D%22toc-hId-1846176853%22%20id%3D%22toc-hId-1846176853%22%20id%3D%22toc-hId-1846176853%22%20id%3D%22toc-hId-1846176853%22%20id%3D%22toc-hId-1846176853%22%3EScript%20usage%3C%2FH2%3E%0A%3CP%3EDownload%20the%20script%20from%20%3CA%20href%3D%22https%3A%2F%2Fwww.microsoft.com%2Fen-us%2Fdownload%2Fconfirmation.aspx%3Fid%3D100414%22%20target%3D%22_blank%22%20rel%3D%22noopener%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%20noopener%20noreferrer%22%3Ehere%3C%2FA%3E%2C%20copy%20it%20to%20on-premises%20servers%20and%20execute%20from%20Exchange%20Management%20Shell.%20The%20script%20reads%20public%20folder%20hierarchy%20and%20stores%20the%20information%20into%20CSV%20files%20on%20the%20disk.%20Then%2C%20various%20checks%20are%20performed%20using%20the%20information%20stored%20in%20the%20CSV%20files.%20The%20results%2C%20along%20with%20actions%20to%20be%20performed%2C%20are%20presented%20in%20a%20log%20file%20named%20%E2%80%9CSourceSideValidations.%5ByyyyMMdd_HHmm%5D.log%E2%80%9D%3C%2FP%3E%0A%3CP%3EImportant%20parameters%3A%3C%2FP%3E%0A%3CTABLE%3E%0A%3CTBODY%3E%0A%3CTR%3E%0A%3CTD%20width%3D%22114%22%3E%3CP%3EParameter%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%2296%22%3E%3CP%3ERequired%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%22414%22%3E%3CP%3EDescription%3C%2FP%3E%0A%3C%2FTD%3E%0A%3C%2FTR%3E%0A%3CTR%3E%0A%3CTD%20width%3D%22114%22%3E%3CP%3EverifyMEPF*%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%2296%22%3E%3CP%3EOptional%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%22414%22%3E%3CP%3ESpecifies%20if%20MEPF%20integrity%20check%20needs%20to%20performed.%20By%20default%2C%20set%20to%20true.%20The%20option%20works%20for%20Exchange%20Server%202013%20and%20above.%3C%2FP%3E%0A%3C%2FTD%3E%0A%3C%2FTR%3E%0A%3CTR%3E%0A%3CTD%20width%3D%22114%22%3E%3CP%3EcheckLimits%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%2296%22%3E%3CP%3EOptional%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%22414%22%3E%3CP%3ESpecifies%20if%20Limits%20need%20to%20be%20checked%20for%20public%20folder.%20By%20default%2C%20set%20to%20true.%3C%2FP%3E%0A%3C%2FTD%3E%0A%3C%2FTR%3E%0A%3CTR%3E%0A%3CTD%20width%3D%22114%22%3E%3CP%3EverifyDumpsterMapping*%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%2296%22%3E%3CP%3EOptional%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%22414%22%3E%3CP%3ESpecifies%20if%20public%20folder%20mapping%20with%20dumpsters%20needs%20to%20be%20verified.%20By%20default%2C%20set%20to%20true.%20The%20option%20works%20for%20Exchange%20Server%202013%20and%20above.%3C%2FP%3E%0A%3C%2FTD%3E%0A%3C%2FTR%3E%0A%3CTR%3E%0A%3CTD%20width%3D%22114%22%3E%3CP%3EchekPermissions%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%2296%22%3E%3CP%3EOptional%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%22414%22%3E%3CP%3ESpecifies%20if%20permissions%20need%20to%20be%20checked%20on%20public%20folders.%20By%20default%2C%20set%20to%20true.%3C%2FP%3E%0A%3C%2FTD%3E%0A%3C%2FTR%3E%0A%3CTR%3E%0A%3CTD%20width%3D%22114%22%3E%3CP%3EstartAfresh%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%2296%22%3E%3CP%3EOptional%3C%2FP%3E%0A%3C%2FTD%3E%0A%3CTD%20width%3D%22414%22%3E%3CP%3ESpecifies%20if%20the%20script%20should%20read%20from%20files%20on%20the%20disk%20or%20read%20from%20PF%20structure%20again.%20Default%20value%20is%20true.%20The%20script%20will%20read%20the%20PF%20structure%20and%20create%20log%20files%20on%20the%20disk.%20Specify%20startAfresh%3A%24false%20in%20case%20the%20script%20execution%20was%20interrupted%20for%20any%20reason%20and%20needs%20to%20be%20resumed%20from%20the%20point%20where%20script%20was%20interrupted.%3C%2FP%3E%0A%3C%2FTD%3E%0A%3C%2FTR%3E%0A%3C%2FTBODY%3E%0A%3C%2FTABLE%3E%0A%3CH2%20id%3D%22toc-hId--705980108%22%20id%3D%22toc-hId--705980108%22%20id%3D%22toc-hId--705980108%22%20id%3D%22toc-hId--705980108%22%20id%3D%22toc-hId--705980108%22%20id%3D%22toc-hId--705980108%22%20id%3D%22toc-hId--705980108%22%3EExamples%3C%2FH2%3E%0A%3CP%3EThe%20following%20example%20shows%20how%20to%20perform%20only%20dumpster%20mapping%20check%3A%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3E.%5CSourceSideValidations.ps1%20-verifyMEPF%20%24false%20-verifyDumpsterMapping%20%24true%20-checkLimits%20%24false%20-checkPermissions%20%24false%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EThe%20following%20example%2C%20without%20providing%20any%20parameters%20performs%2C%20all%20the%20checks%20(i.e.%20-MEPF%2C%20Limits%2C%20DumpsterMapping%20and%20Orphaned%20ACL%20check)%3A%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3E.%5CSourceSideValidations.ps1%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EThe%20following%20example%20shows%20how%20to%20have%20script%20read%20public%20folder%20information%20from%20the%20existing%20files.%20This%20is%20useful%20in%20scenario%20if%20the%20script%20execution%20was%20interrupted%20and%20needs%20to%20be%20resumes%20from%20the%20time%20of%20interruption%3A%3C%2FP%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CPRE%20class%3D%22lia-code-sample%20language-markup%22%3E%3CCODE%3E.%5CSourceSideValidations.ps1%20-startFresh%3A%24false%3C%2FCODE%3E%3C%2FPRE%3E%0A%3CP%3E%26nbsp%3B%3C%2FP%3E%0A%3CP%3EAdditionally%2C%20here%20are%20some%20important%20points%20to%20be%20noted%3A%3C%2FP%3E%0A%3CUL%3E%0A%3CLI%3EScript%20execution%20time%20depends%20on%20the%20size%20of%20public%20folder%20deployment%20on-premises.%20For%20larger%20deployments%2C%20script%20may%20take%20several%20hours%20to%20complete.%3C%2FLI%3E%0A%3CLI%3EThe%20script%20must%20be%20executed%20from%20the%20appropriate%20source%20server%20within%20your%20on-premises%20deployment%20of%20public%20folders.%20For%20example%2C%20if%20you%20have%20public%20folders%20deployed%20on%20Exchange%202010%20(legacy%20public%20folders)%2C%20even%20if%20the%20environment%20also%20has%20Exchange%202013%2F2016%20servers%20installed%2C%20the%20script%20must%20be%20executed%20from%20the%20Exchange%202010%20server.%20But%20if%20your%20environment%20uses%20modern%20public%20folders%2C%20you%20would%20run%20this%20on%20an%20Exchange%202013%2F2016%2F2019%20server.%3C%2FLI%3E%0A%3CLI%3EThe%20script%20reports%20issues%20into%20a%20log%20file%2C%20saved%20in%20the%20execution%20folder.%20The%20log%20file%20name%20looks%20like%3A%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CP%3ESourceSideValidations.%3CTIMESTAMP%3E.log%3C%2FTIMESTAMP%3E%3C%2FP%3E%0A%3CP%3ESourceSideValidations.20190923_08.log%3C%2FP%3E%0A%3CUL%3E%0A%3CLI%3EThe%20script%20will%20also%20recommend%20actions%20to%20be%20performed%20to%20fix%20the%20issues%2C%20however%2C%20the%20script%20itself%20will%20not%20fix%20any%20found%20issues.%3C%2FLI%3E%0A%3C%2FUL%3E%0A%3CP%3EPlease%20leave%20a%20comment%20to%20let%20us%20know%20your%20feedback%20about%20the%20script.%20Happy%20public%20folder%20migrations!%3C%2FP%3E%0A%3CP%3E%3CSPAN%20class%3D%22author%22%3EPublic%20Folder%20Team%3C%2FSPAN%3E%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-TEASER%20id%3D%22lingo-teaser-917622%22%20slang%3D%22en-US%22%3E%3CP%3EThe%20key%20for%20a%20successful%20migration%20(of%20any%20type)%20is%20to%20ensure%20that%20source%20data%20is%20in%20a%20healthy%20condition.%20Public%20folder%20migrations%20are%20no%20different%2C%20especially%20if%20you%20have%20been%20using%20public%20folders%20for%20years.%20Orphaned%20ACLs%2C%20mis-matched%20Mail%20Enabled%20Public%20Folder%20objects%20(MEPF%E2%80%99s)%2C%20or%20corrupted%20dumpster%20folders%20can%20cause%20public%20folder%20migrations%20to%20slow%20down%20considerably%2C%20if%20not%20fail%20altogether.%3C%2FP%3E%3C%2FLINGO-TEASER%3E%3CLINGO-LABS%20id%3D%22lingo-labs-917622%22%20slang%3D%22en-US%22%3E%3CLINGO-LABEL%3Eexchange%202010%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EExchange%202013%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EExchange%202016%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EExchange%202019%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EMigration%3C%2FLINGO-LABEL%3E%3CLINGO-LABEL%3EOffice%20365%3C%2FLINGO-LABEL%3E%3C%2FLINGO-LABS%3E%3CLINGO-SUB%20id%3D%22lingo-sub-921795%22%20slang%3D%22en-US%22%3ERe%3A%20Making%20your%20public%20folder%20migrations%20faster%20and%20more%20reliable%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-921795%22%20slang%3D%22en-US%22%3E%3CP%3EIf%20you%20want%20to%20run%20this%20on%20an%20Exchange%202010%20environment%2C%20run%20it%20on%20a%20mailbox%20server.%20I%20experienced%20problems%20when%20running%20from%20both%20a%20management%20server%20and%20a%20CAS.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1003247%22%20slang%3D%22en-US%22%3ERe%3A%20Making%20your%20public%20folder%20migrations%20faster%20and%20more%20reliable%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1003247%22%20slang%3D%22en-US%22%3E%3CP%3EThis%20script%20has%20helped%20identify%20several%20issues%20so%20far%2C%20however%20it%20is%20returning%20a%20number%20of%20entries%20like%20this%20one%3A%3CBR%20%2F%3EEntryId%20000000001A447390AA6611CD9BC800AA002FC45A03003C79FE3DD4892149875958C8A1A9CD2A0000000001C50000.EntryId%20does%20not%20have%20a%20corresponding%20dumpster%20folder%3CBR%20%2F%3E%3CBR%20%2F%3EAny%20idea%20how%20to%20track%20this%20issue%20down%3F%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1007551%22%20slang%3D%22en-US%22%3ERe%3A%20Making%20your%20public%20folder%20migrations%20faster%20and%20more%20reliable%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-1007551%22%20slang%3D%22en-US%22%3E%3CP%3EVery%20nice%20script%2C%20and%20happy%20to%20see%20that%20you%20this%20time%2C%20take%20measurements%20for%20enviroments%2C%20where%20the%20script%20cannot%20complete%20within%20the%2010%20hours%20that%20the%20PowerShell%20session%20is%20valid%2C%20for%20large%20enviroments%20%3A)%3C%2Fimg%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EWhen%20that%20is%20said%2C%20i%20do%20see%20an%20issue%20with%20this%20script%2C%20as%20it%20does%20not%20take%20into%20account%2C%20for%20enviroments%20where%20the%20MESO%20objects%20also%20is%20place%20under%20a%20child%2Froot%20domain.%20Please%20include%20the%20line%20below%20in%20the%20script%3A%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%3CFONT%3ESet-ADServerSettings%20-ViewEntireForest%20%24true%3C%2FFONT%3E%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E

The key for a successful migration (of any type) is to ensure that source data is in a healthy condition. Public folder migrations are no different, especially if you have been using public folders for years. Orphaned ACLs, mis-matched Mail Enabled Public Folder objects (MEPF’s), or corrupted dumpster folders can cause public folder migrations to slow down considerably, if not fail altogether.

We are happy to provide admins with a Source Validation script (clicking will start download of the script) which can scan and report on issues found with public folder deployments. The script can be used to scan legacy public folder deployments hosted on Exchange Server 2010 or modern public folder deployments on Exchange Server 2013, Exchange Server 2016 or Exchange Server 2019. It is recommended to use this script to scan public folder deployments before the start of a migration and fix any issues reported before proceeding with migration.

Currently, the script checks and reports:

  • Orphaned ACLs
  • Health of Mail Enabled Public Folder (MEPF) objects*
  • Health of Dumpster folders*
  • Check if the source fits in the current EXO limits.

*These tests are valid for public folder deployments on Exchange 2013 and above.

Script usage

Download the script from here, copy it to on-premises servers and execute from Exchange Management Shell. The script reads public folder hierarchy and stores the information into CSV files on the disk. Then, various checks are performed using the information stored in the CSV files. The results, along with actions to be performed, are presented in a log file named “SourceSideValidations.[yyyyMMdd_HHmm].log”

Important parameters:

Parameter

Required

Description

verifyMEPF*

Optional

Specifies if MEPF integrity check needs to performed. By default, set to true. The option works for Exchange Server 2013 and above.

checkLimits

Optional

Specifies if Limits need to be checked for public folder. By default, set to true.

verifyDumpsterMapping*

Optional

Specifies if public folder mapping with dumpsters needs to be verified. By default, set to true. The option works for Exchange Server 2013 and above.

chekPermissions

Optional

Specifies if permissions need to be checked on public folders. By default, set to true.

startAfresh

Optional

Specifies if the script should read from files on the disk or read from PF structure again. Default value is true. The script will read the PF structure and create log files on the disk. Specify startAfresh:$false in case the script execution was interrupted for any reason and needs to be resumed from the point where script was interrupted.

Examples

The following example shows how to perform only dumpster mapping check:

 

.\SourceSideValidations.ps1 -verifyMEPF $false -verifyDumpsterMapping $true -checkLimits $false -checkPermissions $false

 

The following example, without providing any parameters performs, all the checks (i.e. -MEPF, Limits, DumpsterMapping and Orphaned ACL check):

 

.\SourceSideValidations.ps1

 

The following example shows how to have script read public folder information from the existing files. This is useful in scenario if the script execution was interrupted and needs to be resumes from the time of interruption:

 

.\SourceSideValidations.ps1 -startFresh:$false

 

Additionally, here are some important points to be noted:

  • Script execution time depends on the size of public folder deployment on-premises. For larger deployments, script may take several hours to complete.
  • The script must be executed from the appropriate source server within your on-premises deployment of public folders. For example, if you have public folders deployed on Exchange 2010 (legacy public folders), even if the environment also has Exchange 2013/2016 servers installed, the script must be executed from the Exchange 2010 server. But if your environment uses modern public folders, you would run this on an Exchange 2013/2016/2019 server.
  • The script reports issues into a log file, saved in the execution folder. The log file name looks like:

SourceSideValidations.<timestamp>.log

SourceSideValidations.20190923_08.log

  • The script will also recommend actions to be performed to fix the issues, however, the script itself will not fix any found issues.

Please leave a comment to let us know your feedback about the script. Happy public folder migrations!

Public Folder Team

3 Comments
Occasional Visitor

If you want to run this on an Exchange 2010 environment, run it on a mailbox server. I experienced problems when running from both a management server and a CAS.

Senior Member

This script has helped identify several issues so far, however it is returning a number of entries like this one:
EntryId 000000001A447390AA6611CD9BC800AA002FC45A03003C79FE3DD4892149875958C8A1A9CD2A0000000001C50000.EntryId does not have a corresponding dumpster folder

Any idea how to track this issue down?

Occasional Visitor

Very nice script, and happy to see that you this time, take measurements for enviroments, where the script cannot complete within the 10 hours that the PowerShell session is valid, for large enviroments :)

 

When that is said, i do see an issue with this script, as it does not take into account, for enviroments where the MESO objects also is place under a child/root domain. Please include the line below in the script:

 

Set-ADServerSettings -ViewEntireForest $true