接続の確立
CData Cmdlets ユーザーは、データモジュールをインストールし、接続プロパティを設定してスクリプトを開始できます。このセクションでは、CSV インポートおよびエクスポートcmdlet などのネイティブPowerShell cmdlet でD365BusinessCentral Cmdlets を使用する例を示します。
インストールおよび接続
PSGet がある場合は、PowerShell Gallery から次のコマンドを使ってcmdlet をインストールできます。CData サイトからセットアップを取得することもできます。
Install-Module D365BusinessCentralCmdlets
プロファイルに以下を追加すると、次のセッションでcmdlet がロードされます。
Import-Module D365BusinessCentralCmdlets;
Connect-D365BusinessCentral cmdlet を使って、別のcmdlet に渡すことができる接続オブジェクトを作成します。
$conn = Connect-D365BusinessCentral -OrganizationUrl "https://api.businesscentral.dynamics.com/v1.0/api/v1.0"
クラウドエンドポイント
データに接続するには、OrganizationUrl を指定します。OrganizationUrl は、次のいずれかに設定する必要があります。
- https://businesscentral.dynamics.com/abc123/ などのBusiness Central アカウントへのエンドポイント。
- Web サービスのルート。
- カスタムAPI のベースURL。
オンプレミスエンドポイント
以下はオンプレミスのエンドポイントの例です。
https://base URL:port/serverinstance/api/API publisher/API group/API version/ https://base URL:port//serverinstance/ODataV4 https://myInstance/.local:7048/BC220/ODataV4URL はデフォルトでブロックされているため、管理者がアクセスを許可する必要があります。
OrganizationUrl を指定する方法、および利用可能なエンドポイントについての詳細は、Business Central エンドポイント を参照してください。
組織内に複数の会社がある場合は、どの会社に接続するかを特定するためにCompany を指定できます。 Company を空白のままにすると、本製品 はすべての会社を個別のスキーマとして取得します。
ユーザーおよびアクセスキー
Note:2021年4月以降、クラウド版ではユーザーおよびアクセスキー認証がサポートされなくなります。オンプレミスの場合、Web Service Access Key(Basic Auth)は当分の間オプションとして残ります。
アクセスキー認証を使用するには、AuthScheme をAccess Key に設定します。 Microsoft Dynamics 365 Business Central に認証するには、User およびAccessKey 接続プロパティを指定します。 Microsoft では、これらをテストおよび開発目的で推奨します。ただし、運用環境での使用は推奨していません。
User およびAccessKey の値を取得するには、Microsoft Dynamics 365 Business Central の[ユーザー]ページに移動して[編集]をクリックします。User Name および Web Service Access Key の値は、User およびPassword 接続文字列プロパティとして入力する値です。User Name はE メールアドレス ではありません。短縮されたユーザー名です。
Microsoft Dynamics 365 Business Central への接続
Microsoft Dynamics 365 Business Central データソースを認証する前に、OrganizationUrl を接続先の組織のURL に設定します。v1とv2のどちらを使用しているかによって、見え方が異なります。OrganizationUrl の各種フォーマットについては、Business Central エンドポイント を参照してください。
アクセスキー
User およびAccessKey を設定し、Microsoft Dynamics 365 Business Central データソースへ認証します。
Azure AD
Azure AD は、Microsoft のマルチテナント、クラウドベースのディレクトリおよびID 管理サービスです。これはユーザーベースの認証で、AuthScheme をAzureAD に設定する必要があります。
デスクトップアプリケーション
CData は、デスクトップでの認証を簡単にする埋め込みOAuth アプリケーションを提供します。接続の前に、以下の変数を設定します。
- InitiateOAuth:GETANDREFRESH。OAuthAccessToken を自動的に取得およびリフレッシュするために使用します。
CData は、デスクトップでの認証を簡単にする埋め込みOAuth アプリケーションを提供します。例えば、ユーザーがインターネットに接続されていないローカルサーバーを使用しているような場合に利用できます。
また、Microsoft Dynamics 365 Business Central コンソールで設定および登録するカスタムOAuth アプリケーションを介してデスクトップから認証することもできます。詳しくは、カスタムOAuth アプリケーションの作成 を参照してください。
- カスタムAzure AD アプリケーションのみ:
- OAuthClientId:カスタムOAuth アプリケーションの登録時に割り当てられたクライアントId。
- OAuthClientSecret:カスタムOAuth アプリケーションの登録時に割り当てられたクライアントシークレット。
- CallbackURL:カスタムOAuth アプリケーションの登録時に定義されたリダイレクトURI。
接続すると、本製品 はデフォルトブラウザでMicrosoft Dynamics 365 Business Central のOAuth エンドポイントを開きます。ログインして、アプリケーションにアクセス許可を与えます。
アクセストークンの期限が切れたときは、本製品 は自動でアクセストークンをリフレッシュします。
ヘッドレスマシン
ヘッドレスマシンに置かれているリソースにログインする必要がある場合は、インターネットブラウザに対応した別の端末で認証する必要があります。 以下のいずれかの方法で行います。- 後述のVerifier code を取得および交換に従い、OAuthVerifier 値を取得します。
- 別のマシンに本製品 をインストールし、通常のブラウザベースのフローで認証した後でOAuth 認証値を転送します。
いずれかのオプションを実行後、ヘッドレスマシンからアクセストークンを自動的にリフレッシュするようにドライバーを設定します。
Verifier code を取得および交換
Verifier code を取得するには、インターネットブラウザがあるマシンからOAuth 認可URL で認証し、OAuthVerifier 接続プロパティを取得する必要があります。
- 以下のオプションから選択します。
- 埋め込みOAuth アプリケーションを使用する場合は、Microsoft Dynamics 365 Business Central OAuth endpoint をクリックし、ブラウザでエンドポイントを開きます。
- カスタムOAuth アプリケーションを使用する場合は、以下のプロパティを設定して認可URL を作成します。
- InitiateOAuth:OFF。
- OAuthClientId:アプリケーションの登録時に割り当てられたクライアントId。
- OAuthClientSecret:アプリケーションの登録時に割り当てられたクライアントシークレット。
- ログインして、本製品 にアクセス許可を与えます。verifier code を含むコールバックURL にリダイレクトされます。
- verifier code の値を保存します。後ほどこれをOAuthVerifier 接続プロパティに設定します。
OAuth 認証値を取得するには次のプロパティを設定します。
- InitiateOAuth:REFRESH。
- OAuthVerifier:verifier code。
- OAuthSettingsLocation:ドライバーがOAuth トークン値を保存するファイルの場所。これは接続間で維持されます。
- カスタムアプリケーションのみ:
- OAuthClientId:(カスタムアプリのみ)カスタムOAuth アプリケーション設定のクライアントId に設定。
- OAuthClientSecret:(カスタムアプリのみ)カスタムOAuth アプリケーション設定のクライアントシークレットに設定。
OAuth 設定ファイルが生成されたら、以下のように接続プロパティをリセットします。
- InitiateOAuth:REFRESH。
- OAuthSettingsLocation:暗号化されたOAuth 認証値が保存される場所。アクセストークンの自動リフレッシュを有効にするために、この場所が本製品 に読み書きのアクセス許可を与えることを確認してください。
- カスタムアプリケーションのみ:
- OAuthClientId:アプリケーションの登録時に割り当てられたクライアントId。
- OAuthClientSecret:アプリケーションの登録時に割り当てられたクライアントシークレット。
OAuth 設定を転送
ヘッドレスマシンでの接続に先立ち、インターネットブラウザに対応したデバイスでドライバーとの接続を作成し、インストールする必要があります。上述の「デスクトップアプリケーション」の説明に従って、接続プロパティを設定します。
「デスクトップアプリケーション」の手順が完了すると、生成された認証値は、OAuthSettingsLocation で指定された場所に暗号化されて書き込まれます。デフォルトのファイル名はOAuthSettings.txt です。
接続が正常にテストされたら、OAuth 設定ファイルをヘッドレスマシンにコピーします。
ヘッドレスマシンで、次の接続プロパティを設定し、データに接続します。
- InitiateOAuth:REFRESH。
- OAuthSettingsLocation:OAuth 設定ファイルの場所。アクセストークンの自動リフレッシュを有効にするために、この場所が本製品 に読み書きのアクセス許可を与えることを確認してください。
- カスタムアプリケーションのみ:
- OAuthClientId:アプリケーションの登録時に割り当てられたクライアントId。
- OAuthClientSecret:アプリケーションの登録時に割り当てられたクライアントシークレット。
Azure サービスプリンシパル
Azure サービスプリンシパルは、ロールに基づいたアプリケーションベースの認証です。これは、認証がユーザーごとではなく、アプリケーションごとに行われることを意味します。 アプリケーションで実行されるすべてのタスクは、デフォルトユーザーコンテキストなしで、割り当てられたロールに基づいて実行されます。 リソースへのアプリケーションのアクセスは、割り当てられたロールの権限によって制御されます。
Azure サービスプリンシパル認証の設定方法については、以下を参照してください。
カスタムOAuth アプリケーションの作成
Microsoft Dynamics 365 Business Central は、Azure AD およびAzure サービスプリンシパルを使用した認証をサポートしています。どちらもOAuth ベースの認証です。このトピックでは、以下の方法を説明します。
- Azure AD またはAzure サービスプリンシパル用のカスタムOAuth アプリケーションの作成と登録
- カスタムOAuth アプリケーションに管理者の同意を提供
Azure AD
portal.azure.com で:- https://portal.azure.com にログインします。
- 左側のナビゲーションペインでAzure Active Directory -> アプリの登録を選択します。
- 新規登録をクリックします。
- アプリケーションの名前を入力します。
- シングルかマルチテナントか、パブリックかプライベートか、希望するテナント設定を選択します。
- デフォルトのオプション[この組織ディレクトリ内のアカウントのみ]を選択する場合は、CData Cmdlets PowerShell Module for Microsoft Dynamics 365 Business Central への接続を確立するときにAzureTenant 接続プロパティをAzure AD テナントのId に設定する必要があります。それ以外の場合は、認証に失敗しエラーが発生します。
- アプリケーションが個人使用のみの場合は、この組織ディレクトリ内のアカウントのみを指定します。
- アプリケーションを配布する場合は、マルチテナントオプションのいずれか1つを選択してください。
- リダイレクトURL をhttp://localhost:33333(本製品 のデフォルト)に設定するか、または別のポートを指定し、CallbackURL を定義した正確なリプライURL に設定します。
- 登録をクリックして新しいアプリケーションを登録します。アプリケーション管理画面が表示されます。
OAuthClientId としてApplication (client) ID の値、AzureTenant としてDirectory (tenant) ID の値をメモします。 - 証明書とシークレットセクションに移動して、アプリケーションの認証タイプを定義します。認証には、証明書(推奨)とクライアントシークレットの2種類があります。
- 証明書による認証:証明書とシークレットで証明書のアップロードを選択し、ローカルマシンから証明書をアップロードします。
- 新しいクライアントシークレットの作成:証明書とシークレットで新しいクライアントシークレットを選択し、有効期限を指定します。クライアントシークレットが保存されると、Microsoft Dynamics 365 Business Central はキーの値を表示します。 表示は一度のみなのでこの値をコピーします。 この値がOAuthClientSecret となります。
- API のアクセス許可 -> アクセス許可の追加 -> 委任されたアクセス許可を選択します。
- 変更を保存します。
- 管理者の同意が必要なアクセス許可を使用することを指定した場合は、API のアクセス許可ページで現在のテナントから付与することができます。
Azure サービスプリンシパル
Azure サービスプリンシパル認証を使用するには、認証アプリケーションにロールを割り当てる機能を設定したのち、Azure AD テナントにアプリケーションを登録し、新しい サービスプリンシパルを作成し、さらにBusiness Central で外部アプリケーションアカウントを作成する必要があります。この新しいサービスプリンシパルは、割り当てられたロールベースのアクセス制御を利用して、サブスクリプション内のリソースにアクセスできます。portal.azure.com で:
- 前述のように、カスタムOAuth AD アプリケーションを作成します。
- 検索バーを使用してサブスクリプションサービスを検索します。
- サブスクリプションページを開きます。
- アプリケーションを割り当てるサブスクリプションを選択します。
- アクセス制御(IAM)を開きます。
- 追加 -> ロール割り当ての追加を選択します。Microsoft Dynamics 365 Business Central はロール割り当ての追加ページを開きます。
- 作成したカスタムAzure AD アプリケーションに所有者ロールを割り当てます。
- カスタムアプリケーション用にBusiness Central で外部アプリケーションアカウントを作成します。
管理者の同意
カスタムアプリケーションの中には、Azure Active Directory テナント内で操作するために管理者権限が必要なものがあります。管理者の同意は、新しいカスタムOAuth アプリケーションを作成する際に、すでに"Admin Consent Required" とマークされている関連パーミッションを追加することで付与できます。管理者の同意は、OAuth フローでクライアント資格情報を使用する場合にも必要です。
管理者の同意を付与するには:
- 管理者にportal.azure.com にログインしてもらいます。
- アプリの登録に移動し、作成したカスタムOAuth アプリケーションを見つけます。
- API のアクセス許可で、同意の付与をクリックします。
Managed Service Identity (MSI)
Azure VM 上でMicrosoft Dynamics 365 Business Central を実行しており、MSI を利用して接続したい場合は、AuthScheme をAzureMSI に設定します。
User-Managed Identities
マネージドID のトークンを取得するには、OAuthClientId プロパティを使用してマネージドID の"client_id" を指定します。VM に複数のユーザーが割り当てられたマネージドID がある場合は、OAuthClientId も指定する必要があります。
Kerberos
Kerberos 経由でMicrosoft Exchange への認証を行うには、認証プロパティを定義し、Kerberos が認証チケットを取得する方法を選択する必要があります。Kerberos を使用してMicrosoft Exchange への認証を行うには、次のプロパティを設定します。
- hive.server2.authentication:Kerberos。
- AuthScheme:NEGOTIATE。
- KerberosKDC:Kerberos KDC マシンのホスト名またはIP アドレス。
- KerberosRealm:Microsoft Exchange Kerberos プリンシパルのレルム。この値は、主たる値の'@' 記号のすぐ後にあります。
- KerberosSPN:Microsoft Exchange のKerberos プリンシパルのサービスとホスト。この値は、主たる値の'@' 記号のすぐ前にあります。
認証値に加えて、以下を設定します。
- Server:接続するExchange サーバーのアドレス。
- Platform:Microsoft Exchange のバージョン。
- Schema:EWS.A。
データの取得
Select-D365BusinessCentral cmdlet はデータを取得するためのネイティブなPowerShell インターフェースを提供します。
$results = Select-D365BusinessCentral -Connection $conn -Table "Accounts" -Columns @("accountid, Name") -Where "Name='MyAccount'"Invoke-D365BusinessCentral cmdlet はSQL インターフェースを提供します。このcmdlet を使うと、Query パラメータを介してSQL クエリを実行できます。
cmdlet 出力のパイプ処理
cmdlet は行オブジェクトをパイプラインに一度に一行ずつ返します。以下は、結果をCSV ファイルにエクスポートします。
Select-D365BusinessCentral -Connection $conn -Table Accounts -Where "Name <> 'MyAccount'" | Select -Property * -ExcludeProperty Connection,Table,Columns | Export-Csv -Path c:\myAccountsData.csv -NoTypeInformation
Select-D365BusinessCentral からの結果をSelect-Object cmdlet にパイプして、Export-CSV cmdlet にパイプする前にいくつかのプロパティを実行していることがわかるでしょう。これをする理由は、CData Cmdlets は接続、テーブル、およびカラムの情報を結果セットの各行オブジェクトに追加しますが、必ずしもその情報がCSV ファイルに必要ではないからです。
ただし、これによってcmdlet の出力を別のcmdlet にパイプすることが容易になります。以下に、結果セットをJSON に変換する例を示します。
PS C:\> $conn = Connect-D365BusinessCentral -OrganizationUrl "https://api.businesscentral.dynamics.com/v1.0/api/v1.0" PS C:\> $row = Select-D365BusinessCentral -Connection $conn -Table "Accounts" -Columns (accountid, Name) -Where "Name <> 'MyAccount'" | select -first 1 PS C:\> $row | ConvertTo-Json { "Connection": { }, "Table": "Accounts", "Columns": [ ], "accountid": "Myaccountid", "Name": "MyName" }
データの削除
以下は、抽出条件に合うあらゆるレコードを削除します。
Select-D365BusinessCentral -Connection $conn -Table Accounts -Where "Name = 'MyAccount'" | Remove-D365BusinessCentral
データの変更
cmdlet はデータクレンジング同様、データの変換を容易にします。次の例は、レコードがすでに存在するかどうか、挿入する前に更新が必要かどうかをチェックしてから、CSV ファイルのデータをMicrosoft Dynamics 365 Business Central にロードします。
Import-Csv -Path C:\MyAccountsUpdates.csv | %{ $record = Select-D365BusinessCentral -Connection $conn -Table Accounts -Where ("AccountId = `'"+$_.AccountId+"`'") if($record){ Update-D365BusinessCentral -Connection $conn -Table Accounts -Columns @("accountid","Name") -Values @($_.accountid, $_.Name) -Where "AccountId = `'$_.AccountId`'" }else{ Add-D365BusinessCentral -Connection $conn -Table Accounts -Columns @("accountid","Name") -Values @($_.accountid, $_.Name) } }