Oh! 365 blog

Office 365 と生きていく

PnP ライブラリを使用して SharePoint Online のスクリプトをモダン認証 (先進認証) に対応させる方法


PnP のライブラリを使用して、SPO に対する CSOM 実行をモダン認証に対応させる方法をまとめます。

SPO で、レガシー認証をブロックする設定とした場合、SharePointOnlineCredentials クラスの認証を使用したスクリプトもブロックされます。
管理センターでは、この設定です。
 

f:id:keisuke-blog:20190628140819p:plain

SharePoint 管理センターの設定
SharePoint Online 管理シェルを使用する場合は、LegacyAuthProtocolsEnabled プロパティが該当します。コマンドからの変更はこちらです。 Set-SPOTenant
 
SharePointOnlineCredentials クラスは、CSOM スクリプトの認証として使用されるため、CSOM スクリプトを実行する場合、モダン認証に対応した認証方式に変更する必要があります。

 

0 個の引数を指定して "ExecuteQuery" を呼び出し中に例外が発生しました: "Cannot contact web site 'https://contoso.sharepoint.com/' or the web site does not support SharePoint Online credentials.

 

対処方法

 

モダン認証を使用した認証方法への変更として、最も簡単と考えられる方法は、PnP ライブラリの AuthenticationManager クラスの GetWebLoginClientContext メソッドを使用する方法です。
必要な対応は、PnP Core のライブラリを読み込むことと、数行のコード変更です。
サンプルコードは下記 Microsoft の開発チームのブログでも紹介されています。

blogs.technet.microsoft.com

 

 

注意点

注意点として、この方法は実行の度に資格情報を入力するダイアログが表示されるため、バッチ処理などの無人実行のスクリプトには対応できません。
無人実行のためのスクリプトをモダン認証に対応させるには、Azure AD 上に作成したサービス プリンシパル (アプリ用の実行アカウント) を使用した証明書認証などが必要となります。
(次回はここの内容を書こうかと思います。)


手動で実行しているスクリプトであれば、GetWebLoginClientContext メソッドへの置き換えが簡単かと思います

以下にサンプルを示して終わります。

サンプルの紹介


事前準備として、
SharePointPnPPowerShellOnline をインストールします。

NuGet を使う方法や、zip ファイルをダウンロードして任意のディレクトリに展開する方法もありますし、PowerShell 5.0 以降では下記コマンドでモジュールのインストールが可能です。

Install-Module SharePointPnPPowerShellOnline

インストールしたモジュールを呼び出す場合は下記コマンドです。

Import-Module SharePointPnPPowerShellOnline


以下呼び出しのサンプルコードです。 

 
従来の SharePointOnlineCredentials クラスを使用し、サイト名をコンソールに表示するサンプル

$siteUrl = "https://contoso.sharepoint.com/sites/site01";
$username = "admin@contoso.onmicrosoft.com";
$password = "password";
$secpass = convertto-securestring $password -AsPlainText -Force


$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($username, $secpass);

$clientContext = New-Object Microsoft.SharePoint.Client.ClientContext($siteURL)
$clientContext.Credentials = $credentials

$clientContext.Load($clientContext.Web)
$clientContext.ExecuteQuery();

Write-Host $clientContext.Web.Title

 

AuthenticationManager クラスの GetWebLoginClientContext メソッドに置き換えた例


$authManager = new-object OfficeDevPnP.Core.AuthenticationManager;
$clientContext = $authManager.GetWebLoginClientContext($siteUrl);

$clientContext.Load($clientContext.Web)
$clientContext.ExecuteQuery();

Write-Host $clientContext.Web.Title
実行時に資格情報を入力するダイアログが表示されるので、ID と パスワードを入力する必要があります。
おわりに

PnP のライブラリやコマンドは、どんどん開発が進んでいて、ほんとに便利になっています。CSOM で一から実装しなくとも、大抵 PnP 側で用意されていることが多いです。不具合報告などは直接コミュニティに問い合わせる必要がありますが、ぜひたくさん使って、フィードバックしていきましょう。

CSOM モジュールのパッケージ管理や PnP コミュニティについては、下記記事をご参考ください。

mountfuji.hatenablog.com

mountfuji.hatenablog.com