次の方法で共有


サービス プリンシパルを使用して Premium ワークスペースとセマンティック モデルのタスクを自動化する

サービス プリンシパルは、無人リソースとサービス レベルの操作を実行するためにテナント内で作成する Microsoft Entra ID アプリの登録 です。 これらは、アプリ名、アプリケーション ID、テナント ID、およびパスワードの クライアント シークレット または証明書を持つ一意の種類のユーザー ID です。

Power BI Premium では、Power BI Embedded と同じサービス プリンシパル機能が使用されます。 詳細については、「 サービス プリンシパルを使用した Power BI コンテンツの埋め込み」を参照してください。

Power BI Premium では、 XMLA (XML 分析) エンドポイント でサービス プリンシパルを使用して、ワークスペースのプロビジョニング、モデルのデプロイ、セマンティック モデルの更新などのセマンティック モデル管理タスクを自動化できます。

  • PowerShell。
  • Azure Automation。
  • Azure Logic Apps。
  • カスタム クライアント アプリケーション。

サービス プリンシパルを使用して XMLA エンドポイント接続をサポートするのは 、新しいワークスペース のみです。 クラシック ワークスペースはサポートされていません。 サービス プリンシパルには、割り当てられているワークスペースでタスクを実行するために必要なアクセス許可のみが付与されます。 アクセス許可は、通常の UPN (ユーザー プリンシパル名) アカウントと同様に、ワークスペース アクセスによって割り当てられます。

書き込み操作を実行するには、容量のセマンティック モデル ワークロードで 、読み取り/書き込み操作に対して XMLA エンドポイントが有効になっている必要があります。 Power BI Desktop から発行されたセマンティック モデルでは、 拡張メタデータ形式機能が 有効になっている必要があります。

サービス プリンシパルを作成する

サービス プリンシパルは、Azure portal または PowerShell を使用してアプリ登録として作成されます。 サービス プリンシパルを作成するときは、アプリ名、アプリケーション (クライアント) ID、ディレクトリ (テナント) ID、およびクライアント シークレットを個別にコピーして保存してください。 サービス プリンシパルを作成する手順については、次を参照してください。

Microsoft Entra セキュリティ グループを作成する

既定では、サービス プリンシパルは、有効になっているテナント設定にアクセスできます。 管理者の設定に応じて、アクセスには特定のセキュリティ グループまたは組織全体を含めることができます。

サービス プリンシパルのアクセスを特定のテナント設定に制限するには、特定のセキュリティ グループへのアクセスを許可します。 または、サービス プリンシパル専用のセキュリティ グループを作成し、目的のテナント設定から除外することもできます。 セキュリティ グループを作成してサービス プリンシパルを追加するには、「 基本的なグループを作成し、Microsoft Entra ID を使用してメンバーを追加する」を参照してください。

サービス プリンシパルを有効にする

Power BI でサービス プリンシパルの使用を開始するには、管理者が Power BI 管理ポータルでサービス プリンシパル アクセスを有効にする必要があります。

  1. Power BI 管理ポータルに移動し、[ テナントの設定] を選択します。
  2. [開発者設定] までスクロールし、[Service Principals can call Fabric public API]\(Fabric パブリック API を呼び出すことができるサービス プリンシパル\) を展開します
  3. [有効] を選択します
  4. セキュリティ グループにアクセス許可を適用するには、[ 特定のセキュリティ グループ (推奨)] を選択します。
  5. グループ名を入力します。
  6. を選択してを適用します。

ワークスペース アクセス

サービス プリンシパルが Premium ワークスペースとセマンティック モデルの操作を実行するために必要なアクセス許可を持つには、サービス プリンシパルをワークスペース メンバーまたは管理者として追加する必要があります。ここでは Power BI サービスでのワークスペース アクセスの使用について説明しますが、 グループ ユーザーの追加 REST API を使用することもできます。

  1. ワークスペースの Power BI サービスで、[ その他>ワークスペース アクセス] を選択します。

    ワークスペースの一覧を示すスクリーンショット。その他のアイコンとワークスペースのアクセスが強調表示されます。

  2. アプリケーション名で検索し、サービス プリンシパルを 管理者 または メンバー としてワークスペースに追加します。

XMLA エンドポイントの接続文字列

サービス プリンシパルを作成し、テナントのサービス プリンシパルを有効にし、サービス プリンシパルをワークスペース アクセスに追加した後、XMLA エンドポイントとの接続文字列でユーザー ID として使用します。 違いは、 user id パラメーターと password パラメーターの代わりに、アプリケーション ID、テナント ID、アプリケーション シークレットを指定することです。

Data Source=powerbi://api.powerbi.com/v1.0/myorg/<workspace name>; Initial Catalog=<dataset name>;User ID=app:<appId>@<tenantId>;Password=<app_secret>;

PowerShell

PowerShell セッションを開き、次のコード例を実行します。

SQLServer モジュールの使用

次の例では、 AppIdTenantId、および AppSecret を使用して、セマンティック モデルの更新操作を認証します。

Param (
        [Parameter(Mandatory=$true)] [String] $AppId,
        [Parameter(Mandatory=$true)] [String] $TenantId,
        [Parameter(Mandatory=$true)] [String] $AppSecret
       )
$PWord = ConvertTo-SecureString -String $AppSecret -AsPlainText -Force

$Credential = New-Object -TypeName "System.Management.Automation.PSCredential" -ArgumentList $AppId, $PWord

Invoke-ProcessTable -Server "powerbi://api.powerbi.com/v1.0/myorg/myworkspace" -TableName "mytable" -DatabaseName "mydataset" -RefreshType "Full" -ServicePrincipal -ApplicationId $AppId -TenantId $TenantId -Credential $Credential

分析管理オブジェクト (AMO) と ADOMD.NET

クライアント アプリケーションと Web アプリを使用して接続する場合は、 AMO および ADOMD クライアント ライブラリ バージョン 15.1.42.26 (2020 年 6 月) 以降のインストール可能パッケージを NuGet から使用して、次の構文を使用して、接続文字列内のサービス プリンシパルをサポートできます: app:AppID とパスワードまたは cert:thumbprint

次の例では、 appID 値と password 値を使用して、モデル データベースの更新操作を実行します。

string appId = "xxx";
string authKey = "yyy";
string connString = $"Provider=MSOLAP;Data source=powerbi://api.powerbi.com/v1.0/<tenant>/<workspacename>;Initial catalog=<datasetname>;User ID=app:{appId};Password={authKey};";
Server server = new Server();
server.Connect(connString);
Database db = server.Databases.FindByName("adventureworks");
Table tbl = db.Model.Tables.Find("DimDate");
tbl.RequestRefresh(RefreshType.Full);
db.Model.SaveChanges();