• ccf代表

Share Point Onlineへのファイルアップロード(1)

目的

Share Point OnlineへのファイルをPowerShellで自動化する


課題

今回の作業の中で発見した問題には以下のものがありました。

  • 認証の方法がわからない

  • 接続コマンドに必須なパラメータが認証方式ごとに異なる

  • ファイルをアップする先のフォルダ名がわからない

  • Automationで実施すると、正常終了しない


認証の方法がわからない

接続コマンドに必要なパラメータが認証方式ごとに異なる

Share Point OnlineへのPowerShellでの接続には、証明書認証とアプリケーション用のIDとパスワードを使用する方法があります。

ここで躓いたのは、作業がAzure ADだとうまく行かない点です。証明書認証はうまく行ったのですが、アプリケーション用IDはだめでした。


証明書認証での接続

a)証明書認証の作り方

まず、クライアント証明書を作成します。

実はMSが出しているAuzreへのP2S VPN接続時のクライアント証明書作成方法と同じです。

https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-certificates-point-to-site


ルート証明書の作成

$cert = New-SelfSignedCertificate `
	-Type Custom `			#カスタムで証明書を作る
	-KeySpec Signature `		#秘密鍵の目的
	-Subject "CN=RootCert" `	#証明署名(コモンネーム)
	-KeyExportPolicy Exportable `	#キーをエクスポート可能
	-HashAlgorithm sha256 `		#ハッシュアルゴリズム
	-KeyLength 2048 `		#キーの長さ
	-CertStoreLocation "Cert:\CurrentUser\My" `#Windowsの場合は現在のユーザの個人
	-KeyUsageProperty Sign `	#鍵の使用方法
	-KeyUsage CertSign		#キーの使用方法

クライアント証明書の作成 ※先ほどのコマンドに続けて実行

New-SelfSignedCertificate `
    -Type Custom `             #カスタムで署名を作る
    -DnsName ClientCert `    #証明署名(DNS名)
    -KeySpec Signature `       #秘密鍵の目的
    -Subject "CN=ClientCert" `    #証明署名(コモンネーム)
    -KeyExportPolicy Exportable ` #キーをエクスポート可能
    -HashAlgorithm sha256 `       #ハッシュアルゴリズム
    -KeyLength 2048 `             #キーの長さ
    -CertStoreLocation "Cert:\CurrentUser\My" ` #Windowsの場合は現在のユーザの個人
    -Signer $cert `            #先程作ったルート証明書で署名する
    -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2") #クライアント証明書

もし、クライアント証明書を作ったホスト以外でPowerShellを実行する場合には、ルート証明書とクライアント証明書をエクスポートしてください。


b)アプリケーションの登録

Azure ADの「アプリの登録」から、「新規登録」を選びます。


アプリケーション名は適当で大丈夫です。今回のPowerShellで使用するアプリであることがわかればいいと思います。

Share Pointへのアクセス権限を付与します。今回はテストなので、Share Point関連のすべての権限を付与しています。

先程作ったルート証明書(CER形式)を「証明書のアップロード」からアップします。


c)接続

PowerShellを実行する端末、Automationを利用する場合には、Automationアカウントへルート証明書とクライアント証明書をインストール(配置)します。


接続に必要な情報を取得し、以下のように実行します。

$conn = Connect-PnPOnline `
    -Url https://xxx.sharepoint.com/sites/API `    #接続したいSharePointサイトのURL
    -ClientId xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx `#アプリ登録をした後に、概要から取得できるアプリケーション(クライアント)ID
    -Thumbprint 28979FFD4EEC19B69D2F7564DB116689D9AEDEB7 `#作ったクライアント証明書の拇印
    -Tenant xxx.onmicrosoft.com `#SharePointテナントのドメイン

アプリケーションIDでの接続

次に、アプリケーションIDでの接続を試します。

ちなみに「証明書とシークレット」で新しいクライアントシークレットを作ってみましたが、以下のような警告がでて、接続できていませんでした。もちろん、「-WarningAction Ignore」を追加しても接続はできませんでした。


WARNING: Connecting with Client Secret uses legacy authentication and provides limited functionality. We can for instance not execute requests towards the Microsoft Graph, which limits cmdlets related to Microsoft Teams, Microsoft Planner, Microsoft Flow and Microsoft 365 Groups. You can hide this warning by using Connect-PnPOnline [your parameters] -WarningAction Ignore


そこで、SharePoint側で接続用のIDを作ってみたいと思います。


a)クライアントIDとシークレットの生成

以下のURLにアクセスしてください。「xxx」は自身のSharePointサイトに合わせて読み替えてください。

https://xxx.sharepoint.com/_layouts/15/appregnew.aspx


以下のように表示されるので、初めてときは「クライアントID」と「クライアントシークレット」は生成ボタンを教えて、生成してください。

タイトルは任意、「アプリドメイン」は、先程証明書でも使った”Tenant”でいいと思います。「リダイレクト先のURI」は検証なので、何度もいいかと思います。


b)アクセス権の付与

先ほど自動生成した「クライアントID」を「アプリID」として、入力し、「参照」をクリックします。そして、「権限要求のXML」には、以下のようにすべてのアクセス権を付与する設定として、以下のように入れます。

<AppPermissionRequests AllowAppOnlyPolicy="true">
<AppPermissionRequest Scope="http://sharepoint/content/tenant" Right="FullControl" />
</AppPermissionRequests>

c)接続

そして、以下のようなコマンドを入力すると接続できるようになります。

$conn=Connect-PnPOnline `
    -Url https://xxx.sharepoint.com/sites/API ` #接続したいSharePointサイトのURL
    -ClientId XXXXXXX-XXXX-XXXX-XXXX-XXXXXXX  ` #アプリ登録をした後に、自動生成したクライアント(アプリ)ID
    -clientsecret "XXXXXXXXXXXXXXXXXXXXXX" `    #自動生成したクライアントシークレット

まとめ

振り返れば、簡単なはなしなんですが、クライアントIDとクライアントシークレットでの接続にこだわったため、少し時間がかかってしましたが、認証方法はわかりました。

接続用アプリからクライアント証明書で接続する場合とクライアントIDとクライアントシークレットで接続する場合に、若干パラメータに違いがあることです。


今日はここまで。次回はファイルのアップロードです。

閲覧数:3,038回0件のコメント