Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом кратком руководстве показано, как более широко использовать SDK для работы с файлами MIP. Используя одну из меток конфиденциальности, перечисленных в предыдущем кратком руководстве, вы используете обработчик файлов для задания и получения метки в файле. Класс обработчика файлов предоставляет различные операции для настройки и получения меток или защиты для поддерживаемых типов файлов.
Предпосылки
Если вы еще не сделали этого, перед продолжением обязательно выполните следующие предварительные требования:
- Полное краткое руководство: Сначала выполните "Быстрый старт: Список меток конфиденциальности (C++)", который создаёт начальное решение в Visual Studio для перечисления меток конфиденциальности организации. Это краткое руководство "Установить и получить метку конфиденциальности" основывается на предыдущем.
- При необходимости: изучите понятия обработчиков файлов в MIP SDK.
Реализация класса наблюдателя для мониторинга объекта обработчика файлов
Похожие на наблюдателя, которого вы реализовали для профиля файлов и движка в кратком руководстве по инициализации приложения, теперь вы реализуете класс наблюдателя для объекта обработчика файлов.
Создайте базовую реализацию для наблюдателя обработчика файлов, расширив класс пакета SDK mip::FileHandler::Observer . Экземпляр наблюдателя создается и используется впоследствии для мониторинга операций обработчика файлов.
Откройте решение Visual Studio, над которым вы работали в предыдущей статье «Краткое руководство: Перечисление меток конфиденциальности (C++)».
Добавьте новый класс в свой проект, который автоматически генерирует для вас заголовочные файлы (.h) и файлы реализации (.cpp).
- В обозревателе решений снова щелкните правой кнопкой мыши узел проекта, выберите "Добавить", а затем выберите "Класс".
- В диалоговом окне Добавление класса:
- В поле "Имя класса " введите "filehandler_observer". Обратите внимание, что поля файлов H и .cpp автоматически заполняются в зависимости от введенного имени.
- По завершении нажмите кнопку "ОК ".
После создания файлов 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); }
При необходимости используйте F6 (сборка решения) для запуска тестовой компиляции/связывания вашего решения, чтобы убедиться, что она успешно выполняется перед тем как продолжить.
Добавьте логику для установки и получения метки конфиденциальности
Добавьте логику для задания и получения метки конфиденциальности в файле с помощью объекта обработчика файлов.
С помощью обозревателя решений откройте файл .cpp в проекте, который содержит реализацию
main()метода. По умолчанию используется то же имя, что и проект, содержащий его, указанный во время создания проекта.Добавьте следующие
#includeиusingдирективы под соответствующими существующими директивами в верхней части файла:#include "filehandler_observer.h" #include "mip/file/file_handler.h" using mip::FileHandler;Под конец
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");В конце
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;Замените значения заполнителей в исходном коде, как показано ниже, с помощью строковых констант:
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"- для файла рассмотрим path\filename:
Создание и тестирование приложения
Создайте и протестируйте клиентское приложение.
Используйте F6 (построить решение) для сборки вашего клиентского приложения. Если у вас нет ошибок сборки, используйте F5 (начать отладку) для запуска приложения.
Если ваш проект успешно собирается и запускается, приложение запрашивает токен доступа каждый раз, когда пакет 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, где был получен токен доступа (и метки конфиденциальности настроены), вам может потребоваться войти в систему, прежде чем вы сможете открыть документ с метками.