使用者「不小心」在 OneDrive 桌面應用程式同步的情況下刪除了含有大量檔案的資料夾
並因為 OneDrive 桌面應用程式同步的關係將 OneDrive 雲端伺服器中的檔案也刪除
此時透過 OneDrive 網頁的資源回收桶進行復原將產生錯誤,因為復原檔案有限制數量
此時必須動用 PowerShell 指令搭配 Microsoft Entra App 來處理
先安裝好 PowerShell Module: PnP.PowerShell (需要 PowerShell 7 版本)
Install-Module -Name "PnP.PowerShell" -Scope AllUsers -Force (我都裝 AllUsers)
接著到 Microsoft Entra admin center 註冊一個 App
給予 API Permession 的時候「不是」選 Microsoft Graph,而是選 SharePoint
我比較偷懶,給予 AllSites.FullControl Delegated
接著下指令: (ClientId 就是剛剛註冊的 App 的 Application (client) ID)
$URL = "https://{tanent}-my.sharepoint.com/personal/{UserName}_{domain_com}"
Connect-PnPOnline `
-Url $URL `
-ClientId xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx `
-Tenant "{tanent}.onmicrosoft.com" `
-Interactive
指令執行會要求登入
此時登入 Entra Admin 帳號 "admin@{tanent}.onmicrosoft.com"
(實際需要權限較少,可以查微軟說明建立一個新帳號只給予最小權限)
檢查自己是不是有權限:
Get-PnPSiteCollectionAdmin
如果沒權限的話:
Set-PnPTenantSite `
-Url $URL `
-Owners "admin@{tanent}.onmicrosoft.com"
查詢資源回收桶項目:
$RecycleBinItems = Get-PnPRecycleBinItem -RowLimit 500000$RecycleBinItems.count
(RowLimit 給予一個很大的數字,允許查詢所有檔案)
查檔案:
$FilesInRecycleBin = $RecycleBinItems | Where-Object { $_.ItemType -eq "File" }$Report = @();foreach ($FileInRecycleBin in $FilesInRecycleBin) {$Report += $FileInRecycleBin | Select-Object LeafName,Id,DeletedDate,AuthorName,DeletedByName,DeletedDateLocalFormatted,DirName};$Report | Export-Csv -Path "C:\Command\PowerShell\SharePoint\{UserName}_FilesInRecycleBin.csv" -Encoding utf8BOM -NoTypeInformation
查資料夾
$FoldersInRecycleBin = $RecycleBinItems | Where-Object { $_.ItemType -eq "Folder" }$Report = @();foreach ($FolderInRecycleBin in $FoldersInRecycleBin) {$Report += $FolderInRecycleBin | Select-Object LeafName,Id,DeletedDate,AuthorName,DeletedByName,DeletedDateLocalFormatted,DirName};$Report | Export-Csv -Path "C:\Command\PowerShell\SharePoint\{UserName}_FoldersInRecycleBin.csv" -Encoding utf8BOM -NoTypeInformation
復原 (以下各種指令自己組合運用):
$TargetFolder = "{Path_to_File}/{FileName}";$RestoreTarget = $RecycleBinItems | Where-Object { ($_.ItemType -eq "Folder") -and ($_.DirName -eq $TargetFolder) }$RestoreTargetRestore-PnPRecycleBinItem -Identity $RestoreTarget.Id -Force$RecycleBinItems | Where-Object { ($_.ItemType -eq "Folder") -and ($_.DirName -like ($TargetFolder + '*')) }Get-PnPRecycleBinItem -RowLimit 500000 | Where-Object { ($_.ItemType -eq "File") } | Restore-PnPRecycleBinItem -ForceGet-PnPRecycleBinItem -RowLimit 500000 | Where-Object { ($_.Id -eq "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") } | Restore-PnPRecycleBinItem -ForceGet-PnPRecycleBinItem -RowLimit 500000 |Where-Object { $_.ItemType -eq "File" } |Select-Object -First 1000 |ForEach-Object {Restore-PnPRecycleBinItem -Identity $_.Id -Force}
沒有留言:
張貼留言