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

Este Guia de Início Rápido mostra-lhe como usar mais dos SDKs de Ficheiros do MIP. Usando uma das etiquetas de sensibilidade que mencionaste no Quickstart anterior, usas um gestor de ficheiros para definir/obter a etiqueta num ficheiro. A classe File handler expõe várias operações para definir/obter etiquetas, ou proteção, para tipos de ficheiros suportados.

Pré-requisitos

Se ainda não o fizeste, certifica-te de cumprir os seguintes pré-requisitos antes de continuar:

Implementar uma classe observador para monitorizar o objeto gestor de ficheiros

Semelhante ao observador que implementou (para o perfil e motor de ficheiros) no Início Rápido de inicialização de aplicação, agora implementa uma classe observador para um objeto gestor de ficheiros.

Crie uma implementação básica para um observador gestor de ficheiros, estendendo a classe do mip::FileHandler::Observer SDK. O observador é instanciado e utilizado posteriormente para monitorizar as operações do gestor de ficheiros.

  1. Abra a solução Visual Studio em que trabalhou no artigo anterior "Quickstart: Listar etiquetas de sensibilidade (C++)".

  2. Adicione uma nova classe ao seu projeto, que gera os arquivos header/.h e implementation/.cpp para você:

    • No Gerenciador de Soluções, clique com o botão direito do mouse no nó do projeto novamente, selecione Adicionar e, em seguida, selecione Classe.
    • No diálogo Adicionar Classe :
      • No campo Nome da Turma , introduza "filehandler_observer". Observe que os campos de arquivo .h e arquivo .cpp são preenchidos automaticamente, com base no nome inserido.
      • Quando terminar, clique no botão OK .
  3. Depois de gerar os arquivos .h e .cpp para a classe, ambos os arquivos são abertos nas guias Grupo de Editores. Agora atualize cada arquivo para implementar sua nova classe de observador:

    • Atualize "filehandler_observer.h", selecionando/eliminando 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, após 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/eliminando a implementação da 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, após 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 sua solução, para garantir que ela seja compilada com êxito antes de continuar.

Adicionar lógica para definir e obter uma etiqueta de sensibilidade

Adicionar lógica para definir e obter uma etiqueta de sensibilidade num ficheiro, usando o objeto do motor de ficheiros.

  1. Usando o Explorador de Soluções, abra o ficheiro .cpp no seu projeto que contém a implementação do main() método. Por padrão, tem o mesmo nome do projeto que o contém, que especificou durante a criação do projeto.

  2. Adicione as diretivas #include e using a seguir, logo abaixo das correspondentes já existentes, no topo do ficheiro.

    #include "filehandler_observer.h" 
    #include "mip/file/file_handler.h" 
    
    using mip::FileHandler;
    
  3. Perto do fim do main() corpo, abaixo system("pause"); e acima return 0; (onde parou no Quickstart 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 " << filePathIn << endl;
         mip::LabelingOptions labelingOptions(mip::AssignmentMethod::PRIVILEGED);
         handler->SetLabel(engine->GetLabelById(labelId), labelingOptions, new 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 de main(), identifique o bloco de encerramento da aplicação criado no primeiro quickstart e descomente a linha de código do handler:

    // 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 provisórios no código-fonte da seguinte forma, usando constantes de string:

    Marcador de Posição Valor
    <caminho de ficheiro de entrada> O caminho completo para um ficheiro 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 um ficheiro, considere caminho\nome do ficheiro: "c:\Test\Test.docx"
    • Para um email, considere assunto e remetente: "RE: Audit design:user1@contoso.com"
    <label-id> Um ID de etiqueta de sensibilidade, copiado da saída da consola no Quickstart anterior, por exemplo: "f42a3342-8706-4288-bd31-ebb85995028z".
    <caminho do ficheiro de saída> O caminho completo para o ficheiro de saída, que será uma cópia rotulada do ficheiro de entrada, por exemplo: "c:\\Test\\Test_labeled.docx".

Construir e testar a aplicação

Constrói e testa a tua aplicação cliente.

  1. Usa o F6 (Build Solution) para construir a tua aplicação cliente. Se não tiveres erros de compilação, usa F5 (Start debug) para executar a tua aplicação.

  2. Se o seu projeto for construído e executado com sucesso, a aplicação solicita um token de acesso cada vez que o SDK chama o seu AcquireOAuth2Token() método. Como fez anteriormente no "Início Rápido - Listar etiquetas de sensibilidade", execute o seu script PowerShell sempre que adquirir o token, utilizando 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 . . .
    

Pode verificar a aplicação do rótulo abrindo o ficheiro de saída e inspecionando visualmente as definições de proteção de informação do documento.

Observação

Se estiver a rotular um documento do Office, mas não tiver iniciado sessão usando uma conta do tenant Microsoft Entra onde o token de acesso foi obtido (e as etiquetas de sensibilidade estão configuradas), pode ser solicitado a iniciar sessão antes de abrir o documento rotulado.