【PowerShell】多要素認証ありでSharePoint Onlineに接続する

Microsoft365
スポンサーリンク

Powershellを利用するとき対話方式というよりps1ファイルを実行する方が多いです。そんな中今までどおりps1ファイルを実行しようとするとエラーが発生するのです!

The sign-in name or password does not match one in the Microsoft account system

最初、アカウントとパスワードは間違っていないのになぜこんなエラーが出るのだろう?と思いました。原因はMicrosoft365アカウントを2要素認証に対応したためです。ですのでソースコードを変更しなければなりません。

こちらのサイトのソースコードを変更します。

スポンサーリンク

PnP PowerShell を利用する

まず初めにPnP PowerShellをインストールします。PnP PowerShellとはオープンソースでコミュニティが提供するライブラリのことです。Microsoftから直接サポートを受けているわけではありませんが、Microsoftの関係者がかかわっているコミュニティのようです。

PnP PowerShellが用意しているコマンドレットを利用すれば2要素認証に対応したソースコードが書けます。インストールコマンドはこちら。

Install-Module -Name "PnP.PowerShell"
Import-Module PnP.PowerShell

しかーし、ここでエラーが発生しました。

Import-Module : ファイルまたはアセンブリ…、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

Import-Module ができません。なぜでしょう?それはPowerShellのバージョンが関係していました。

PowerShell 7 にバージョンアップする

最新のPnP PowerShell を動かすには PowerShell 7.2 以上にする必要がありました。私PCのバージョンは5でした。いつのまに7になったんや…。

手っ取り早くインストールするためパッケージ版のインストーラーを以下のサイトからゲットしました。

Windows への PowerShell のインストール - PowerShell
Windows への PowerShell のインストールに関する情報

インストーラーをダウンロードして、実行するだけです。インストール中に謎のキャラクターが現れました。あんた誰や…PowerShellのキャラクターなんでしょうか?全く萌えないんですけど。(今は「萌え」という言葉は死語か?)

手に何持ってるの??

ソースコードを変更する

変更前ソースコードです。SharePoint Online に接続するまで記載します。

#.NET CSOM モジュールの読み込み
# SharePoint Online Client Components SDK をダウンロードする
# https://www.microsoft.com/en-us/download/details.aspx?id=42038
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\16\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

#SharePointに接続する
$siteUrl = "https://xxxxxxxxx.sharepoint.com/sites/testportal"
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)

$accountName = "papa@papamamameyou.com"
$password = ConvertTo-SecureString -AsPlainText -Force "password"
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($accountName, $password)
$ctx.Credentials = $credentials

#リストの取得
$list = $ctx.Web.Lists.GetByTitle("UserInfoTable");

SharePoint Online Client Components SDK を利用して接続していました。今度はPnP PowerShellを利用します。変更後のソースコードはこちら。

#ログイン 2要素認証対応
$siteUrl = "https://xxxxxxxxx.sharepoint.com/sites/testportal"
Connect-PnPOnline -Interactive -Url $siteUrl

$ctx = Get-PnPContext

#リストの取得
$list = $ctx.Web.Lists.GetByTitle("UserInfoTable");

変更後ソースコードの最後

Disconnect-PnPOnline

すごくシンプルなコードになりましたね!Connect-PnPOnline コマンドで2要素認証対応画面が開きますのでアカウントやパスワードや2要素認証対応を行うと次へすすみます。

まとめ

PowerShell が6になり7になっていたこと知りませんでした。自動でアップグレードしてくれないかな…。

コメント

タイトルとURLをコピーしました