2026-04-30

OneDrive 復原資源回收桶內超量檔案的方法

使用者「不小心」在 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) }
$RestoreTarget
Restore-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 -Force
Get-PnPRecycleBinItem -RowLimit 500000 | Where-Object { ($_.Id -eq "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") } | Restore-PnPRecycleBinItem -Force

Get-PnPRecycleBinItem -RowLimit 500000 |
Where-Object { $_.ItemType -eq "File" } |
Select-Object -First 1000 |
ForEach-Object {
    Restore-PnPRecycleBinItem -Identity $_.Id -Force
}

沒有留言:

張貼留言