ฉันพบสถานการณ์ที่ฉันสูญเสียการอนุญาตโฟลเดอร์สาธารณะทั้งหมดที่ได้รับมอบหมายผ่านกลุ่ม

ก่อนที่จะย้ายข้อมูลเริ่มต้นจากเซิร์ฟเวอร์ของเรา MSEX2016 Office 365 สิทธิ์ทั้งหมดได้ส่งออกไปยังไฟล์ XML เป็นสิ่งที่ผมคิดว่า (อธิบายในนี้หน้า Microsoft) ที่เกิดขึ้นกับคำสั่งดังต่อไปนี้:

Get-PublicFolder -Recurse -ResultSize Unlimited | Get-PublicFolderClientPermission | Select-Object Identity,User,AccessRights -ExpandProperty AccessRights | Export-CliXML OnPrem_PFPerms.xml

ไฟล์เอาต์พุต "OnPrem_PFPerms.xml" มีประมาณ 5 GB ฟังดูมากสำหรับฉันสำหรับการอนุญาตในโครงสร้าง PF ประมาณ 300 GB เท่านั้น แต่อาจเป็นสาเหตุขนาดใหญ่ที่เกิดจากความซับซ้อนของรูปแบบ XML การบีบอัด 7-Zip ลดลงเหลือ 25 MB หมายความว่ามีข้อมูลซ้ำซ้อนจำนวนมาก

ใน MSEX2010 ของเราซึ่งได้ย้ายไปยัง MSEX2016 ก่อนหน้านี้เป็นไฟล์ "Legacy_PFPerms.xml" ที่มีขนาดประมาณ 500 MB

คำสั่ง PowerShell ที่เหมาะสมคืออะไรเพื่อใช้สิทธิ์ทั้งหมดจากไฟล์ XML กับโครงสร้างโฟลเดอร์สาธารณะใน Office 365 / Exchange ออนไลน์

ฉันเดาว่า Import-CliXML จะทำงานได้ดี แต่ฉันไม่คุ้นเคยกับ PowerShell ในการสร้างคำสั่งที่ถูกต้อง

answer

ในที่สุดสคริปต์ PowerShell ต่อไปนี้ทำให้ฉันสามารถใช้การอนุญาตทั้งหมดจากไฟล์ XML กับโครงสร้างโฟลเดอร์สาธารณะ ขอบคุณIvan_Wangที่นำฉันไปสู่ทิศทางที่ถูกต้องพร้อมคำตอบของเขา

$pfs = Import-Clixml -Path OnPrem_PFPerms.xml

foreach($pf in $pfs)
{
Add-PublicFolderClientPermission -Identity ("\" + $($pf.Identity.MapiFolderPath -join "\")) -User $pf.User.DisplayName -AccessRights $pf.AccessRights[0].ToString()
}

เป็นไปได้ไหมที่จะแบ่งมันออกเป็นหลาย ๆ เซสชันของ PowerShell เพื่อใช้การเปลี่ยนแปลงที่เร็วขึ้น เนื่องจากมันทำงานค่อนข้างช้า

  1. เซสชั่น PS: foreach($pf in $pfs[0..2000]) ...

  2. เซสชั่น PS: foreach($pf in $pfs[2001..4000])...

...

อย่าเรียกใช้เซสชันมากเกินไปในคราวเดียว มิฉะนั้นจะขัดจังหวะการเชื่อมต่อกับ Exchange Online ด้วยข้อความต่อไปนี้: The request is not serviced on the server. Your request is too frequent.

คุณสมบัติใดบ้างที่รวมอยู่ในไฟล์ .xml หากมีIdentity and User , AccessRightsคุณสามารถลอง:

$pfs = Import-Clixml -Path OnPrem_PFPerms.xml
foreach($pf in $pfs)
{
Add-PublicFolderClientPermission -Identity $pf.Identity -User $pf.User -AccessRights $pf.AccessRights
}

ตามคำสั่งของคุณด้านบน ดูเหมือนว่าจะส่งออกเฉพาะวัตถุAccessRights ถ้าเป็นเช่นนั้น คุณอาจต้องส่งออกรายการ ACL ปัจจุบันใน Exchange Online เป็นไฟล์ .csv:

Get-PublicFolder -Recurse -ResultSize Unlimited | Get-PublicFolderClientPermission | Select-Object Identity,User,@{n="AccessRights";e={[String]($_.AccessRights)}} -ExpandProperty AccessRights | Export-Csv pf.csv

และกำหนดสิทธิ์ของโฟลเดอร์สาธารณะให้กับผู้ใช้ของคุณอีกครั้งผ่าน PowerShell (สำหรับรายการสิทธิ์ที่มีอยู่ PowerShell จะรายงานคำเตือน: พบรายการสิทธิ์ที่มีอยู่สำหรับผู้ใช้ ):

$pfs = Import-Csv pf.csv
foreach($pf in $pfs)
{
Add-PublicFolderClientPermission -Identity $pf.Identity -User $pf.User -AccessRights $pf.AccessRights
}

หากเซิร์ฟเวอร์ Exchange ต้นทางยังคงใช้งานได้ คุณสามารถใช้สิ่งต่อไปนี้เพื่อส่งออกสิทธิ์ของไคลเอ็นต์โฟลเดอร์สาธารณะไปยังไฟล์ CSV และนำเข้าไปยัง Office 365 คุณอาจต้องแก้ไขไฟล์ CSV ต้นทางเพื่อแก้ไขชื่อผู้ใช้ให้ตรงกับ Office ชื่อผู้ใช้ 365 สำหรับผู้ใช้แต่ละคนอยู่ในสิทธิ์

ส่งออกการอนุญาตโฟลเดอร์สาธารณะเป็น CSV:

รับ-PublicFolder -Recurse | รับ PublicFolderClientPermission | เลือก ข้อมูลประจำตัว ผู้ใช้ @{ expression={$_.AccessRights}; label='AccessRights' } | ส่งออก-Csv C:\Temp\PublicFolderClientPermission.csv

นำเข้าการอนุญาตโฟลเดอร์สาธารณะจาก CSV:

$Users= นำเข้า-CSV C:\Temp\PublicFolderClientPermission.csv foreach ($ผู้ใช้ใน $Users){Get-PublicFolder -Identity $($User.identity) | add-publicfolderclientpermission -AccessRights $User.AccessRights -User $User.User}