SharePoint OnlineをPowerShellで操作する方法はいくつかあるけれど、Invoke-Webrequestを使わずやってみる。
1. Entra IDからアプリの登録
バッチ処理が前提のため、まずEntra IDからSharePoint Online操作用のアプリを登録する。
■ 必要な設定項目のみ抜粋
[構成されたアクセス許可]
・Microsoft Graphから「アプリケーションの許可」
・Files.ReadWrite.All
・Sites.Read.All
[証明書とシークレット]
自己証明書の作成とThumbprintの取得
$certname = "spo-test"
$crt = New-SelfSignedCertificate -Subject "CN=$certname" -CertStoreLocation "Cert:\CurrentUser\My" -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256 -NotAfter(Get-Date).AddYears(20)
$crt | select Thumbprint
先の手順で作成した証明書をアップロード
2. SharePoint Onlineにファイルをアップロード
実際にPowerShellを使ってSharePoint Onlineにファイルをアップロードしてみる。
例)サイト名:テストサイトのドキュメントにあるテストフォルダにローカルのhoge.txtファイルをアップロード
$uploadFile = "C:\folder\hoge.txt"
$fileName = "hoge.txt"
try {
Connect-MgGraph -ClientId "先の手順で作成したアプリ登録のClient ID" -CertificateThumbprint "先の手順で取得したThumbprint" -NoWelcome
Write-Host "[Info] SPOに接続しました"
} catch {
Write-Host "[Error] SPOに接続できませんでした"
exit
}
$SiteID = Get-MgSite -Search "テストサイト" | Select-Object -ExpandProperty Id
$driveID = (Get-MgSiteDrive -SiteId $siteID | Where-Object {$_.Name -eq "ドキュメント"}).Id
$documentDriveItemID = (Get-MgDriveItemChild -DriveId $driveID -DriveItemId "root" | Where-Object {$_.Name -eq "ドキュメント"}).Id
$uploadFolderID = (Get-MgDriveItemChild -DriveId $driveID -DriveItemId $documentDriveItemID | Where-Object {$_.Name -eq "テストフォルダ"}).Id
$driveItemID = $uploadFolderID+":/"+$fileName+":"
try {
Set-MgDriveItemContent -DriveId $driveID -DriveItemId $driveItemID -InFile $uploadFile
} catch {
Write-Host "[Error] SPOにアップロードできませんでした"
}
Disconnect-MgGraph
3. はまりどころ
Set-MgDriveItemContentのリファレンスマニュアルの説明が少なすぎて使い方がわからなかった…
DriveItemIdの引数、素直に考えるとそのままDriveItem IDを入力すればよいと思いきや、それだとダメ
実際のところは…
DriveItem ID+ “:/”+アップロードする際の任意のファイル名+”:”
こんなのわからないって…