MFA Login to Sharepoint Online in Powershell

Sharepointの管理をPowershellでしていたのですが、多要素認証必須にするとCSOMライブラリ経由では認証が通らなくなってしまいました。ということで対処法。

・.Net Standard版のCSOMライブラリをつかう。 Tokenを埋め込むということなのでちょっと難しそう。
・Sharepoint PnPPowerShellライブラリをつかう。サンプルソースがほとんど無いのがネックですが、英語の技術文書を読む気があればなんとかなりそう。

ということで、PnPPowerShellを使う方向で話を進めます。

Sharepoint PnPPowerShellの導入

PnPとはSharePoint のパターンとプラクティス の略で、CSOMとGraph(REST) APIをラップしてPowershellから呼び出せるようにしたものです。サーバー・テナント管理者でなくともサイトコレクション管理者でも使えるコマンドレットが備わっています。これはMicrosoft主導のオープンソースとして開発されています。
参考)Sharepoint PnP PowerShellの概要(Microsoft)

Sharepoint Online Management Shellはサーバー・テナント管理者向けなので強力な処理ができますが、サイトコレクション管理者では使えないコマンドもたくさんあります。権限がないとログインすらできません💧
とりあえず、これを使っていくことで進めます。まずはインストールから。

インターネットに直接つながっている端末ならInstall-Moduleコマンドレットでいけます。

SharePoint バージョンインストールするコマンド
SharePoint OnlineInstall-Module SharePointPnPPowerShellOnline
SharePoint 2019Install-Module SharePointPnPPowerShell2019
SharePoint 2016Install-Module SharePointPnPPowerShell2016
SharePoint 2013Install-Module SharePointPnPPowerShell2013

Proxyの内側にいるとか、PowershellGetが設定されていないとか、管理者権限がないとかいう場合は下記ページを参考にしてみてください。ひっかかりそうなものは全部対処法を書いたので、いらないコード削除すれば導入できると思います。

PnPPowerShellでSharepoint リストを取得する

Sharepointのプログラミングはデータベースのクエリ実行に似ています。クエリオブジェクトを作って、クエリを設定して、クエリ実行するとようやくデータ内容が返ってくる、というものです。PnPPowerShellも内部的にはそれと同じCSOMオブジェクトを使っているようです。その一連の動きを一つのコマンドレットで実行できるようにラッピングしてあるので、モノによってはCSOMオブジェクトを直接使うほうが早い場合もあるようです。

社内のOn-Premissサーバ にSharepointを導入している場合はそちらのほうが早いと思います。CSOMについては下記に記載していますので該当する方はそちらをまずご参照ください。

PnPPowerShellを使う場合は、まずConnect-PnPOnlineコマンドレットを使ってサイトコレクションに接続します。

多要素認証(Multi Factor Authorization,MFA)が強制されている場合は、-UseWebLoginオプションを指定しないと接続できません。接続が拒否されて401 Not Authorizedが返ってきます(苦笑)

また、Sharepoint Onlineは「サブサイトが違ったら違う会社かもしれない」という前提があるので、サブサイトごとに認証が必要です。ですので$Connectionオブジェクトをあとの処理の引数にするとよいです。

次に、Contextを作ってサイトコレクションに接続します。これはGet-PnPContextコマンドレットを使います。

これで$Contextオブジェクトにサイトコレクションの情報が格納されます。$Web.Titleにはサイトコレクションのタイトル情報が入ります。
次にGet-PnPListコマンドレットで、サイトコレクションのリスト一覧が返ってきます。

リストの内部名(Internal Name)が取得できるので、これを使ってListに含まれるitemを取得します。”List”という内部名のリストがあるとして、

これで$itemsオブジェクトにリストの内容が格納されます。CSOMオブジェクトでは、LoadしてExecuteQueryしないと格納されなかったので随分コードがすっきりします。

データは$itemsオブジェクトにHash Tableとして格納されるので$items[0][“Title”]みたいな感じで呼び出さないとデータが表示されません。

データを更新したい場合は、Set-PnPListItemコマンドレットを使います。-Valueオプションに@{“Title” = “hogehoge”}みたいにHash Tableを指定するとデータが更新されます。

Item追加の場合はAdd-PnPListItemコマンドレットになります。オプションは似たようなものです。

次回はこれを使って古いOn-PremissサーバからSharepointオンラインにデータ移行するサンプルをご紹介しようかと思います。

PnPPowerShellのInstallからListItem取得までのサンプルソース

GitHubに全体ソースを載せているので参考にしてみてください。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください