PowershellでMFA(多要素認証)ログインをする【 Sharepoint Online】
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 Online | Install-Module SharePointPnPPowerShellOnline |
SharePoint 2019 | Install-Module SharePointPnPPowerShell2019 |
SharePoint 2016 | Install-Module SharePointPnPPowerShell2016 |
SharePoint 2013 | Install-Module SharePointPnPPowerShell2013 |
Proxyの内側にいるとか、PowershellGetが設定されていないとか、管理者権限がないとかいう場合は下記ページを参考にしてみてください。ひっかかりそうなものは全部対処法を書いたので、いらないコード削除すれば導入できると思います。
PnPPowerShellでSharepoint リストを取得する
Sharepointのプログラミングはデータベースのクエリ実行に似ています。クエリオブジェクトを作って、クエリを設定して、クエリ実行するとようやくデータ内容が返ってくる、というものです。PnPPowerShellも内部的にはそれと同じCSOMオブジェクトを使っているようです。その一連の動きを一つのコマンドレットで実行できるようにラッピングしてあるので、モノによってはCSOMオブジェクトを直接使うほうが早い場合もあるようです。
社内のOn-Premissサーバ にSharepointを導入している場合はそちらのほうが早いと思います。CSOMについては下記に記載していますので該当する方はそちらをまずご参照ください。
PnPPowerShellを使う場合は、まずConnect-PnPOnlineコマンドレットを使ってサイトコレクションに接続します。
1 2 3 |
# SiteCollection URL $SiteCollectionUrl = "https://tenant-name.sharepoint.com" $Connection = Connect-PnPOnline -Url $SiteCollectionUrl -UseWebLogin |
多要素認証(Multi Factor Authorization,MFA)が強制されている場合は、-UseWebLoginオプションを指定しないと接続できません。接続が拒否されて401 Not Authorizedが返ってきます(苦笑)
また、Sharepoint Onlineは「サブサイトが違ったら違う会社かもしれない」という前提があるので、サブサイトごとに認証が必要です。ですので$Connectionオブジェクトをあとの処理の引数にするとよいです。
次に、Contextを作ってサイトコレクションに接続します。これはGet-PnPContextコマンドレットを使います。
1 2 3 4 |
$context = Get-PnPContext $Web = $Context.Web $Context.Load($Web) $Context.ExecuteQuery() |
これで$Contextオブジェクトにサイトコレクションの情報が格納されます。$Web.Titleにはサイトコレクションのタイトル情報が入ります。
次にGet-PnPListコマンドレットで、サイトコレクションのリスト一覧が返ってきます。
1 |
Get-PnPList -Connection $Connection |
リストの内部名(Internal Name)が取得できるので、これを使ってListに含まれるitemを取得します。”List”という内部名のリストがあるとして、
1 2 3 4 |
$ListName = "List" $List = $Web.Lists.GetByTitle($ListName) $query = ([Microsoft.SharePoint.Client.CamlQuery]::CreateAllItemsQuery()) $items = Get-PnPListItem -List $ListName -Web $Web.Title -Query $query.ViewXml -Connection $Connection |
これで$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に全体ソースを載せているので参考にしてみてください。
“PowershellでMFA(多要素認証)ログインをする【 Sharepoint Online】” に対して1件のコメントがあります。