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

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

Предпосылки

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

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

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

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

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

  2. Добавьте новый класс в свой проект, который автоматически генерирует для вас заголовочные файлы (.h) и файлы реализации (.cpp).

    • В обозревателе решений снова щелкните правой кнопкой мыши узел проекта, выберите "Добавить", а затем выберите "Класс".
    • В диалоговом окне Добавление класса:
      • В поле "Имя класса " введите "filehandler_observer". Обратите внимание, что поля файлов H и .cpp автоматически заполняются в зависимости от введенного имени.
      • По завершении нажмите кнопку "ОК ".
  3. После создания файлов 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() основного текста, ниже system("pause"); и выше return 0; (где вы остановились в предыдущем кратком руководстве), вставьте следующий фрагмент кода:

    // 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"
    • для сообщения электронной почты рассмотрите тему: отправитель: "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, где был получен токен доступа (и метки конфиденциальности настроены), вам может потребоваться войти в систему, прежде чем вы сможете открыть документ с метками.