共用方式為


當一線員工脫機時,限制Microsoft Teams 的存取

概觀

工作時間是一項功能,可讓系統管理員限制 Android 和 iOS 行動裝置上輪班工作者存取 Microsoft Teams。 這些控件是專為一線員工的自備裝置 (BYOD) 或公司擁有的專用裝置案例所設計。 深入瞭解一線裝置案例

透過這項功能,您可以封鎖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. 新增使用必要範圍 呼叫 圖形 API 的隱藏應用程式權限。 Schedule-WorkingTime.ReadWrite.All

    1. 在 Azure 入口網站 中登入您的應用程式。

    2. 移至 [ 指令清單] 索引 標籤。您會看到包含應用程式完整定義的 JSON。

    3. 在指令清單結尾處,新增 requiredResourceAccess 屬性。

      這個屬性會指定應用程式需要存取的許可權集。 換句話說,它包含應用程式可以呼叫的所有 API。 如果此屬性已存在於指令清單中,則您的 API 具有一些已授與的許可權。

    4. 在陣列內 requiredResourceAccess ,新增標識碼為的 00000003-0000-0000-0000-c000-0000000000000000 物件,以指定 Graph 應用程式的許可權。

      如果您的陣列內 requiredResourceAccess 已經有具有此相同識別碼的物件,則只需要在數位新增 resourceAccess 下列專案:

      • 具有新隱藏權限識別碼的物件。 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. 在 URL 中,將取代 ClientAppId 為您的應用程式識別碼。
  3. 在同意對話框中,選擇 [ 接受 ] 將全租用戶系統管理員同意授與應用程式的新隱藏許可權。

從應用程式呼叫 Graph

以下說明如何使用 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:將 取代為應用程式的識別碼。
    • clientSecret:您必須在應用程式的 驗證 區段中新增客戶端密碼。 您也可以選擇使用安全性憑證,並據此變更程序代碼。
    • userId:將 取代為您要套用 inWorkingTime 或 outOfWorkingTime 原則的使用者。

設定無訊息時間

此步驟是選擇性的,但建議使用。

在 Intune 中設定無訊息時間原則,以在非工作時間自動將一線員工的 Teams 通知設為靜音。 深入瞭解如何 建立無訊息時間原則

常見問題集

我需要使用Teams中的Shifts應用程式來利用這項功能嗎?

否,此功能依賴來自您 WFM 的時鐘輸入/輸出訊號。

如果我沒有時鐘入/出系統,可以使用工作時間嗎?

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