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