%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%20noopener%20noreferrer%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%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%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%20noopener%20noreferrer%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%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%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%3CLINGO-SUB%20id%3D%22lingo-sub-1055590%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-1055590%22%20slang%3D%22en-US%22%3E%3CP%3EWhat%20about%20the%20check%20if%20a%20Mail%20Publicfolder%20belongs%20to%20a%20member%20of%20a%20distribution%20group%3F%20This%20is%20also%20a%20scenarios%20that%20causes%20problems.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1065956%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-1065956%22%20slang%3D%22en-US%22%3E%3CP%3EThanks%2C%20though%20for%20the%20ACL%20portion%2C%20I'd%20suggest%20an%20option%20to%20automatically%20backup%20and%20remove%20the%20permissions%2C%20or%20at%20least%20include%20the%20AccessRights%20in%20the%20log%20file.%20Presently%20the%20log%20states%20the%20folder%20name%20and%20user%20with%20an%20ACE%20error%2C%20but%20Remove-PublicFolderClientPermission%20requires%20the%20name%20of%20the%20AccessRight%20itself%2C%20so%20we're%20not%20able%20to%20feed%20the%20log%20file%20back%20into%20a%20%22fix%20script%22%20without%20looking%20up%20the%20whole%20ACL%20again.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1107520%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-1107520%22%20slang%3D%22en-US%22%3E%3CP%3EWhen%20I%20run%20this%20script%20I%20get%20multiple%20errors%20like%3A%3CBR%20%2F%3E%3CBR%20%2F%3Ethis%20folder%20%5C*****%20****%5C******_***_**%20permission%20needs%20to%20be%20removed%20for%20user%20NT%20User%3AS-1-5-21-**********-**********-**********-****%3CBR%20%2F%3E%3CBR%20%2F%3EHow%20can%20I%20automate%20removing%20the%20user%3F%26nbsp%3B%3CBR%20%2F%3E%3CBR%20%2F%3EI%20thought%20about%3CBR%20%2F%3E%3CBR%20%2F%3ERemove-PublicFolderClientPermission%20-identity%20%22%5C*****%20******%22%20-User%20%22S-1-5-21-**********-**********-**********-****%22%20-Confirm%3AFalse%3CBR%20%2F%3E%3CBR%20%2F%3Ebut%20can't%20do%20so%2C%20because%20Remove-PublicFolderClientPermission%20needs%20a%20real%20(principal)%20User%20Name%20not%20a%20guid.%3CBR%20%2F%3E%3CBR%20%2F%3EThanks%20in%20advance%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1142242%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-1142242%22%20slang%3D%22en-US%22%3E%3CP%3E%3CA%20href%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F517957%22%20target%3D%22_blank%22%3E%40DiSmo%3C%2FA%3E%26nbsp%3B%20edit%20your%20%22SourceSideValidations%22%20file%20like%3C%2FP%3E%3CP%3E%22folder%22%2C%22user%22%3C%2FP%3E%3CP%3E%22%5Cfolder%5Cfolder1%5Cfolder3%22%2C%22User%20Name%22%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3Ethen%26nbsp%3B%3C%2FP%3E%3CP%3E%24get_folder_user%20%3D%20Import-Csv%20.%5Cedited_SourceSideValidations.csv%3CBR%20%2F%3Eforeach(%24object%20in%20%24get_folder_user)%20%7BRemove-PublicFolderClientPermission%20-Identity%20%24object.folder%20-User%20%24object.user%20-Confirm%3A%24false%7D%3C%2FP%3E%3CP%3Ehope%20it%20helps%3C%2FP%3E%3CP%3ERP%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1186546%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-1186546%22%20slang%3D%22en-US%22%3E%3CDIV%3E%3CDIV%20class%3D%22resolved%22%3EI've%20been%20running%20this%20script%20now%20for%2048%20hrs.%20Is%20that%20normal%3F%20Should%20I%20end%20this%3F%20It%20just%20keeps%20going%20thru%20the%20list%20of%20folders%20over%20and%20over.%3C%2FDIV%3E%3C%2FDIV%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EPlease%20advise%3C%2FP%3E%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%3CDIV%3E%26nbsp%3B%3C%2FDIV%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1251675%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-1251675%22%20slang%3D%22en-US%22%3E%3CP%3Ewhat%20are%20the%20exact%20limits%20on%20migrating%20onprem%20PFs%20to%20o365%20EXO%3F%26nbsp%3B%20i%20think%20your%20documentation%20team%20are%20confusing%20issues%20as%20they've%20said%20100%20folders.%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1346018%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-1346018%22%20slang%3D%22en-US%22%3E%3CP%3EThe%20script%20is%20a%20good%20idea%2C%20but%20the%20output%20is%20unusable.%20It%20requires%20significant%20work%20to%20transfer%20the%20text%20file%20output%20to%20a%20CSV%20file.%20Furthermore%2C%20in%20order%20to%20remove%20permissions%2C%20you%20need%20the%20principal%20and%20access%20rights%2C%20so%20I%20ended%20up%20querying%20again%20just%20before%20removing.%26nbsp%3B%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-1471995%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-1471995%22%20slang%3D%22en-US%22%3E%3CP%3EI%20have%20tons%20of%20errors%20like%20this%3A%3C%2FP%3E%3CP%3Efolder%20name%20...%20has%20an%20invalid%20dumpster%20which%20is%20000000001A447390AA6611CD9BC800AA002FC45A0300FEE8624D3302BF41BC3DC428610D460500062D5D62AA0000%3CBR%20%2F%3E14867%20folders%20have%20issue%20with%20dumpsters%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EI%20got%20Exchange%202013%2C%20so%20I%20can't%20use%26nbsp%3B-CreateAssociatedDumpster.%3C%2FP%3E%3CP%3E%26nbsp%3B%3C%2FP%3E%3CP%3EAny%20idea%3F%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

