Início Rápido: definir e obter um rótulo de confidencialidade (C++)

Este guia de início rápido mostra como usar mais recursos dos SDKs de Arquivo do MIP. Ao usar um dos rótulos de confidencialidade que você listou no guia de início rápido anterior, você usa um manipulador de arquivo para definir e obter o rótulo de um arquivo. A classe de manipulador de arquivos expõe várias operações para definir e obter rótulos ou proteção para tipos de arquivo com suporte.

Pré-requisitos

Caso ainda não tenha feito isso, certifique-se de concluir os seguintes pré-requisitos antes de continuar:

  • Início rápido: Listar rótulos de confidencialidade (C++). Conclua primeiro este guia de início rápido. Ele cria uma solução de Visual Studio inicial que lista os rótulos de confidencialidade de uma organização. Este guia de início rápido "Definir e obter um rótulo de confidencialidade" baseia-se no anterior.
  • Opcionalmente: Revisar os conceitos de manipuladores de arquivos no SDK do MIP.

Implementar uma classe de observador para monitorar o objeto do manipulador de arquivos

Como no observador que você implementou para o perfil de arquivo e o mecanismo no início rápido de inicialização do aplicativo, agora você implementa uma classe de observador para um objeto de manipulador de arquivos.

Crie uma implementação básica para um observador de manipulador de arquivos estendendo a classe do mip::FileHandler::Observer SDK. O aplicativo cria uma instância do observador e o usa posteriormente para monitorar as operações do manipulador de arquivos.

  1. Abra a solução do Visual Studio em que você trabalhou no artigo anterior "Início Rápido: Listar rótulos de confidencialidade (C++)".

  2. Adicione uma nova classe ao seu projeto. Visual Studio gera os arquivos de cabeçalho/.h e implementação/.cpp para você:

    • No Gerenciador de Soluções, clique com o botão direito do mouse no nó do projeto novamente, selecione Adicionar e selecione Classe.
    • Na caixa de diálogo Adicionar Classe :
      • No campo Nome da Classe , insira "filehandler_observer". Observe que o arquivo .h e os campos de arquivo .cpp são preenchidos automaticamente, com base no nome inserido.
      • Ao terminar, selecione OK.
  3. Depois que Visual Studio gera os arquivos .h e .cpp para a classe, ambos os arquivos são abertos nas guias do editor. Atualize cada arquivo para implementar sua nova classe de observador:

    • Atualize "filehandler_observer.h", selecionando/excluindo a classe gerada filehandler_observer . Não remova as diretivas de pré-processador geradas pela etapa anterior (#pragma, #include). Em seguida, copie/cole a seguinte fonte no arquivo, depois de quaisquer diretivas de pré-processador existentes:

      #include <memory>
      #include "mip/file/file_engine.h"
      #include "mip/file/file_handler.h"
      
      class FileHandlerObserver final : public mip::FileHandler::Observer {
      public:
         FileHandlerObserver() { }
         // Observer implementation
         void OnCreateFileHandlerSuccess(const std::shared_ptr<mip::FileHandler>& fileHandler, const std::shared_ptr<void>& context) override;
         void OnCreateFileHandlerFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;
         void OnCommitSuccess(bool committed, const std::shared_ptr<void>& context) override;
         void OnCommitFailure(const std::exception_ptr& error, const std::shared_ptr<void>& context) override;		
      };
      
    • Atualize "filehandler_observer.cpp", selecionando/excluindo a implementação de classe gerada filehandler_observer . Não remova as diretivas de pré-processador geradas pela etapa anterior (#pragma, #include). Em seguida, copie/cole a seguinte fonte no arquivo, depois de quaisquer diretivas de pré-processador existentes:

      void FileHandlerObserver::OnCreateFileHandlerSuccess(const std::shared_ptr<mip::FileHandler>& fileHandler, const std::shared_ptr<void>& context) {
         auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
         promise->set_value(fileHandler);
      }
      
      void FileHandlerObserver::OnCreateFileHandlerFailure(const std::exception_ptr & error, const std::shared_ptr<void>& context) {
         auto promise = std::static_pointer_cast<std::promise<std::shared_ptr<mip::FileHandler>>>(context);
         promise->set_exception(error);
      }
      
      void FileHandlerObserver::OnCommitSuccess(bool committed, const std::shared_ptr<void>& context) {
         auto promise = std::static_pointer_cast<std::promise<bool>>(context);
         promise->set_value(committed);
      }
      
      void FileHandlerObserver::OnCommitFailure(const std::exception_ptr & error, const std::shared_ptr<void>& context) {
         auto promise = std::static_pointer_cast<std::promise<bool>>(context);
         promise->set_exception(error);
      }
      
  4. Opcionalmente, use F6 (Build Solution) para executar uma compilação/link de teste da solução e confirme se ela é compilada com êxito antes de continuar.

Adicionar uma lógica para definir e obter um rótulo de confidencialidade

Use o objeto File engine para adicionar uma lógica que define e obtém um rótulo de confidencialidade em um arquivo.

  1. Em Gerenciador de Soluções, abra o arquivo .cpp em seu projeto que contém a implementação do main() método. Ele usa como padrão o mesmo nome do projeto que o contém, que você especificou durante a criação do projeto.

  2. Adicione as diretivas #include e using a seguir às diretivas existentes correspondentes no início do arquivo:

    #include "filehandler_observer.h" 
    #include "mip/file/file_handler.h" 
    
    using mip::FileHandler;
    
  3. No final do main() corpo, depois system("pause"); e antes return 0; de onde você parou no início rápido anterior, insira o seguinte código:

    // Set up async FileHandler for input file operations
    string inputFilePath = "<input-file-path>";
    string actualFilePath = "<content-identifier>";
    std::shared_ptr<FileHandler> handler;
    try
    {
         auto handlerPromise = std::make_shared<std::promise<std::shared_ptr<FileHandler>>>();
         auto handlerFuture = handlerPromise->get_future();
         engine->CreateFileHandlerAsync(
              inputFilePath,
              actualFilePath,                       
              true, 
              std::make_shared<FileHandlerObserver>(), 
              handlerPromise);
         handler = handlerFuture.get();
    }
    catch (const std::exception& e)
    {
         cout << "An exception occurred... did you specify a valid input file path?\n\n" << e.what() << "'\n";
         system("pause");
         return 1;
    }
    
    // Set a label on input file
    try
    {
         string labelId = "<label-id>";
         cout << "\nApplying Label ID " << labelId << " to " << inputFilePath << endl;
         mip::LabelingOptions labelingOptions(mip::AssignmentMethod::PRIVILEGED);
         handler->SetLabel(engine->GetLabelById(labelId), labelingOptions, mip::ProtectionSettings());
    }
    catch (const std::exception& e)
    {
         cout << "An exception occurred... did you specify a valid label ID?\n\n" << e.what() << "'\n";
         system("pause");
         return 1; 
    }
    
    // Commit changes, save as a different/output file
    string filePathOut = "<output-file-path>";
    try
    {
     	cout << "Committing changes" << endl;
         auto commitPromise = std::make_shared<std::promise<bool>>();
         auto commitFuture = commitPromise->get_future();
         handler->CommitAsync(filePathOut, commitPromise);
     	if (commitFuture.get()) {
     		cout << "\nLabel committed to file: " << filePathOut << endl;
     	}
     	else {
     		cout << "Failed to label: " + filePathOut << endl;
     		return 1;
     	}
    }
    catch (const std::exception& e)
    {
         cout << "An exception occurred... did you specify a valid commit file path?\n\n" << e.what() << "'\n";
         system("pause");
         return 1;
    }
    system("pause");
    
    // Set up async FileHandler for output file operations
    actualFilePath = "<content-identifier>";
    try
    {
         auto handlerPromise = std::make_shared<std::promise<std::shared_ptr<FileHandler>>>();
         auto handlerFuture = handlerPromise->get_future();
         engine->CreateFileHandlerAsync(
              filePathOut,
              actualFilePath,
              true,
              std::make_shared<FileHandlerObserver>(),
              handlerPromise);
    
         handler = handlerFuture.get();
    }
    catch (const std::exception& e)
    {
         cout << "An exception occurred... did you specify a valid output file path?\n\n" << e.what() << "'\n";
         system("pause");
         return 1;
    }
    
    // Get the label from output file
    try
    {
         cout << "\nGetting the label committed to file: " << filePathOut << endl;
         auto label = handler->GetLabel();
         cout << "Name: " + label->GetLabel()->GetName() << endl;
         cout << "Id: " + label->GetLabel()->GetId() << endl;
    }
    catch (const std::exception& e)
    {
         cout << "An exception occurred... did you specify a valid label ID?\n\n" << e.what() << "'\n";
         system("pause");
         return 1;
    }
    system("pause");
    
  4. No final, localize o bloco de main()desligamento do aplicativo criado no primeiro início rápido e descompacte a linha do manipulador:

    // Application shutdown. Null out profile and engine, call ReleaseAllResources();
    // Application may crash at shutdown if resources aren't properly released.
    profile = nullptr;
    engine = nullptr;
    handler = nullptr;
    mipContext = nullptr;
    
  5. Substitua os valores dos marcadores no código-fonte da seguinte maneira, usando constantes de cadeia de caracteres:

    Espaço reservado Valor
    <caminho-do-arquivo-de-entrada> O caminho completo para um arquivo de entrada de teste, por exemplo: "c:\\Test\\Test.docx".
    <identificador de conteúdo> Um identificador legível por humanos para o conteúdo. Por exemplo:
    • Para indicar um arquivo, use caminho\nome_do_arquivo: "c:\Test\Test.docx"
    • Para um email, use subject:sender: "RE: Audit design:user1@contoso.com"
    <label-id> Uma ID de rótulo de confidencialidade, copiada da saída do console no Início Rápido anterior. Por exemplo: "f42a3342-8706-4288-bd31-ebb85995028z".
    <output-file-path> O caminho completo para o arquivo de saída, que é uma cópia rotulada do arquivo de entrada, por exemplo: "c:\\Test\\Test_labeled.docx".

Criar e testar o aplicativo

Crie e teste seu aplicativo cliente.

  1. Use F6 (Build Solution) para criar seu aplicativo cliente. Se o build não tiver erros, use F5 (Iniciar depuração) para executar seu aplicativo.

  2. Se o projeto for compilado e executado com êxito, o aplicativo solicitará um token de acesso sempre que o SDK chamar seu AcquireOAuth2Token() método. Como você fez anteriormente no guia de início rápido "Listar rótulos de confidencialidade", execute o script do PowerShell para adquirir o token sempre com os valores fornecidos para $authority e $resourceUrl.

    Run the PowerShell script to generate an access token using the following values, then copy/paste it below:
    
    Sensitivity labels for your organization:
    Non-Business : 87ba5c36-17cf-14793-bbc2-bd5b3a9f95cz
    Public : 83867195-f2b8-2ac2-b0b6-6bb73cb33afz
    General : f42a3342-8706-4288-bd31-ebb85995028z
    Confidential : 074e457c-5848-4542-9a6f-34a182080e7z
    Highly Confidential : f55c2dea-db0f-47cd-8520-a52e1590fb6z
    Press any key to continue . . .
    
    Applying Label ID 074e457c-5848-4542-9a6f-34a182080e7z to c:\Test\Test.docx
    Committing changes
    
    Label committed to file: c:\Test\Test_labeled.docx
    Press any key to continue . . .
    
    Getting the label committed to file: c:\Test\Test_labeled.docx
    Name: Confidential
    Id: 074e457c-5848-4542-9a6f-34a182080e7z
    Press any key to continue . . .
    

Verifique o aplicativo de rótulo abrindo o arquivo de saída e inspecionando visualmente as configurações de proteção de informações do documento.

Observação

Se você estiver aplicando um rótulo a um documento do Microsoft Office, mas não tiver feito login com uma conta do locatário do Microsoft Entra que emitiu o token de acesso (e os rótulos de confidencialidade estiverem configurados), talvez seja solicitado que você faça login antes que possa abrir o documento com rótulo.

Próximas Etapas