限制第一線員工下班時使用 Microsoft Teams 的存取權

概觀

工作時間是一項功能,允許管理員限制 Android 和 iOS 行動裝置上輪班工作者使用 Microsoft Teams 的權限。 這些控制裝置設計用於自帶裝置 (自帶裝置) 或公司自有專用裝置場景,供前線工作者使用。 了解更多關於前線設備情境的資訊

透過此功能,你可以封鎖 Teams 存取,或在非班次的第一線員工開啟 Teams 時顯示警告訊息。 考慮為您的第一線員工安排工作時間,條件是:

  • 你擔心前線工作者如果使用工作應用程式,會在下班後要求領薪水。
  • 當地法律規定,員工下班時必須限制使用工作應用程式。

運作方式

當第一線員工打卡上班並開啟 Teams 時,應用程式會檢查該員工是上班還是下班。

  • 如果員工在值班,他們可以使用 Teams。
  • 如果員工在 Teams 開啟時下班,員工會看到封鎖或警告畫面。
    • 如果你設定了封鎖畫面,員工必須打卡上班才能使用 Teams。
    • 如果你設定了警告畫面,工作人員可以關閉警告畫面,並自行決定是否使用 Teams。
  • 如果員工在打卡下班時使用 Teams,打卡後會看到應用程式的封鎖或警告畫面。

封鎖存取畫面和警告畫面的截圖。

除了工作時間外,我們也建議您設定安靜時間,讓員工下班時自動靜音 Teams 通知。

設定工作時間

請遵循以下步驟,為您的前線提供工作時間。

設定 Android 與 iOS 的應用程式保護政策

使用 Microsoft Intune 應用程式保護政策,設定工作時間以阻擋或警告 Android 和 iOS 裝置上的 Teams 存取。 欲了解更多政策設定資訊,請參閱:

將您的勞動力管理系統 (WFM) 連接到 workingTimeSchedule API

建立應用程式

  1. 在 Microsoft Entra 中建立一個應用程式,使用 workingTimeSchedule 圖形 API。

    註冊應用程式時,請確保只選擇 此組織目錄中的帳戶, (單一租戶) 選項,這樣只有租戶內的使用者能使用該應用程式。 欲了解更多,請參閱「使用 Microsoft 身分識別平台註冊應用程式」。

  2. 新增隱藏應用程式權限,使用所需的範圍Schedule-WorkingTime.ReadWrite.All呼叫圖形 API 。

    1. 請在 Azure 入口網站登入你的應用程式。

    2. 前往 清單 分頁。你會看到一個包含你應用程式完整定義的 JSON。

    3. 在清單末尾,加入該 requiredResourceAccess 物業。

      此屬性指定您的應用程式需要存取的權限集合。 換句話說,它包含了所有應用程式可以呼叫的 API。 如果這個屬性已經存在於清單中,代表你的 API 已經被授予了一些權限。

    4. 在陣列內 requiredResourceAccess ,加入一個 ID 為 的 00000003-0000-0000-0000-c000-0000000000000000 物件,以指定 Graph 應用程式的權限。

      如果你的陣列裡 requiredResourceAccess 已經有一個帶有相同 ID 的物件,你只需要在陣列裡 resourceAccess 加入以下內容:

      • 一個帶有新隱藏權限 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. 在瀏覽器中,請點到 https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={ClientAppId}& response_type=code&scope=https://graph.microsoft.com/.default
  2. 在網址中,請替換 ClientAppId 成你的應用程式 ID。
  3. 在同意對話框中,選擇 「接受 」以授予整個租戶管理員對該應用程式新隱藏權限的同意。

應用程式中的呼叫圖

以下是如何用 C# 範例程式碼從應用程式呼叫 Graph 端點的方法。

  1. 用 .NET 6 或 .NET 7 SDK 建立一個新的主控台專案。

  2. 安裝 Microsoft.Identity.Client NuGet 套件。

  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:替換成你的租戶識別碼。
    • clientId:請替換成你申請的 ID。
    • clientSecret: 您必須在應用程式的 認證 區塊新增客戶端秘密。 你也可以選擇使用安全憑證,並相應更改程式碼。
    • userId:將 inWorkingTime 或 outOfWorkingTime 政策替換為你想套用的使用者。

安排安靜時間

此步驟為可選,但建議進行。

在 Intune 中設定安靜時間政策,自動在非工作時間靜音前線員工的 Teams 通知。 了解更多關於 如何制定安靜時間政策的資訊。

常見問題集

我需要在 Teams 裡使用 Shifts 應用程式才能使用這個功能嗎?

不,這個功能依賴你 WFM 的打卡/出時鐘訊號。

如果我沒有打卡上下班系統,我可以使用工作時間嗎?

不,使用此功能需要時鐘輸入/輸出訊號。