SharePoint Onlineドキュメントライブラリのファイルエクスポート

目次

はじめに

ドキュメントライブラリに保存されている共有ファイルを間違えて削除してしまったなんてことはありませんか?ゴミ箱が用意されているので、ゴミ箱に残っている間であれば復元可能ではありますが、93日間経過したファイルは完全削除されてしまいます。昨今流行っているランサムウェアによる被害を復元したい場合もあると思います。

この記事では、バックアップツールを利用せずに、特定のドキュメントライブラリからファイルをエクスポートする方法をご紹介します。

ドキュメントライブラリファイルエクスポート

動作環境

本処理には、下記の環境条件を整える必要があります。

  • Powershellバージョン7以上
  • PnPOnlinePowershellモジュールのインストール
  • Entra IDへのアプリケーション登録
  • ダウンロード対象となるドキュメントライブラリへのアクセス権

環境整備

Powershellバージョン7.xのインストール

こちらのサイトからパッケージをダウンロードしてインストールします。

Powershell7.4は「ProgramFiles\PowerShell\7」にインストールされます。

PnPOnlineのインストールとアップデート

Powershellを起動して、以下のコマンドを実行してインストールを行います。

ご利用時には最新版にアップデートしてご利用を推奨いたします。

#新規インストール
Install-Module -Name PnP.PowerShell

#アップデート
Update-Module -Name PnP.PowerShell

Entra IDへのアプリケーション登録

Powershellを起動して、以下のコマンドを実行してアプリケーションを登録します。ここで登録されたアプリケーションのIDはPnPOnlineへのログイン時に必要になりますので控えておいてください。

Register-PnPEntraIDAppForInteractiveLogin -ApplicationName "<任意の名前>" -Tenant [契約ドメイン].onmicrosoft.com -Interactive

登録操作実施に確認可能ですが、以下の場所で後程確認も可能です。

  1. Entra IDの管理センターにログイン
  2. [アプリケーション]-[エンタープライズアプリケーション]を開く
  3. 上記で作成されたアプリケーション名をクリック
  4. プロパティ欄のアプリケーションIDを確認(またはコピー)
アプリケーションID

スクリプトの実行

事前に環境に合わせて変数に値を設定してください。

設定変数記載内容備考
$userNameSPOサイトにアクセスするユーザーアカウント名対象サイトのアクセス権が必要です。
$userPassword上記アカウントのパスワード
$siteURL移行対象のドキュメントライブラリが配置されているサイトURL
$FolderSiteRelativeURLドキュメントライブラリ名サイト作成時にデフォルト作成されるライブラリはShared Documents
$destinationFolderダウンロード先のローカルパス

ドキュメントライブラリ名はドキュメントライブライを開いたURLの以下の部分になります。
https://<契約ドメイン>.sharepoint.com/sites/<サイト名>/<ドキュメントライブラリ名>/Forms/AllItems.aspx

変数に必要な情報を登録したら以下のスクリプトを実行します。本作業で必要になるコマンドは「Get-PnPFolderItem」です。

下記スクリプトの14行目で指定するドキュメントライブラリ名を「/<ドキュメントライブラリ名>/<フォルダ名>」にすることでドキュメントライブラリルート以外のフォルダから下をすべてダウンロードすることも可能です。

# SharePointへのアクセス情報
$userName = "<SPOサイトにアクセス権のあるユーザーアカウント名>"
$userPassword = "<パスワード>"
$secPasswd = ConvertTo-SecureString $userPassword -AsPlainText -Force

# 移行対象のドキュメントライブラリが配置されているサイト情報
$siteURL = "https://<契約ドメイン>.sharepoint.com/sites/<サイト名>/"
[System.Management.Automation.PSCredential]$PSCredentials = New-Object System.Management.Automation.PSCredential($userName, $secPasswd)

# PnPでSharePoint Onlineに接続する(ClientIdはEntra IDで追加したアプリケーションのアプリケーションID)
Connect-PnPOnline -Url $siteURL -Credentials $PSCredentials -ClientId <アプリケーションID>

# ファイルの取得元ライブラリを指定
$FolderSiteRelativeURL = "/<ドキュメントライブラリ名>"
$destinationFolder ="<エクスポート先のフォルダパス>"

# 配下のフォルダ全部の情報を取得
$folderColl = Get-PnPFolderItem -FolderSiteRelativeUrl $FolderSiteRelativeURL -Recursive -ItemType Folder

# フォルダを順番にチェック
foreach($folder in $folderColl)
{
    # フォルダパスの取得
    $subFolderURL = $folder.ServerRelativeUrl.Substring($folder.Context.Web.ServerRelativeUrl.Length)

    # URLをローカルパスに変換
    $localFolder = $destinationFolder + ($subFolderURL -replace "/","\")

    # ローカルにフォルダがなければ作成する処理
    if( -not (Test-Path $localFolder))
    {
        New-Item -Path $localFolder -ItemType "directory"
    }

    # ファイルのダウンロード処理
    $filesColl = Get-PnPFolderItem -FolderSiteRelativeUrl $subFolderURL -ItemType File
    Foreach($File in $filesColl)
    {
        Get-PnPFile -ServerRelativeUrl $File.ServerRelativeUrl -Path $localFolder -FileName $File.Name -AsFile -force
    }
}

まとめ

本記事でご紹介したスクリプトでは、ドキュメントライブラリのフォルダ構造を含めてダウンロードする仕様としてみました。せっかくクラウドに保存したデータをわざわざローカルに落としてどうするんだとかはあるのですが、バックアップツールはなかなかの高額なツールとなっておりますので、そんなに簡単に導入できるものではないようです。

弊社でテストした時は特に問題はありませんでしたが、大規模なドキュメントライブラリからファイルダウンロードする際は、スロットリングに抵触する可能性がありますので、小規模なライブラリからお試しいただきますようお願いいたします。

弊社では、サービスの新規導入、設計変更や運用のご支援を行っております。サービス提供ご希望のお客様は下記よりお問い合せください

この記事を書いた人

大塚 英正のアバター 大塚 英正 エンジニア

主にMicrosoft365とGoogle Workspaceの販売と導入をやっています。

目次