概觀
工作時間是一項功能,允許管理員限制 Android 和 iOS 行動裝置上輪班工作者使用 Microsoft Teams 的權限。 這些控制裝置設計用於自帶裝置 (自帶裝置) 或公司自有專用裝置場景,供前線工作者使用。 了解更多關於前線設備情境的資訊。
透過此功能,你可以封鎖 Teams 存取,或在非班次的第一線員工開啟 Teams 時顯示警告訊息。 考慮為您的第一線員工安排工作時間,條件是:
- 你擔心前線工作者如果使用工作應用程式,會在下班後要求領薪水。
- 當地法律規定,員工下班時必須限制使用工作應用程式。
運作方式
當第一線員工打卡上班並開啟 Teams 時,應用程式會檢查該員工是上班還是下班。
- 如果員工在值班,他們可以使用 Teams。
- 如果員工在 Teams 開啟時下班,員工會看到封鎖或警告畫面。
- 如果你設定了封鎖畫面,員工必須打卡上班才能使用 Teams。
- 如果你設定了警告畫面,工作人員可以關閉警告畫面,並自行決定是否使用 Teams。
- 如果員工在打卡下班時使用 Teams,打卡後會看到應用程式的封鎖或警告畫面。
除了工作時間外,我們也建議您設定安靜時間,讓員工下班時自動靜音 Teams 通知。
設定工作時間
請遵循以下步驟,為您的前線提供工作時間。
設定 Android 與 iOS 的應用程式保護政策
使用 Microsoft Intune 應用程式保護政策,設定工作時間以阻擋或警告 Android 和 iOS 裝置上的 Teams 存取。 欲了解更多政策設定資訊,請參閱:
將您的勞動力管理系統 (WFM) 連接到 workingTimeSchedule API
建立應用程式
在 Microsoft Entra 中建立一個應用程式,使用 workingTimeSchedule 圖形 API。
註冊應用程式時,請確保只選擇 此組織目錄中的帳戶, (單一租戶) 選項,這樣只有租戶內的使用者能使用該應用程式。 欲了解更多,請參閱「使用 Microsoft 身分識別平台註冊應用程式」。
新增隱藏應用程式權限,使用所需的範圍
Schedule-WorkingTime.ReadWrite.All呼叫圖形 API 。請在 Azure 入口網站登入你的應用程式。
前往 清單 分頁。你會看到一個包含你應用程式完整定義的 JSON。
在清單末尾,加入該
requiredResourceAccess物業。此屬性指定您的應用程式需要存取的權限集合。 換句話說,它包含了所有應用程式可以呼叫的 API。 如果這個屬性已經存在於清單中,代表你的 API 已經被授予了一些權限。
在陣列內
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 }- 一個帶有新隱藏權限 ID 的物件。
儲存變更。
授予整個租戶管理員對應用程式隱藏權限的同意
您必須是租戶管理員才能執行此步驟。
- 在瀏覽器中,請點到 https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={ClientAppId}& response_type=code&scope=https://graph.microsoft.com/.default。
- 在網址中,請替換
ClientAppId成你的應用程式 ID。 - 在同意對話框中,選擇 「接受 」以授予整個租戶管理員對該應用程式新隱藏權限的同意。
應用程式中的呼叫圖
以下是如何用 C# 範例程式碼從應用程式呼叫 Graph 端點的方法。
用 .NET 6 或 .NET 7 SDK 建立一個新的主控台專案。
安裝
Microsoft.Identity.ClientNuGet 套件。打開 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:請替換成你申請的 ID。 -
clientSecret: 您必須在應用程式的 認證 區塊新增客戶端秘密。 你也可以選擇使用安全憑證,並相應更改程式碼。 -
userId:將 inWorkingTime 或 outOfWorkingTime 政策替換為你想套用的使用者。
-
安排安靜時間
此步驟為可選,但建議進行。
在 Intune 中設定安靜時間政策,自動在非工作時間靜音前線員工的 Teams 通知。 了解更多關於 如何制定安靜時間政策的資訊。
常見問題集
我需要在 Teams 裡使用 Shifts 應用程式才能使用這個功能嗎?
不,這個功能依賴你 WFM 的打卡/出時鐘訊號。
如果我沒有打卡上下班系統,我可以使用工作時間嗎?
不,使用此功能需要時鐘輸入/輸出訊號。