次の方法で共有


現場担当者がシフトをオフにしている場合にアクセスをMicrosoft Teamsに制限する

概要

作業時間は、管理者が Android および iOS モバイル デバイス上のシフト ワーカーのMicrosoft Teamsへのアクセスを制限できる機能です。 これらのコントロールは、現場担当者向けの Bring-your-own-device (BYOD) または会社所有の専用デバイス シナリオ用に設計されています。 最前線のデバイス シナリオの詳細を確認します

この機能を使用すると、Teams へのアクセスをブロックしたり、シフト外の現場担当者が Teams を開いたときに警告メッセージを表示したりできます。 次の場合は、現場の従業員の作業時間を有効にすることを検討してください。

  • 現場担当者が仕事用アプリにアクセスした場合に、勤務時間外の支払いを求めるのが心配です。
  • 現地の法律や規制では、従業員がシフト外の場合は、職場アプリへのアクセスを制限する必要があります。

メカニズム

現場担当者がシフトに入り、Teams を開くと、アプリはワーカーがシフトオンかオフかを確認します。

  • 作業者がシフト中の場合は、Teams にアクセスできます。
  • Teams が開いているときに作業者がシフトを外れている場合、ワーカーにはブロックまたは警告画面が表示されます。
    • ブロック画面を構成した場合、作業者はシフトに入るまで Teams にアクセスできません。
    • 警告画面を構成した場合、作業者はそれを無視して、自分の裁量で Teams を使用するかどうかを選択できます。
  • ワーカーが退勤中に Teams を使用している場合、退勤後にアプリのブロックまたは警告画面が表示されます。

ブロック アクセス画面と警告画面のスクリーンショット。

勤務時間と共に、ワーカーがシフトを外れているときに Teams 通知を自動的にミュートする静かな時間も設定することをお勧めします。

作業時間を設定する

現場の作業時間を有効にするには、次の手順に従います。

Android と iOS のアプリ保護ポリシーを構成する

アプリ保護ポリシー Microsoft Intune使用して、Android および iOS デバイス上の Teams へのアクセスをブロックまたは警告する作業時間を構成します。 ポリシー設定の詳細については、次を参照してください。

ワークフォース管理システム (WFM) を workingTimeSchedule API に接続する

アプリケーションを作成する

  1. workingTimeSchedule Graph APIのMicrosoft Entraでアプリケーションを作成します。

    アプリケーションを登録するときは、テナント内のユーザーのみがアプリケーションを使用できるように、[ この組織のディレクトリ内のアカウントのみ (シングル テナント)] オプションを選択してください。 詳細については、「Microsoft ID プラットフォームにアプリケーションを登録する」を参照してください。

  2. 必要なスコープ を使用してGraph APIを呼び出すための非表示のアプリケーションアクセス許可を追加しますSchedule-WorkingTime.ReadWrite.All

    1. Azure portalでアプリケーションにサインインします。

    2. [ マニフェスト ] タブに移動します。アプリケーションの完全な定義を含む JSON が表示されます。

    3. マニフェストの最後に、 プロパティを requiredResourceAccess 追加します。

      このプロパティは、アプリケーションがアクセスを必要とするアクセス許可のセットを指定します。 つまり、アプリケーションが呼び出すことができるすべての API が含まれています。 このプロパティがマニフェストに既に存在する場合、API には既にいくつかのアクセス許可が付与されています。

    4. 配列内に requiredResourceAccess 、 の ID 00000003-0000-0000-0000-c000-0000000000000000 を持つオブジェクトを追加して、Graph アプリケーションのアクセス許可を指定します。

      配列内に同じ ID を持つオブジェクトが既にある場合は、配列内requiredResourceAccessresourceAccessに次を追加するだけで済みます。

      • 新しい非表示のアクセス許可の ID を持つ オブジェクト。 0b21c159-dbf4-4dbb-a6f6-490e412c716e
      • アクセス許可の種類。 この場合は、 Roleです。

      マニフェストの末尾の例を次に示します。

      {
        ...
        "preAuthorizedApplications": [],
        "publisherDomain": "microsoft.onmicrosoft.com",
        "replyUrlsWithType": [
          {
            "url": "https://localhost:44321/signin-oidc",
            "type": "Web"
          },
          {
            "url": "https://localhost:44321/",
            "type": "Web"
          }
        ],
        "requiredResourceAccess": [
          {
            "resourceAppId": "00000003-0000-0000-c000-000000000000",
            "resourceAccess": [
              {
                "id": "0b21c159-dbf4-4dbb-a6f6-490e412c716e",
                "type": "Role"
              }
            ]
          }
        ],
        "samlMetadataUrl": null,
        "signInUrl": null,
        "signInAudience": "AzureADMyOrg",
        "tags": [],
        "tokenEncryptionKeyId": null
      }
      
    5. 変更を保存します。