11 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

 

 

Senior Member

What about the check if a Mail Publicfolder belongs to a member of a distribution group? This is also a scenarios that causes problems.

New Contributor

Thanks, though for the ACL portion, I'd suggest an option to automatically backup and remove the permissions, or at least include the AccessRights in the log file. Presently the log states the folder name and user with an ACE error, but Remove-PublicFolderClientPermission requires the name of the AccessRight itself, so we're not able to feed the log file back into a "fix script" without looking up the whole ACL again.

Occasional Visitor

When I run this script I get multiple errors like:

this folder \***** ****\******_***_** permission needs to be removed for user NT User:S-1-5-21-**********-**********-**********-****

How can I automate removing the user? 

I thought about

Remove-PublicFolderClientPermission -identity "\***** ******" -User "S-1-5-21-**********-**********-**********-****" -Confirm:False

but can't do so, because Remove-PublicFolderClientPermission needs a real (principal) User Name not a guid.

Thanks in advance

Senior Member

@DiSmo  edit your "SourceSideValidations" file like

"folder","user"

"\folder\folder1\folder3","User Name"

 

then 

$get_folder_user = Import-Csv .\edited_SourceSideValidations.csv
foreach($object in $get_folder_user) {Remove-PublicFolderClientPermission -Identity $object.folder -User $object.user -Confirm:$false}

hope it helps

RP

Occasional Visitor
I've been running this script now for 48 hrs. Is that normal? Should I end this? It just keeps going thru the list of folders over and over.

 

Please advise

 
 
 
 
Occasional Contributor

what are the exact limits on migrating onprem PFs to o365 EXO?  i think your documentation team are confusing issues as they've said 100 folders.

Senior Member

The script is a good idea, but the output is unusable. It requires significant work to transfer the text file output to a CSV file. Furthermore, in order to remove permissions, you need the principal and access rights, so I ended up querying again just before removing. 

Regular Visitor

I have tons of errors like this:

folder name ... has an invalid dumpster which is 000000001A447390AA6611CD9BC800AA002FC45A0300FEE8624D3302BF41BC3DC428610D460500062D5D62AA0000
14867 folders have issue with dumpsters

 

I got Exchange 2013, so I can't use -CreateAssociatedDumpster.

 

Any idea?