Краткое руководство. Установка и получение метки конфиденциальности (C++)

В этом кратком руководстве показано, как использовать дополнительные компоненты MIP File SDK. Используя одну из меток конфиденциальности, перечисленных в предыдущем кратком руководстве, вы можете с помощью обработчика файлов установить метку для файла и получить её. Класс обработчика файлов предоставляет различные операции для настройки и получения меток или защиты для поддерживаемых типов файлов.

Предпосылки

Если вы еще не сделали этого, перед продолжением обязательно выполните следующие предварительные требования:

Реализация класса наблюдателя для мониторинга объекта обработчика файлов

Как и в кратком руководстве по инициализации приложения, где вы реализовали наблюдатель для профиля файла и ядра, теперь вы реализуете класс-наблюдатель для объекта обработчика файлов.

Создайте базовую реализацию для наблюдателя обработчика файлов, расширив класс пакета SDK mip::FileHandler::Observer . Приложение создает экземпляр наблюдателя и использует его позже для мониторинга операций обработчика файлов.

  1. Откройте решение Visual Studio, над которым вы работали в предыдущей статье «Краткое руководство: Перечисление меток конфиденциальности (C++)».

  2. Добавьте новый класс в проект. Visual Studio создает за вас и файл заголовка/.h, и файл реализации/.cpp:

    • В обозревателе решений снова щелкните правой кнопкой мыши узел проекта, выберите "Добавить", а затем выберите "Класс".
    • В диалоговом окне Добавление класса:
      • В поле "Имя класса " введите "filehandler_observer". Обратите внимание, что поля файлов H и .cpp автоматически заполняются в зависимости от введенного имени.
      • По завершении выберите ОК.
  3. После того как Visual Studio создает файлы H и .cpp для класса, оба файла открываются на вкладках редактора. Обновите каждый файл, чтобы реализовать новый класс наблюдателя:

    • Обновите файл "filehandler_observer.h", выбрав или удалив созданный filehandler_observer класс. Не удаляйте директивы препроцессора, созданные на предыдущем шаге (#pragma, #include). Затем скопируйте и вставьте следующий источник в файл после всех существующих директив препроцессора:

      #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;		
      };
      
    • Обновите "filehandler_observer.cpp", выбрав или удалив созданную filehandler_observer реализацию класса. Не удаляйте директивы препроцессора, созданные на предыдущем шаге (#pragma, #include). Затем скопируйте и вставьте следующий источник в файл после всех существующих директив препроцессора:

      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. При необходимости используйте F6 (сборка решения) для запуска тестовой компиляции или ссылки решения и подтверждения успешной сборки перед продолжением.

Добавьте логику для установки и получения метки конфиденциальности

Используйте объект обработчика файлов для добавления логики, которая задает и получает метку конфиденциальности в файле.

  1. В Обозреватель решений откройте файл .cpp в проекте, который содержит реализацию main() метода. По умолчанию используется то же имя, что и проект, содержащий его, указанный во время создания проекта.

  2. Добавьте следующие #include и using директивы после соответствующих существующих директив в верхней части файла:

    #include "filehandler_observer.h" 
    #include "mip/file/file_handler.h" 
    
    using mip::FileHandler;
    
  3. Ближе к концу тела main(), после return 0; и перед system("pause");, где вы остановились в предыдущем кратком руководстве, вставьте следующий код:

    // 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. Ближе к концу файла main() найдите блок завершения работы приложения, созданный в первом руководстве по быстрому запуску, и раскомментируйте строку обработчика:

    // 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. Замените значения заполнителей в исходном коде следующим образом, используя строковые константы:

    Placeholder Ценность
    <путь к входному файлу> Полный путь к тестовому входному файлу, например: "c:\\Test\\Test.docx"
    <идентификатор содержимого> Удобочитаемый пользователем идентификатор содержимого. Например:
    • Для файла используйте path\filename: "c:\Test\Test.docx"
    • Для электронной почты используйте subject:sender: "RE: Audit design:user1@contoso.com"
    <label-id> Идентификатор метки конфиденциальности, скопированный из консольного вывода в предыдущем Быстром начале, например: "f42a3342-8706-4288-bd31-ebb85995028z".
    <путь к выходным файлам> Полный путь к выходному файлу, который является помеченной копией входного файла, например: "c:\\Test\\Test_labeled.docx"

Создание и тестирование приложения

Создайте и протестируйте клиентское приложение.

  1. Используйте F6 (построить решение) для сборки вашего клиентского приложения. Если сборка не имеет ошибок, используйте F5 (начать отладку) для запуска приложения.

  2. Если ваш проект успешно собирается и запускается, приложение запрашивает токен доступа каждый раз, когда SDK вызывает метод AcquireOAuth2Token(). Как и ранее в кратком руководстве «Вывод списка меток конфиденциальности», запускайте скрипт PowerShell, чтобы каждый раз получать токен со значениями, указанными для $authority и $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 . . .
    

Проверьте приложение меток, открыв выходной файл и визуально проверяя параметры защиты информации документа.

Примечание.

Если вы применяете метку к документу Office, но не вошли в систему с помощью учетной записи клиента Microsoft Entra, выдавшего маркер доступа (и если метки конфиденциальности настроены), перед открытием документа с примененной меткой вам может быть предложено войти в систему.

Дальнейшие действия