この手順を実行するには、テナント管理者である必要があります。

  1. ブラウザーで、[ ; response_type=code&scope=https://graph.microsoft.com/.default] にhttps://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={ClientAppId}&移動します
  2. URL で、 をアプリ ID に置き換えます ClientAppId
  3. 同意ダイアログで、[ 同意 ] を選択して、アプリケーションの新しい非表示のアクセス許可にテナント全体の管理者の同意を付与します。

アプリケーションから Graph を呼び出す

C# のコード例を使用して、アプリケーションから Graph エンドポイントを呼び出す方法を次に示します。

  1. .NET 6 または .NET 7 SDK を使用して新しいコンソール プロジェクトを作成します。

  2. NuGet パッケージをインストールします Microsoft.Identity.Client

  3. program.cs ファイルを開き、次のコード例をコピーして貼り付けます。

        using System.Text;
      using Microsoft.Identity.Client;
      var userId = "928bf23a-81e8-47c9-ad54-2c0206248afe";
      var path = Path.Combine(Path.GetTempPath(),
      "workingTimeTokenGenerator.txt");
    
      string? accessToken;
      if (!File.Exists(path) || (DateTime.UtcNow - new
      FileInfo(path).LastWriteTimeUtc).TotalMinutes > 59)
      {
        var clientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        var clientSecret = "Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2";
        var tenantId = "cad3e174-69d3-4707-abd2-f527f45c367a";
        var scopes = new string[] { "00000003-0000-0000-c000-000000000000/.default" };
    
        var app = ConfidentialClientApplicationBuilder.Create(clientId)
          .WithClientSecret(clientSecret)
          .Build();
    
        var result = await app.AcquireTokenForClient(scopes)
          .WithAuthority(AzureCloudInstance.AzurePublic, tenantId)
          .ExecuteAsync();
    
        accessToken = result.AccessToken;
        File.WriteAllText(path, accessToken);
      }
      else
      {
        accessToken = File.ReadAllText(path);
      }
    
      int number;
    
      while (true)
      {
        Console.WriteLine("Press 1 for startWorkingTime, 2 for endWorkingTime.");
        var choice = Console.ReadLine();
        if (!Int32.TryParse(choice, out number) || !new[] { 1, 2}.Contains(number))
        {
          Console.WriteLine("Out-of-range election.");
          continue;
        }
    
        break;
      }
    
      Console.WriteLine("Performing request...");
      var httpClient = new HttpClient();
      var message = new HttpRequestMessage
      {
        Method = HttpMethod.Post,
        RequestUri = new
      Uri($"https://graph.microsoft.com/beta/users/{userId}/solutions/schedule/{(number == 1 ? "startWorkingTime" : "endWorkingTime")}")
      };
      message.Headers.Add("Authorization", $"Bearer {accessToken}");
      message.Content = new StringContent("", Encoding.UTF8,
      "application/json");
      var response = await httpClient.SendAsync(message);
      if (!response.IsSuccessStatusCode)
      {
        string? content = null;
        try
        {
          content = await response.Content?.ReadAsStringAsync();
        }
        catch
        {
        }
    
        Console.WriteLine($"Graph returned a non success status code: 
      {response.StatusCode}. Reason phrase: {response.ReasonPhrase}." +
          (content is null ? "Unable to get the response body." :
      $"Content: {content}"));
      }
      else
      {
        Console.WriteLine($"Graph returned a success status code: 
      {response.StatusCode}.");
      }
    
      Console.WriteLine("Press any key to exit.");
      _ = Console.ReadKey();
    
  4. コードで、次のように変更します。

    • tenantId: をテナント ID に置き換えます。
    • clientId: をアプリケーションの ID に置き換えます。
    • clientSecret: アプリケーションの 認証 セクションにクライアント シークレットを追加する必要があります。 セキュリティ証明書を使用し、それに応じてコードを変更することもできます。
    • userId: inWorkingTime または outOfWorkingTime ポリシーを適用するユーザーに置き換えます。

静かな時間を設定する

この手順は省略可能ですが、推奨されます。

非稼働時間中に現場担当者の Teams 通知を自動的にミュートするように、Intuneで静かな時間ポリシーを構成します。 静かな時間ポリシーを作成する方法の詳細については、こちらをご覧ください。

よく寄せられる質問

この機能を利用するには、Teams の Shifts アプリを使用する必要がありますか?

いいえ、この機能は、WFMからのクロックイン/アウト信号に依存します。

時計のイン/アウト システムがない場合、作業時間を使用できますか?

いいえ、この機能を使用するにはクロックイン/アウト信号が必要です。