Android 用 Microsoft Intune アプリ SDK を使用すると、Intune アプリ保護ポリシー (MAM ポリシーとも呼ばれます) をネイティブ Java/Kotlin Android アプリに組み込むことができます。 Intune マネージド アプリケーションは、Intune アプリ SDK と統合されたアプリケーションです。 Intune 管理者は、Intune がアプリをアクティブに管理する場合、Intune で管理されるアプリにアプリ保護ポリシーを簡単に展開できます。
注:
このガイドは、いくつかの異なる段階に分かれています。 まず、「 ステージ 1: 統合を計画する」を確認することから始めます。
ステージ 4: MAM 統合の基礎
ステージ目標
- MAM 厳格モードを有効にします。
- SDK からの重要な通知に登録します。
- 認証コールバックを実装して登録し、MSAL から SDK に Microsoft Entra トークンを提供します。
- MSAL で認証した後、MAM 管理用の新しいアカウントを登録します。
- ログアウト時にアカウントの登録を解除して、企業データを削除します。
- (推奨)MAM ログをアプリに組み込みます。
- (推奨)SDK 診断ダイアログの使用方法について説明します。
背景
Intune アプリ SDK がダウンロードされ、ビルドに統合され、クラスとメソッドの置換が正常に実行されたので、MAM で保護されたアカウントに対するアプリ保護ポリシー設定の強制を開始するために重要なコード変更を行います。
このステージでは、SDK のログにフックする方法、診断ダイアログを呼び出す方法、MAM 厳格モードを有効にして統合のバグを特定する方法、SDK からの通知に登録する方法、および最も重要なこととして、Intune MAM のアカウントを登録してポリシーの受信を開始する方法について説明します。
MAM 厳格モード
MAM 厳格モードでは、Intune App SDK のアプリケーションの統合に含まれる潜在的なバグを特定できます。 これらの統合バグにより、アプリの保護ポリシーを正しく適用できず、企業データが保護されないままになる可能性があります。 その結果、MAM 厳格モードを使用する 必要があります。
MAM 厳格モードでは、アプリケーションによる MAM API および MAM 制限付きプラットフォーム API の使用における異常が検索されます。 Android の StrictMode を大まかに倣った MAM 厳格モードでは、失敗した場合にランタイム エラーを発生させる一連のチェックが事前に定義されます。 MAM 厳格モードは、実稼働ビルドで有効のままにしておくことを意図したものではありません。代わりに、アプリの内部開発、デバッグ、社内リリース、社内リリース ビルド、またはその両方で使用します。
MAM 厳格モードを有効にするには、アプリケーションの初期化の早い段階で次のメソッド ( Application.onCreate など) を呼び出します。
MAMStrictMode.enable();
MAM 厳格モード チェックが失敗した場合は、アプリで修正できる実際の問題か、誤検知かを判断してみてください。 誤検知であると思われる場合、または不明な場合は、Intune MAM チームにお知らせください。 これにより、誤検知の判定に同意することを確認し、将来のリリースで検出を改善することを試みることができます。 誤検知を抑制するには、次の手順に従って失敗したチェックを無効にします。
違反の処理
チェックが失敗すると、MAMStrictViolationHandler が実行されます。
既定のハンドラーは、アプリをクラッシュさせることが予想される Errorをスローします。
これは、エラーのノイズをできるだけ大きくするためであり、実稼働ビルドで厳密モードを有効にしないという意図に適合します。
アプリで違反を別の方法で処理する場合は、 handler が実装する次のメソッドを呼び出すことによって、独自のハンドラーを提供することができます MAMStrictViolationHandler。
MAMStrictMode.global().setHandler(handler);
チェックの抑制
アプリに何も間違っていない状態でチェックが失敗した場合は、上記のように報告します。 それまでの間、少なくとも SDK の更新を待っている間は、誤検知が発生した場合のチェックを無効にする必要がある場合があります。 失敗したチェックは、既定のハンドラーによって発生したエラーに表示されます。または、設定されている場合はカスタム ハンドラーに渡されます。
抑制はグローバルに実行できますが、特定の呼び出しサイトでスレッドごとを一時的に無効にすることをお勧めします。 次の例は、 MAMStrictCheck.IDENTITY_NO_SUCH_FILE を無効にするさまざまな方法を示しています (存在しないファイルを保護しようとした場合に発生します)。
Per-Thread 一時的な抑制
これは推奨される抑制方法です。
try (StrictScopedDisable disable = MAMStrictMode.thread().disableScoped(MAMStrictCheck.IDENTITY_NO_SUCH_FILE)) {
// Perform the operation which raised a violation here
}
// The check is no longer disabled once the block exits
Per-Thread 恒久的な抑制
MAMStrictMode.thread().disable(MAMStrictCheck.IDENTITY_NO_SUCH_FILE);
グローバル (プロセス全体) 抑制
MAMStrictMode.global().disable(MAMStrictCheck.IDENTITY_NO_SUCH_FILE);
SDK からの通知に登録する
Intune アプリ SDK は、時間に依存する管理操作をアプリケーションに通知するために、さまざまな種類の通知を発行します。 アプリケーションは、これらの通知のいずれかを登録し、受信したときにアクションを実行できます。
たとえば、IT 管理者がデバイスのセレクティブ ワイプ コマンドを発行するたびに、Intune サービスは通知を SDK に送信します。この通知はWIPE_USER_DATAとしてアプリケーションに渡されます。
アプリケーションでは、この通知をリッスンし、消去されるデータを制御できます。または、SDK の既定のワイプ動作に依存することもできます。
通知の多くは省略可能です。 アプリケーションで使用する SDK 機能によっては、いくつかの通知が必要になる場合があります。 通知に登録する方法、SDK が配信する通知、特定の通知の種類を処理する方法の詳細については、「ステージ 7: アプリ参加機能」で SDK からの通知に登録するを参照してください。
アプリ保護ポリシーへの登録
管理者は、アプリ保護ポリシーを作成するときに、これらのポリシーを organization 内の特定のアカウントを対象とします。 クライアントでは、SDK は、どのアカウントがアプリケーションを使用しているかを把握する必要があります。これにより、SDK は、そのアカウントのポリシーを取得して設定を適切に適用できます。 アプリは、SDK にこのアカウント情報を提供する役割を担います。 このプロセスは登録と呼ばれます。
アプリで新しいアカウントを追加するたびに、他のアカウントが既に登録されていても、そのアカウントを SDK に登録する必要があります。 アプリで複数のアカウントを登録できます。 ただし、現在、登録できる、またはアプリ保護ポリシーを適用できるアカウントは 1 つだけです。 Android では、このシングル マネージド アカウントの制限はデバイス全体に適用されます。
登録と登録
登録 は、新しいアカウントが使用中であることをアプリが SDK に通知するプロセスです。 SDK には、アカウントの登録と登録解除のためにアプリが呼び出す必要がある関数が含まれています。
登録は、アカウントのポリシーを適用できるように、SDK が Intune サービスに登録されたアカウントを記録するプロセスです。 アプリは、登録のために関数を呼び出す必要はありません。 アカウントが登録された後、SDK は登録を完全に処理します。
アプリケーションに既に 1 つのアカウントが登録されている場合、別のアカウントを登録すると、そのアカウントがアプリ保護ポリシーの対象になっている場合でも、その 2 番目のアカウントは登録されず、ポリシーは適用されません。
注:
"登録" という用語は、デバイス全体の MDM 登録を指すこともあります。 MDM と MAM の登録に関する付録の詳細はこちらをご覧ください。
登録の実装
アカウントを正常に登録するには、アプリで 3 つのコード変更を行う必要があります。
アプリでは、MAMServiceAuthenticationCallback または MAMServiceAuthenticationCallbackExtended インターフェイスのインスタンスを実装して登録する必要があります。 コールバックインスタンスは、Application サブクラスの
onCreate()(またはonMAMCreate()) メソッドに登録する必要があります。アカウントが作成され、ユーザーが MSAL で正常にサインインすると、アプリは registerAccountForMAM を呼び出す必要があります。
アカウントが削除されたら、アプリは unregisterAccountForMAM を呼び出して、Intune 管理からアカウントを削除する必要があります。
注意
呼び出しにより、アカウントの企業データを完全に削除するためのワイプが開始される場合があります。
必要なすべての認証および登録 API は、 MAMEnrollmentManager インターフェイスにあります。
MAMEnrollmentManager への参照を次のように取得できます。
MAMEnrollmentManager mgr = MAMComponents.get(MAMEnrollmentManager.class);
// make use of mgr
返される MAMEnrollmentManager インスタンスは、null でないことが保証されます。
API メソッドは、 認証 と アカウント登録の 2 つのカテゴリに分類されます。
MAMEnrollmentManager と認証
SDK は、登録済みアカウントの登録、アプリ保護ポリシー設定の更新の取得、保留中の管理者アクション (アプリ内の保護されたデータの選択的なワイプなど) の取得など、Intune サービスと頻繁に通信します。 Intune サービスと正常に通信するには、SDK には MSAL を統合したアプリからの最新のアクセス トークンが必要です。
SDK が新しいトークンを取得できない場合、Intune サービスと通信できないため、新しいポリシー設定や管理者操作の取得と適用が遅れる可能性があります。 シームレスにポリシーを適用するには、アプリでこれらの手順を完了することが重要です。
ステージ 2 では、認証とアクセス トークンの取得のために MSAL をアプリケーションに統合しました。 ここでは、SDK が必要なトークンを要求できるように認証コールバックを実装します。
MAMEnrollmentManager には、次の認証方法があります。
interface MAMServiceAuthenticationCallback {
String acquireToken(String upn, String aadId, String resourceId);
}
interface MAMServiceAuthenticationCallbackExtended extends MAMServiceAuthenticationCallback {
String acquireToken(String upn, String aadId, String tenantId, String authority, String resourceId);
}
void registerAuthenticationCallback(MAMServiceAuthenticationCallback callback);
void updateToken(String upn, String aadId, String resourceId, String token);
注:
これらのメソッドの aadId パラメーターは、以前は AAD ID と呼ばれ、OID とも呼ばれていた Microsoft Entra ユーザー ID を参照します。
アプリは、指定されたアカウントとリソース ID に対して SDK が Microsoft Entra トークンを要求できるように、MAMServiceAuthenticationCallback インターフェイスまたは MAMServiceAuthenticationCallbackExtended インターフェイスを実装する必要があります。 コールバック インスタンスは、registerAuthenticationCallback メソッドを呼び出すことによって
MAMEnrollmentManagerに提供する必要があります。 登録の再試行またはアプリ保護ポリシーの更新チェックインのためにアプリ ライフサイクルの早い段階でトークンが必要になる場合があるため、コールバックをアプリのApplicationサブクラスのonCreate()(またはonMAMCreate()) メソッドに登録する必要があります。acquireTokenメソッドは、指定されたアカウントの要求されたリソース ID のアクセス トークンを取得する必要があります。 要求されたトークンを取得できない場合は、null を返す必要があります。ヒント
正しいトークンが取得されるように、アプリで
acquireToken()に渡されたresourceIdパラメーターとaadIdパラメーターを利用するようにします。upnパラメーターは情報提供専用です。aadIdも考慮せずにアカウントの識別に使用しないでください。resourceIdは適切なスコープを生成するために使用し、aadIdは正しいアカウントを渡すために使用する必要があります。 間違ったアカウントや間違ったリソースに対してトークンが返された場合、アプリの登録とポリシーの取得で遅延したり失敗したりする可能性があります。 アプリでトークンを正しく取得するために Microsoft Entra 機関が必要な場合は、MAMServiceAuthenticationCallbackExtendedインターフェイスを実装します。class MAMAuthCallback implements MAMServiceAuthenticationCallbackExtended { public String acquireToken(String upn, String aadId, String tenantId, String authority, String resourceId) { final String[] scopes = {resourceId + "/.default"}; final IAccount account = getAccount(aadId); if (account == null) { // Log error or warning here about: "no account found for " + aadId return null; } AcquireTokenSilentParameters params = new AcquireTokenSilentParameters.Builder() .forAccount(account) .fromAuthority(account.getAuthority()) .withScopes(Arrays.asList(scopes)) .withCallback(callback) .build(); return mMsalClientApplication.acquireTokenSilent(params); } private static IAccount getAccount(String aadId) throws InterruptedException, MsalException { IAccount account = null; if (mMsalClientApplication instanceof IMultipleAccountPublicClientApplication) { IMultipleAccountPublicClientApplication multiAccountPCA = (IMultipleAccountPublicClientApplication) mMsalClientApplication; account = multiAccountPCA.getAccount(aadId); } else { ISingleAccountPublicClientApplication singleAccountPCA = (ISingleAccountPublicClientApplication) mMsalClientApplication; ICurrentAccountResult accountResult = singleAccountPCA.getCurrentAccount(); if (accountResult != null) { account = accountResult.getCurrentAccount(); // make sure this is the correct user if (account != null && !account.getId().equals(aadId)) account = null; } } return account; } }SDK が
acquireToken()を呼び出したときにアプリがトークンを提供できない場合 (たとえば、サイレント認証に失敗し、UI を表示するのが不便なタイミングである場合)、アプリは後で updateToken メソッドを呼び出すことによってトークンを提供できます。acquireToken()への以前の呼び出しによって要求されたのと同じ UPN、Microsoft Entra ID、リソース ID を、最終的に取得されたトークンと共にupdateToken()に渡す必要があります。upnパラメーターは情報提供のみを目的としており、通常は MAM SDK によって無視されます。 アプリは、指定されたコールバックから null を返した後、できるだけ早くこのメソッドを呼び出す必要があります。警告
acquireToken()の実装内からupdateToken()を呼び出さないでください。updateToken()acquireToken()がトークンを取得できない場合に使用する必要があります。注:
SDK は定期的に
acquireToken()を呼び出してトークンを取得するため、updateToken()の呼び出しは厳密には必須ではありません。 ただし、登録とアプリ保護ポリシーのチェックインをタイムリーに完了するのに役立つため、強くお勧めします。
認証実装に関する注意事項
アプリでは、registerAccountForMAM を呼び出す前に Microsoft Entra トークンを取得することをお勧めします。 アカウントを登録すると、アプリは別のスレッド上の登録済み
MAMServiceAuthenticationCallbackのacquireToken()メソッドへのコールバックを受け取ります。 そのコールバックに有効なトークンを指定すると、登録を続行できます。 アプリは通知によって登録結果を取得します。アプリが有効な Microsoft Entra トークンを返さない場合、登録試行の最終結果は
AUTHORIZATION_NEEDEDになります。 アプリが通知を介してこの結果を受け取った場合は、 以前に acquireToken から要求したアカウントとリソースのトークンを取得し、 updateToken メソッドを呼び出して登録プロセスを再度開始することで、登録プロセスを迅速化することをお勧めします。アプリの登録済み
MAMServiceAuthenticationCallbackも呼び出され、定期的なアプリ保護ポリシー更新のチェックインのトークンを取得します。要求されたときにアプリがトークンを提供できない場合、通知は受信されませんが、トークンの取得を試みて、チェックイン プロセスを迅速化するために、次回の都合の良い時間にupdateToken()を呼び出す必要があります。 トークンが指定されていない場合でも、コールバックは次のチェックイン試行時に呼び出されることがあります。ソブリン クラウドのサポートには、権限を提供する必要があります。
MAMServiceAuthenticationCallbackExtendedインターフェイスが実装されている場合、MAMServiceAuthenticationCallbackExtendedインターフェイスには既定の実装が用意されているため、MAMServiceAuthenticationCallbackから継承したacquireToken()メソッドを実装する必要はありません。
MAMEnrollmentManager と登録
アプリでアカウントを追加するたびに、そのアカウントを SDK に登録する必要があります。 同様に、アプリがアカウントを削除するたびに、そのアカウントの登録を解除して、アプリがそのアカウントにポリシーを適用しないことを示す必要があります。 アカウントが MAM サービスに登録されている場合、アカウントは登録解除され、アプリはワイプされます。
MAMEnrollmentManager のアカウント登録方法は次のとおりです。
void registerAccountForMAM(String upn, String aadId, String tenantId);
void registerAccountForMAM(String upn, String aadId, String tenantId, String authority);
void unregisterAccountForMAM(String upn, String aadId);
Result getRegisteredAccountStatus(String upn, String aadId);
管理用のアカウントを登録するには、アプリで
registerAccountForMAM()を呼び出す必要があります。 アカウントは、UPN と Microsoft Entra ユーザー ID の両方で識別されます。 テナント ID は、登録データをアカウントの Microsoft Entra テナントに関連付けるにも必要です。 アカウントの権限は、特定のソブリン クラウドに対する登録を許可するために提供される場合もあります。詳細については、「Sovereign Cloud の登録」を参照してください。 SDK は、指定されたアカウントのアプリを MAM サービスの登録しようとする場合があります。登録に失敗した場合は、登録が成功するかアカウントの登録が解除されるまで、定期的に登録が再試行されます。 通常、再試行期間は 12 から 24 時間です。 SDK は、通知を介して非同期的に登録試行の状態を提供します。registerAccountForMAMを呼び出す最適なタイミングは、ユーザーがアプリにサインインし、MSAL を使用して正常に認証された後です。 アカウントのMicrosoft Entraユーザー ID、テナント ID、権限は、IAuthenticationResultに関連するIAccountの一部として MSAL 認証呼び出しから返されます。- アカウントは
IAuthenticationResult.getAccount()メソッドから取得され、関連するアカウント情報が含まれています。 - AAD ID (Microsoft Entra ID または OID とも呼ばれます) は、
IAccount.getId()メソッドから取得されます。 - テナント ID は、
IAccount.getTenantId()メソッドから取得されます。 - 権限は
IAccount.getAuthority()方式から来る。
- アカウントは
Intune管理からアカウントの登録を解除するには、アプリで
unregisterAccountForMAM()を呼び出す必要があります。 アカウントが正常に登録され、管理されている場合、SDK はアカウントの登録を解除し、そのデータをワイプします。 アカウントの定期的な登録再試行は停止されます。 SDK は、通知を通じて非同期に登録解除要求の状態を提供します。
登録実装上の注意事項
登録方法はべき等です。 たとえば、 registerAccountForMAM は、アカウントがまだ登録されていない場合にのみアカウントを登録してアプリの登録を試み、 unregisterAccountForMAM は、アカウントが現在登録されている場合にのみ登録を解除します。 それ以降の呼び出しは no-ops であるため、これらのメソッドを複数回呼び出しても問題はありません。
すべての登録/登録解除呼び出しに対応する結果通知があるという保証はありません。 たとえば、既に登録されているアカウントに対して
registerAccountForMAM()が呼び出された場合、その ID に対して通知が再送信されない可能性があります。 または、アプリがこれらのメソッドを呼び出さなかった場合でも SDK が通知を送信する場合があります。これは、SDK が定期的にバックグラウンドで登録を試行し、Intune サービスから受信したワイプ要求によって登録解除がトリガーされる可能性があるためです。登録方法は任意の数の異なるアカウントに対して呼び出すことができますが、現在、正常に登録できるのは 1 つのアカウントのみです。 Intune のライセンスが付与され、アプリの保護ポリシーの対象となる複数のアカウントが同時に、またはほぼ同時に登録された場合、どちらが競争に勝つかの保証はありません。
MAMEnrollmentManager にクエリを実行して、特定のアカウントが登録されているかどうかを確認し、getRegisteredAccountStatus メソッドを使用して現在の状態を取得できます。 指定されたアカウントが登録されていない場合、このメソッドは null を返します。 アカウントが登録されている場合、このメソッドは MAMEnrollmentManager.Result 列挙型のメンバーの 1 つとしてアカウントの状態を返します。
Sovereign Cloud の登録
Azure では、ソブリン クラウドまたはナショナル クラウドと呼ばれる複数の物理的に分離されたクラウドがサポートされています。
アプリケーションがソブリン クラウド対応である場合は、registerAccountForMAM() に authority パラメーターを指定する必要があります。
MSAL ガイダンス
MSAL の場合は、MSAL 構成ファイルで multiple_clouds_supported を true に設定します。
{
"multiple_clouds_supported": true,
}
登録結果と状態コード
アカウントが最初に登録されると、 PENDING 状態で開始されます。これは、最初の MAM サービス登録の試行が不完全であることを示します。
登録が完了すると、次の表のいずれかの結果コードを含む通知が送信されます。
さらに、 getRegisteredAccountStatus メソッドはアカウントの状態を返すため、アプリはそのアカウントにアプリ保護ポリシーが適用されているかどうかを常に判断できます。
登録の試行が失敗した場合、SDK がバックグラウンドで登録を再試行するため、時間の経過と共にアカウントの状態が変化する可能性があります。
| 結果コード | 説明 |
|---|---|
AUTHORIZATION_NEEDED |
この結果は、アプリの登録済み MAMServiceAuthenticationCallback インスタンスによってトークンが提供されなかったか、指定されたトークンが無効であることを示します。 アプリは有効なトークンを取得し、可能な場合は updateToken を呼び出す必要があります。 |
NOT_LICENSED |
アカウントに Intune のライセンスが付与されていないか、Intune MAM サービスに接続しようとして失敗しました。 アプリはアンマネージド (通常の) 状態で継続する必要があり、ユーザーをブロックしないでください。 将来アカウントがライセンスされた場合、登録は定期的に再試行されます。 |
ENROLLMENT_SUCCEEDED |
登録が成功したか、アカウントが既に登録されています。 登録が成功した場合は、この通知の前にポリシー更新通知が送信されます。 企業データへのアクセスを許可する必要があります。 |
ENROLLMENT_FAILED |
登録できませんでした。 詳細は、デバイス ログに記載されています。 このアプリでは、アカウントが Intune のライセンスを持っていることが以前に決定されているため、この状態の企業データへのアクセスを許可してはなりません。 すべてのアプリでは、アプリによって取得されるまで、企業データ アクセスが承認されていないことを確認 ENROLLMENT_SUCCEEDED する必要があります。 |
WRONG_USER |
MAM サービスにアプリを登録できるのは、デバイスごとに 1 つのアカウントのみです。 この結果は、この結果が配信されたアカウント (2 番目のアカウント) が MAM ポリシーの対象であるが、別のアカウントが既に登録されていることを示します。 MAM ポリシーは 2 番目のアカウントには適用できないため、後でこのアカウントの登録が成功しない限り、アプリでは (たとえばアプリからアカウントを削除することで) このアカウントのデータへのアクセスを許可してはなりません。 この WRONG_USER 結果の配信と同時に、MAM はエンド ユーザーに 2 つの修正オプションを求めます。(1) 既存の登録済みアカウントを削除して 2 番目のアカウントを登録できるようにするか、(2) 2 番目の (試行された) アカウントを削除して、既存のアカウントが登録されたままである間、プロンプトが表示されないようにします。 ユーザーがオプション (1) を選択した場合、しばらくしてから 2 番目のアカウントを登録できます。 ユーザーがオプション (2) を選択した場合、MAM は 2 番目のアカウントをローカルで登録解除し、標準の登録結果通知を介してそのアカウントの UNENROLLMENT_SUCCEEDED を報告します。2 番目のアカウントは登録されなかったため、選択的ワイプは実行されず、ワイプ通知は配信されません。 また、MAM はそのアカウントの登録の再試行を停止するため、プロンプトは再表示されなくなります。 2 番目のアカウントが登録されている間 (つまり、ユーザーがオプション (2) を選択していない間)、MAM は定期的に登録を再試行します。 |
UNENROLLMENT_SUCCEEDED |
登録解除が成功しました。 |
UNENROLLMENT_FAILED |
登録解除要求は失敗しました。 詳細は、デバイス ログに記載されています。 一般に、アプリが有効な (null でも空でもない) UPN を渡している限り、これは発生しません。 アプリが実行できる直接的で信頼できる修復はありません。 有効な UPN の登録を解除するときにこの値を受け取った場合は、バグとして Intune MAM チームに報告してください。 |
PENDING |
アカウントの最初の登録試行が進行中です。 アプリは、登録結果がわかるまで企業データへのアクセスをブロックできますが、そうする必要はありません。 |
COMPANY_PORTAL_REQUIRED |
アカウントには Intune のライセンスが付与されていますが、ポータル サイト アプリがデバイスにインストールされるまでアプリを登録できません。 Intune アプリ SDK は、特定のアカウントのアプリへのアクセスをブロックしようとし、ポータル サイト アプリをインストールするようにユーザーに指示します。 この通知をアプリに送信すると、アクティビティがユーザーに現在表示されている場合、または次に onResume が呼び出されたときに、Intune App SDK によって現在のアクティビティの上に非ブロック UI が表示されます。 ユーザーがこの非ブロック UI をキャンセルすると、次にonCreateがアクティビティに対して呼び出され、現在の ID が管理されるときに、Intune App SDK によってブロック UI が表示されます (トラブルシューティングの詳細については、以下を参照してください)。 |
(推奨)ログ記録
ログに記録されたデータから最大の価値を引き出すには、ログを早期に初期化する必要があります。
Application.onMAMCreate() 通常は、ログを初期化するのに最適な場所です。
アプリで MAM ログを受信するには、 Java ハンドラー を作成して MAMLogHandlerWrapper に追加します。
これにより、すべてのログ メッセージに対してアプリケーション ハンドラーで publish() が呼び出されます。
/**
* Global log handler that enables fine grained PII filtering within MAM logs.
* To start using this you should build your own log handler and add it via
* MAMComponents.get(MAMLogHandlerWrapper.class).addHandler(myHandler, false);
* You may also remove the handler entirely via
* MAMComponents.get(MAMLogHandlerWrapper.class).removeHandler(myHandler);
*/
public interface MAMLogHandlerWrapper {
/**
* Add a handler, PII can be toggled.
* @param handler handler to add.
* @param wantsPII if PII is desired in the logs.
*/
void addHandler(final Handler handler, final boolean wantsPII);
/**
* Remove a handler.
* @param handler handler to remove.
*/
void removeHandler(final Handler handler);
}
注:
PII は "個人を特定できる情報" の略で、ユーザー名や UPN などのデータが含まれる場合があります。 このような個人情報を自身の運用ログから除外することを強くお勧めします。 詳細については、 Microsoft プライバシー ポリシー をご覧ください。
(推奨)診断情報
Intune ポータル サイト アプリには、診断情報を収集するための複数のオプションがあります。 ポータル サイトには、次のような UI が含まれています。
- エンド ユーザーがポータル サイトのログを収集できるようにします。
- デバイスとアカウントのメタデータを表示します。
- 現在の MAM ポリシーに関するアプリごとの情報が含まれます。
ポータル サイト ログと診断 UI に含まれるデータの詳細な説明については、付録の「ポータル サイト ログについて」を参照してください。
ヒント
MAM ポリシーを適用する必要があるアカウントでテストを行っているのに、診断でアプリのパッケージ名に関するポリシーが表示されない場合は、以下の「トラブルシューティング」セクションを参照してください。
アプリは、MAMPolicyManager.showDiagnostics(context) を呼び出すことでこの診断 UI を起動できます。
エンド ユーザーは、アドレス バーに「about:intunehelp」と入力することで、Microsoft Edge からポータル サイトの診断コンソールを起動することもできます。
これは、デバッグに役立つオプションの機能です。
この診断情報は、ポータル サイトがデバイスにインストールされている場合にのみ使用できます。
ポータル サイトをインストールせずにshowDiagnosticsが呼び出されると、警告ダイアログが表示されます。
終了条件
統合のこの時点で、アプリはアプリ保護ポリシーを受け取り、適用できます。 次のテストを実行して、統合を検証します。
最初のポリシー アプリケーション テスト
最初に次のテストを実行して、アプリ内のポリシー アプリケーションの完全なエンド ユーザー エクスペリエンスを理解します。
- Microsoft Intune 管理センターで Android アプリ保護ポリシーを作成します (詳細については、「ステージ 1 のテスト用 Android アプリ保護ポリシーの作成」を参照してください)。 このテストでは、ポリシーを構成します:
- [データ保護] で、[画面キャプチャと Google アシスタント] を [ブロック] に設定します。
- [アクセス要件] で、既定の設定のままにします。 特に、"アクセス用 PIN" は "必須" である必要があります。
- アプリ保護ポリシーがアプリケーションを対象としていることを確認します。 ポリシー作成ウィザードでパッケージ名を手動で追加する必要がある場合があります。
- テスト アカウントを含むユーザー グループにアプリ保護ポリシーを割り当てます。
- テスト用 Android デバイスで、Microsoft Outlook、Teams、OneDrive、Office などの他の SDK 統合アプリをアンインストールします。 また、Intune ポータル サイト アプリと Microsoft Authenticator アプリもアンインストールします。
-
ヒント
他の SDK 統合アプリをアンインストールすると、独自のアプリの統合のみをテストするのに役立ちます。
-
- アプリケーションをインストールします。
- アプリ保護ポリシーの対象となるテスト アカウントでアプリケーションにログインします。
- Google Play から Intune ポータル サイトをインストールするように求められることを確認します。
-
注:
テスト デバイスに Google Play ストア アプリがない場合は、別のアプリ ストアまたは Microsoft Web サイトから Intune ポータル サイトをインストールするように求められることを確認します。
-
- ポータル ポータル サイトをインストールします。 ポータル サイトを起動したり、ポータル ポータル サイトにログインしたりする必要はありません。
- アプリに戻り、必要に応じて再度ログインします。
- [アクセスの取得] 画面でプロンプトが表示されたことを確認します。 これは、SDK がこのアカウントのポリシーを正常に取得したことを示します。
- アプリ PIN を設定するように求められます。 PIN を作成します。
- アプリケーション内を移動し、スクリーンショットの撮影を試みます。 SDK にポリシーがあるため、どの画面でもこれを常にブロックする必要があります。
- 管理対象アカウントをアプリケーションからログアウトします。
- 可能であれば、ログインせずにアプリケーション内を移動し、スクリーンショットの作成を試みます。 アカウントが削除されたので、これはブロックされません。
これは、アプリがアカウントを適切に登録したこと、認証コールバックを登録したこと、およびアカウントの登録解除を行ったことを確認する最小 限 のテストです。 次のテストを実行して、他のアプリ保護ポリシー設定によってアプリケーションの動作がどのように変更されるかをより徹底的に検証します。
データ保護テスト
次のテストは、アプリ保護ポリシー内で構成されている特定のデータ保護設定を対象としています。 Microsoft Intune 管理センターでアプリ保護ポリシーの設定を変更しても、クライアントはすぐに更新されません。 テストの高速化に関するヒントについては、「 ポリシーが変更されて迅速なテストを行う」 を参照してください。
これらのテストの場合:
- アプリをインストールします。
- Intune ポータル サイトをインストールします。
- データをコピーして貼り付けることができる、アプリと同じポリシーを対象とする別のマネージド アプリ (Microsoft Office など) をインストールします。
- データのコピーと貼り付けができるアンマネージド アプリをインストール (または再利用) します。
- テスト管理アカウントでアプリにログインします。
- マネージド テスト アカウントで他のマネージド アプリにログインします。
| シナリオ | アプリ保護ポリシーの設定 | テスト手順 |
|---|---|---|
| スクリーンショット | [画面キャプチャと Google アシスタント] を [ブロック] に設定 | 1. アプリ内のすべてのページに移動します。 2. 各ページのスクリーンショットを撮ります。 3. スクリーンショットがブロックされているか、保存された画像が完全に空白であることを確認します。 |
| テキストをコピーする | [Restrict cut, copy and paste between other apps] を [Policy managed apps] に設定します | 0. アプリにコピーするテキストがない場合は、スキップします。 1. コピー可能なテキストがあるアプリ内のすべてのページに移動します。 2. テキストをコピーします。 3. アンマネージド アプリに切り替えます。 4. アンマネージド アプリへの貼り付けを試みます。 5. 貼り付けがブロックされていることを確認します。 6. 他のマネージド アプリに移動します。 7. マネージド アプリへの貼り付けを試みます。 8. 貼り付けが許可されていることを確認します。 |
| テキストを貼り付ける | [Restrict cut, copy and paste between other apps] を [Policy managed apps] に設定します | 0. アプリに貼り付けるテキスト入力がない場合は、スキップします。 1. アンマネージド アプリに切り替えます。 2. アンマネージド アプリからテキストをコピーします。 3. アプリ内でテキスト入力があるすべてのページに移動します。 5. アンマネージド アプリから貼り付けを試みます。 5. 貼り付けがブロックされていることを確認します。 6. 他のマネージド アプリに切り替えます。 7. 他のマネージド アプリからテキストをコピーします。 7. アプリ内にテキスト入力があるすべてのページに移動します。 8. 他のマネージド アプリから貼り付けます。 9. 貼り付けが許可されていることを確認します。 |
| 印刷 | [組織データの印刷] を [ブロック] に設定する | 0. アプリに印刷できるページまたはドキュメントがない場合は、スキップします。 1. Android の印刷機能を呼び出すアプリ内のすべてのページに移動します。 2. 各ページから印刷します。 3. 印刷がブロックされていることを確認します。 |
| Microsoft Edge Web コンテンツの制限 | [他のアプリとの Web コンテンツ転送を制限する] を [Microsoft Edge] に設定する | 0. アプリで Web リンクが表示されない場合は、スキップします。 1. Web リンクを表示できる、またはクリック可能な Web リンクにレンダリングされるテキスト入力があるアプリ内のすべてのページに移動します。 2. 各ページの Web リンクを選択します。 3. Microsoft Edge をインストールするように求められ、別のブラウザーで Web リンクが開かないことを確認します。 |
| 制限されたキーボード | [承認済みキーボード] を [必須] に設定します デバイスに現在インストールされていないキーボード パッケージのみに設定する [承認するキーボードの選択] |
0. アプリにテキスト入力がない場合は、スキップします。 1. アプリ内でテキスト入力があるすべてのページに移動します。 2. テキスト入力を選択して、デバイスのキーボードを表示します。 3. 構成済みの承認済みキーボードをインストールするように求められ、現在のデバイス キーボードが開かないことを確認します。 |
データ転送テスト
データ転送設定は、管理対象アプリケーションの出入りを制御するアプリ保護ポリシー データ保護機能のサブセットです。 他のアプリとの間でのデータ送受信をサポートするほとんどのアプリには、ローカル ストレージまたはクラウド ストレージにデータを保存したり、クラウド ストレージから開いたりする機能もあります。 アプリにこれらの機能がある場合は、追加のサポートを実装する必要があります。 詳しくは 、アプリとデバイスまたはクラウド ストレージの場所の間でデータ転送を制限するためのポリシー をご覧ください。
アプリは、Microsoft OneDrive のファイルを添付する Microsoft Outlook など、他のアプリからデータをアクティブにインポートする場合があります。 アプリは、Microsoft Office が Microsoft Outlook の添付ファイルからドキュメントを開くなど、他のアプリからデータを受動的に受信する場合もあります。 [他のアプリからデータを受信する] ポリシー設定は、両方のシナリオを対象としています。
これらのテストの場合:
- アプリをインストールします。
- Intune ポータル サイトをインストールします。
- データを送受信できる、アプリと同じポリシーの対象となる別のマネージド アプリ (Microsoft Outlook など) をインストールします。
- データを送受信できるアンマネージド アプリをインストール (または再利用) します。
- テスト管理アカウントでアプリにログインします。
- マネージド テスト アカウントで他のマネージド アプリにログインします。
| シナリオ | アプリ保護ポリシーの設定 | テスト手順 |
|---|---|---|
| 他のアプリへのデータ送信 | [組織データを他のアプリに送信する] を [ポリシーで管理されているアプリ] に設定します | 0. アプリが他のアプリにデータを送信できない場合は、スキップします。 1. アプリがデータを送信できる場所に移動します。 2. データの送信を試みます。 3. 他のマネージド アプリへのデータ送信に限定されていることを確認します。 マネージド アプリのみを含むアプリ ピッカーが表示されます。 |
| 他のアプリからデータをインポートする | [他のアプリからデータを受信する] を [ポリシーで管理されるアプリ] に設定する | 0. アプリが他のアプリからデータをインポートできない場合は、スキップします。 1. アプリが他のアプリからデータをインポートできる場所に移動します。 2. データのインポートを試みます。 3. 他のマネージド アプリからのみデータをインポートするように制限されていることを確認します。 マネージド アプリのみを含むアプリ ピッカーが表示されます。 |
| 非マネージド アプリからのデータの受信 | [他のアプリからデータを受信する] を [ポリシーで管理されるアプリ] に設定する | 0. アプリが他のアプリからデータを受信できない場合は、スキップします。 1. アンマネージド アプリに切り替えます。 2. データを送信できる場所に移動します。 3. アンマネージド アプリからアプリへのデータの送信を試みます。 4. アプリがアンマネージド アプリからデータを受信できないことを確認します。 |
| マネージド アプリからデータを取得する | [他のアプリからデータを受信する] を [ポリシーで管理されるアプリ] に設定する | 0. アプリが他のアプリからデータを受信できない場合は、スキップします。 1. 他のマネージド アプリに切り替えます。 2. データを送信できる場所に移動します。 3. 他のマネージド アプリから自分のアプリにデータを送信することを試みます。 4. アプリが他のマネージド アプリからデータを受信できることを確認します。 |
その他のデータ保護設定
次のデータ保護設定は、アプリが追加の変更を行うまで適用されません。 この段階では、これらの設定をテストする必要はありません。 詳細については、「 ステージ 7: アプリ参加機能」 を参照してください。
| シナリオ | アプリ保護ポリシーの設定 | 次の場合のサポートを実装する必要があります... |
|---|---|---|
| データのコピーの保存 | 組織データのコピーを保存 | アプリケーションは、ローカルまたはクラウド ストレージにデータを保存できます。 |
| ストレージからデータを開く | データを開いて組織ドキュメントに読み込む | アプリケーションは、ローカル ストレージまたはクラウド ストレージからデータを開くことができます。 |
| 管理対象通知コンテンツ | 組織のデータ通知 | アプリの通知内にユーザー データが含まれる。 |
| バックアップと復元 | Android バックアップ サービスへの組織データのバックアップ | アプリは Android のバックアップ機能を使用してユーザー データを共有します。 |
条件付き起動テスト
条件付き起動設定は、構成可能なデバイス全体またはアプリ固有の条件に基づいてアプリへのアクセスを制限するアプリ保護ポリシー機能のサブセットです。 これらの設定には、条件 ("最小 OS バージョン" など) とアクション ("アクセスをブロック" など) の両方が含まれます。 条件付き起動アクションは、次のいずれかです。
- 警告: デバイスまたはアプリが条件に満たさなかった場合、エンド ユーザーに警告ダイアログが表示されます。 引き続きすべてのアプリ データにアクセスできます。
- アクセスをブロックする: デバイスまたはアプリが条件に満たさなかった場合、エンド ユーザーに警告ダイアログが表示されます。 条件を満たすか、アプリから管理対象アカウントを削除するまで、アプリへのアクセスとアプリ データへのアクセスは許可されません。
- データをワイプ: デバイスまたはアプリが条件を満たさなかった場合、管理対象アカウントに関連付けられているすべての企業データがワイプされます。 データが削除されるまで、ユーザーは基準を満たす機会がありません。
一部の条件付き起動設定は、複数の値とアクションで構成できます。 例:
- 最小 OS バージョン、値が "10.0"、アクションが "警告" に設定されています。
- 最小 OS バージョン、値が "9.0"、アクションを "アクセスをブロック" に設定
- 最小 OS バージョン、値が "8.0"、アクションが "データのワイプ" に設定されます。
このステージの統合手順を完了すると、アプリで すべての条件付き起動機能がサポートされます。 ポリシー アイテムを変更して、テスト デバイスが次の状態になるようにして、条件付き起動機能について理解します。
- 構成済みのすべての条件付き起動設定を渡します。
- "警告" アクションに設定された条件付き起動設定が失敗します。
- "アクセスをブロックする" アクションに設定された条件付き起動設定が失敗します。
- "データのワイプ" アクションに設定された条件付き起動設定が失敗します。
トラブルシューティング
最初のポリシー アプリケーション テストのトラブルシューティング
上記の 最初のポリシー アプリケーション テスト の手順に従うと、次の予期しない動作が発生する場合があります。
マネージド アカウントでログインしても、ポータル サイトをインストールするように求められない (手順 7)
まず、Intune 管理センターにアクセスし、アプリ保護ポリシーがテスト アカウントを対象としていることを再チェックします。
次に、registerAccountForMAM の呼び出しと MAMServiceAuthenticationCallback の実装のソース コードをダブル チェックします。
この前者が適切なタイミングで呼び出されなかった場合、または後者が有効なトークンを適切に提供しなかった場合、ポータル サイト プロンプトは表示されません。
最後に、ログを参照 (またはデバッグ) して登録結果コードを確認するか、アカウントで getRegisteredAccountStatus を明示的に呼び出します。
NOT_LICENSEDのようなコードは、テスト アカウントの構成に問題があることを示している可能性があります。
ログイン後に [アクセスを取得] 画面が表示されませんでした (手順 10)
ポータル サイトが以前にインストールされていない場合は、[アクセスの取得] 画面を表示し、ポリシーを適切に適用するには、アプリケーションを再開または完全に再起動する必要がある場合があります。 これは、SDK 統合アプリがポータル サイト アプリ内でコードを活用する方法に基づいて予想される結果です。
アプリを再起動して再度ログインした後でも [アクセスの取得] 画面が表示されない場合は、SDK がアカウントの登録に失敗するか、アカウントのポリシーを取得することに失敗している可能性があります。
ソース コードのMAMServiceAuthenticationCallback実装をダブル チェックします。
ログイン後にアプリ PIN を設定または入力する画面が表示されませんでした (手順 11)
テスト デバイスに他の SDK 統合アプリケーションはありますか? アプリの PIN はすべてのマネージド アプリ間で共有され、SDK にはグローバル タイマーがあり、マネージド アプリの起動時または再開時にエンド ユーザーが PIN の入力を求められることがないようにします。
それ以外の場合は、Intune 管理センターにアクセスし、アプリ保護ポリシーでアプリ PIN が有効になっており、テスト アカウントをターゲットにしていることを再チェックします。
最後の手段として、デバイスを再起動すると、PIN タイマーがリセットされます。 デバイスを再起動しても PIN 画面が表示されない場合は、ポリシーで適切に構成されていない可能性があります。
[アクセスを取得] 画面は表示されましたが、スクリーンショットは引き続き許可されます (手順 12)
ポリシーの取得中に、間違ったポリシーが適用されています。 まず、Intune 管理センターにアクセスし、アプリ保護ポリシーがスクリーンショットを無効にし、テスト アカウントを対象としていることを再チェックします。 次に、(上記で説明した) 診断コンソールを使用して、アプリに対してプルダウンされたポリシーをチェックします。 スクリーンショットをブロックする必要があることを両方のポリシーで確認した場合は、Gradle ビルド プラグインの構成をチェックして、MAM 置換が行われていることを確認してください。
ログアウト後にアプリがクラッシュまたは終了するようでした (手順 13)
以前に登録され、ポリシーが適用されたアカウントを登録解除すると、そのアカウントに関連付けられているデータは SDK によってワイプされます。 アプリ プロセスの終了が予想されます。
ログアウトした後もスクリーンショットがブロックされる (手順 14)
unregisterAccountForMAM() を呼び出すには、ソース コードをダブル チェックします。
ログアウト後もポリシーが引き続き適用される場合は、アカウントが適切に登録解除および登録解除されていない可能性があります。
データ保護テストのトラブルシューティング
上記の データ保護テスト の手順に従うと、次の予期しない動作が発生する可能性があります。
アプリがポリシーを受け取ったり適用したりしていない
まず、アプリ保護ポリシーがテスト アカウントを含むグループを対象としていることを確認します。 詳細については、「Microsoft Intune でアプリ保護ポリシーの設定を検証する方法」を参照してください。
次に、クライアントの診断情報をチェックして、SDK が構成済みのポリシーを受信していることを確認します。
そうでない場合は、アプリの MAMServiceAuthenticationCallback と registerAccountForMAM への呼び出しの実装を調べます。
また、ログまたはデバッグをチェックしてMAMEnrollmentManager.Resultを確認します。
アプリはアンマネージド アプリとデータを共有できる
[組織データを他のアプリに送信する] が [ポリシーで管理されているアプリ] に設定されていることを確認します。 Microsoft Intune 管理センターで、ポリシーが正しく構成され、対象が設定されていることを確認します。 クライアント診断 情報 を確認して、SDK が構成されたポリシーを受信したことを確認します。
次に、ポリシーが正しく構成および取得されている場合は、ポリシーが適用されているかどうかをチェックします。 アプリはポリシーを受信または適用していません。
アプリが別のマネージド アプリとデータを共有できない
アプリ と他のマネージド アプリの両方を対象としたアプリ保護ポリシー設定を確認します。 両方のアプリを同じポリシーで対象にすることをお勧めします。 アプリを対象とするポリシーでは、[組織データを他のアプリに送信する] が [ポリシーで管理されたアプリ] に設定されている必要があります。 他のアプリを対象とするポリシーを確認します。[他のアプリからデータを受信する] が "なし" に設定されている場合、この動作は想定されます。
アプリはアンマネージド アプリからデータを受信できる
[他のアプリからデータを受信する] が [ポリシーで管理されているアプリ] に設定されていることを確認します。 Microsoft Intune 管理センターで、ポリシーが正しく構成され、対象が設定されていることを確認します。 クライアント診断 情報 を確認して、SDK が構成されたポリシーを受信したことを確認します。
次に、ポリシーが正しく構成および取得されている場合は、ポリシーが適用されているかどうかをチェックします。 アプリはポリシーを受信または適用していません。
アプリが別のマネージド アプリからデータを受信できない
アプリ と他のマネージド アプリの両方を対象としたアプリ保護ポリシー設定を確認します。 両方のアプリを同じポリシーで対象にすることをお勧めします。 アプリを対象とするポリシーでは、[他のアプリからデータを受信する] を [ポリシーで管理されたアプリ] に設定する必要があります。 他のアプリを対象とするポリシーを確認します。[組織データを他のアプリに送信する] が "なし" に設定されている場合、この動作は想定されます。
次の手順
上記のすべての 終了基準 を完了したら、アプリは単一 ID として正常に統合され、すべての基本的なアプリ保護ポリシーを適用できます。 以降のセクション、ステージ 5: マルチ ID、ステージ 6: App Configuration、ステージ 7: App 参加機能は、アプリで必要なアプリ保護ポリシーのサポートに応じて、必要な場合と不要な場合があります。 これらのセクションのいずれかがアプリに当てはまるかどうかわからない場合は、「 SDK 統合に関する重要な決定事項」を参照してください。