當一線員工脫機時,限制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
建立應用程式
在 Microsoft Entra 中建立 workingTimeSchedule 圖形 API 的應用程式。
當您註冊應用程式時,請確定您選擇 [ 僅限此組織目錄中的帳戶 (單一租使用者) ] 選項,讓只有租使用者中的使用者可以使用應用程式。 若要深入瞭解,請參閱使用 Microsoft 身分識別平台 註冊應用程式。
新增使用必要範圍 呼叫 圖形 API 的隱藏應用程式權限。
Schedule-WorkingTime.ReadWrite.All
在 Azure 入口網站 中登入您的應用程式。
移至 [ 指令清單] 索引 標籤。您會看到包含應用程式完整定義的 JSON。
在指令清單結尾處,新增
requiredResourceAccess
屬性。這個屬性會指定應用程式需要存取的許可權集。 換句話說,它包含應用程式可以呼叫的所有 API。 如果此屬性已存在於指令清單中,則您的 API 具有一些已授與的許可權。
在陣列內
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 }
- 具有新隱藏權限識別碼的物件。
儲存變更。
將全租用戶系統管理員同意授與應用程式的隱藏許可權
您必須是租用戶系統管理員,才能執行此步驟。
- 在瀏覽器中,移至 https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={ClientAppId}&response_type=code&scope=https://graph.microsoft.com/.default。
- 在 URL 中,將取代
ClientAppId
為您的應用程式識別碼。 - 在同意對話框中,選擇 [ 接受 ] 將全租用戶系統管理員同意授與應用程式的新隱藏許可權。
從應用程式呼叫 Graph
以下說明如何使用 C# 中的範例程式代碼,從應用程式呼叫 Graph 端點。
使用 .NET 6 或 .NET 7 SDK 建立新的控制台專案。
Microsoft.Identity.Client
安裝 NuGet 套件。開啟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();
在程式代碼中,變更下列專案:
-
tenantId
:以您的租使用者識別碼取代 。 -
clientId
:將 取代為應用程式的識別碼。 -
clientSecret
:您必須在應用程式的 驗證 區段中新增客戶端密碼。 您也可以選擇使用安全性憑證,並據此變更程序代碼。 -
userId
:將 取代為您要套用 inWorkingTime 或 outOfWorkingTime 原則的使用者。
-
設定無訊息時間
此步驟是選擇性的,但建議使用。
在 Intune 中設定無訊息時間原則,以在非工作時間自動將一線員工的 Teams 通知設為靜音。 深入瞭解如何 建立無訊息時間原則。
常見問題集
我需要使用Teams中的Shifts應用程式來利用這項功能嗎?
否,此功能依賴來自您 WFM 的時鐘輸入/輸出訊號。
如果我沒有時鐘入/出系統,可以使用工作時間嗎?
否,需要時鐘輸入/輸出訊號才能使用此功能。