Limitar o acesso ao Microsoft Teams quando os trabalhadores da linha da frente estão fora do turno

Visão Geral

O tempo útil é uma funcionalidade que permite aos administradores limitar o acesso ao Microsoft Teams para trabalhadores por turnos em dispositivos móveis Android e iOS. Estes controlos foram concebidos para cenários de dispositivos dedicados da empresa (BYOD) ou bring-your-own-device para trabalhadores de primeira linha. Saiba mais sobre cenários de dispositivos de primeira linha.

Com esta funcionalidade, pode bloquear o acesso ao Teams ou mostrar uma mensagem de aviso quando os trabalhadores de primeira linha que estão fora do turno abrem o Teams. Considere ativar o tempo útil para a sua força de trabalho de primeira linha se:

  • Está preocupado com os trabalhadores de primeira linha que pedem pagamento fora do horário de trabalho se acederem a aplicações de trabalho.
  • As leis e regulamentos locais exigem que restrinja o acesso a aplicações de trabalho quando os funcionários estão fora do turno.

Como funciona

Quando um trabalhador de primeira linha entra no seu turno e abre o Teams, a aplicação verifica se a função de trabalho está dentro ou fora do turno.

  • Se a função de trabalho estiver no turno, pode aceder ao Teams.
  • Se a função de trabalho estiver desativada quando o Teams estiver aberto, a função de trabalho verá um ecrã de bloqueio ou aviso.
    • Se tiver configurado um ecrã de blocos, a função de trabalho não pode aceder ao Teams até aceder ao respetivo turno.
    • Se tiver configurado um ecrã de aviso, a função de trabalho pode dispensá-lo e optar por utilizar o Teams a seu critério.
  • Se uma função de trabalho estiver a utilizar o Teams durante o tempo limite, a função de trabalho vê um ecrã de bloqueio ou aviso para a aplicação depois de ter terminado.

Captura de ecrã a mostrar o ecrã de bloqueio de acesso e o ecrã de aviso.

Juntamente com o tempo útil, recomendamos que também configure o tempo de pausa para desativar automaticamente as notificações do Teams quando os trabalhadores estão fora do turno.

Configurar o tempo útil

Siga estes passos para ativar o tempo útil para a sua linha da frente.

Configurar políticas de proteção de aplicações para Android e iOS

Utilize Microsoft Intune políticas de proteção de aplicações para configurar o tempo útil para bloquear ou avisar o acesso ao Teams em dispositivos Android e iOS. Para obter mais informações sobre as definições de política, consulte:

Ligar o sistema de gestão da força de trabalho (WFM) à API workingTimeSchedule

Criar uma aplicação

  1. Crie uma aplicação no Microsoft Entra para a API do Graph workingTimeSchedule.

    Quando registar a sua aplicação, certifique-se de que escolhe a opção Contas apenas neste diretório organizacional (Inquilino único), para que apenas os utilizadores no seu inquilino possam utilizar a aplicação. Para saber mais, veja Registar uma aplicação com o plataforma de identidade da Microsoft.

  2. Adicione a permissão de aplicação oculta para chamar o API do Graph com o âmbito necessário, Schedule-WorkingTime.ReadWrite.All.

    1. Inicie sessão na sua aplicação no portal do Azure.

    2. Aceda ao separador Manifesto . Verá um JSON que contém a definição completa da sua aplicação.

    3. No final do manifesto, adicione a requiredResourceAccess propriedade .

      Esta propriedade especifica o conjunto de permissões a que a sua aplicação necessita de acesso. Por outras palavras, contém todas as APIs que a sua aplicação pode chamar. Se esta propriedade já estiver presente no manifesto, a API já tem algumas permissões concedidas.

    4. Dentro da requiredResourceAccess matriz, adicione um objeto com um ID de 00000003-0000-0000-0000-c000-0000000000000000 para especificar permissões da aplicação Graph.

      Se já tiver um objeto com este mesmo ID dentro da matriz requiredResourceAccess , só terá de adicionar o seguinte dentro da resourceAccess matriz:

      • Um objeto com o ID da nova permissão oculta, 0b21c159-dbf4-4dbb-a6f6-490e412c716e.
      • O tipo de permissão. Neste caso, Role.

      Eis um exemplo do aspeto do fim do manifesto:

      {
        ...
        "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. Salve as alterações.

Você precisa ser um administrador de locatários para executar esta etapa.

  1. No browser, aceda a https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id={ClientAppId}& response_type=code&scope=https://graph.microsoft.com/.default.
  2. No URL, substitua pelo ClientAppId ID da aplicação.
  3. Na caixa de diálogo de consentimento, selecione Aceitar para conceder consentimento do administrador ao nível do inquilino para a nova permissão oculta para a aplicação.

Chamar o Graph a partir da aplicação

Eis como chamar pontos finais do Graph da aplicação com código de exemplo em C#.

  1. Crie um novo projeto de consola com o SDK .NET 6 ou .NET 7.

  2. Instale o Microsoft.Identity.Client pacote NuGet.

  3. Abra o ficheiro program.cs e copie e cole o seguinte código de exemplo no mesmo:

        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. No código, altere o seguinte:

    • tenantId: substitua pelo seu ID de inquilino.
    • clientId: substitua pelo ID da sua aplicação.
    • clientSecret: tem de adicionar um segredo do cliente na secção de autenticação da sua aplicação. Também pode optar por utilizar um certificado de segurança e alterar o código em conformidade.
    • userId: substitua pelo utilizador ao qual pretende aplicar a política inWorkingTime ou outOfWorkingTime.

Configurar a hora de pausa

Este passo é opcional, mas recomendado.

Configure políticas de tempo de pausa no Intune para desativar automaticamente as notificações do Teams para trabalhadores de primeira linha durante o horário de descanso. Saiba mais sobre como criar políticas de tempo de pausa.

Perguntas frequentes

Preciso de utilizar a aplicação Turnos no Teams para tirar partido desta funcionalidade?

Não, esta funcionalidade depende do sinal de entrada/saída do relógio da sua WFM.

Posso utilizar o tempo útil se não tiver um sistema de entrada/saída?

Não, é necessário um sinal de entrada/saída do relógio para utilizar esta funcionalidade.