Inicio rápido: Establecimiento y obtención de una etiqueta de confidencialidad (C++)
En este inicio rápido se muestra cómo usar más de los SDK de archivos de MIP. Con una de las etiquetas de confidencialidad que se han enumerado en el inicio rápido anterior, use un controlador de archivos para establecer u obtener la etiqueta en un archivo. La clase Controlador de archivos expone varias operaciones para establecer u obtener etiquetas, o protección para los tipos de archivo admitidos.
Requisitos previos
Si todavía no lo ha hecho, complete los siguientes requisitos previos antes de continuar:
- Complete primero Inicio rápido: Enumeración de etiquetas de confidencialidad (C++), donde se crea una solución de inicio de Visual Studio, para enumerar las etiquetas de confidencialidad de una organización. Este inicio rápido "Establecimiento y obtención de una etiqueta de confidencialidad" se basa en el anterior.
- Opcionalmente: Revise los conceptos sobre controladores de archivos en el SDK de MIP.
Implementación de una clase de observador para supervisar el objeto controlador de archivos
De forma similar al observador que implementó (para el perfil y motor de Protection) en el inicio rápido de inicialización de la aplicación, ahora implementa una clase de observador para los objetos del controlador de Protection.
Cree una implementación básica para una clase de observador de archivo mediante la ampliación de la clase mip::FileHandler::Observer
del SDK. El observador se crea una instancia y se usa más adelante para supervisar las operaciones del controlador de archivo.
Abra la solución de Visual Studio que ha creado en el artículo anterior "Inicio rápido: Enumerar etiquetas de confidencialidad (C++)".
Agregue una clase nueva al proyecto, que genera de manera automática los archivos header/.h e implementation/.cpp:
- En el Explorador de soluciones, vuelva a hacer clic con el botón derecho en el nodo del proyecto, seleccione Agregar y después Clase.
- En el cuadro de diálogo Agregar clase:
- En el campo Nombre de clase, escriba "filehandler_observer". Observe que los campos Archivo .h y Archivo .cpp se rellenan automáticamente, en función del nombre que escriba.
- Cuando termine, haga clic en el botón Aceptar.
Después de generar los archivos .h y .cpp para la clase, se abren en las pestañas del grupo de editores. Ahora actualice cada archivo para implementar la nueva clase de observador:
Actualice "filehandler_observer.h"; para ello, seleccione o elimine la clase
filehandler_observer
generada. No quite las directivas de preprocesador generadas por el paso anterior (#pragma, #include). Después, copie y pegue el siguiente código en el archivo, después de las directivas de preprocesador 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; };
Actualice "filehandler_observer.cpp"; para ello, seleccione o elimine la implementación de la clase
filehandler_observer
generada. No quite las directivas de preprocesador generadas por el paso anterior (#pragma, #include). Después, copie y pegue el siguiente código en el archivo, después de las directivas de preprocesador 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); }
Opcionalmente, presione F6 (Compilar solución) a fin de ejecutar una compilación o vínculo de prueba de la solución, para asegurarse de que se compila correctamente antes de continuar.
Adición de lógica para establecer y obtener una etiqueta de confidencialidad
Agregue lógica para establecer y obtener una etiqueta de confidencialidad en un archivo, mediante el objeto de motor de archivos.
Con el Explorador de soluciones, abra el archivo .cpp del proyecto que contiene la implementación del método
main()
. De manera predeterminada, tiene el mismo nombre que el proyecto que lo contiene, que especificó al crear el proyecto.Agregue las siguientes directivas
#include
yusing
, debajo de las directivas existentes correspondientes, en la parte superior del archivo:#include "filehandler_observer.h" #include "mip/file/file_handler.h" using mip::FileHandler;
Hacia la parte final del cuerpo de
main()
, debajo desystem("pause");
y encima dereturn 0;
(donde lo ha dejado en el inicio rápido anterior), inserte el código siguiente:// 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");
Hacia el final de
main()
, busque el bloque de cierre de la aplicación creado en el primer inicio rápido y quite la marca de comentario de la línea del controlador:// 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;
Reemplace los valores de marcador de posición en el código fuente que se muestra a continuación con constantes de cadena:
Marcador Valor <input-file-path> Ruta completa a un archivo de entrada de prueba, por ejemplo: "c:\\Test\\Test.docx"
.<content-identifier> Un identificador legible para el contenido. Por ejemplo: - para un archivo, considere path\filename:
"c:\Test\Test.docx"
- para un correo electrónico, considere subject:sender:
"RE: Audit design:user1@contoso.com"
<label-id> Identificador de etiqueta de confidencialidad, copiado de la salida de la consola en el inicio rápido anterior, por ejemplo: "f42a3342-8706-4288-bd31-ebb85995028z"
.<output-file-path> Ruta completa al archivo de salida, que será una copia etiquetada del archivo de entrada, por ejemplo: "c:\\Test\\Test_labeled.docx"
.- para un archivo, considere path\filename:
Compilar y probar la aplicación
Compile y pruebe la aplicación cliente.
Presione F6 (Compilar solución) para compilar la aplicación cliente. Si no hay errores de compilación, presione F5 (Iniciar depuración) para ejecutar la aplicación.
Si el proyecto se compila y se ejecuta correctamente, la aplicación solicita un token de acceso cada vez que el SDK llama al método
AcquireOAuth2Token()
. Como hizo anteriormente en la guía de inicio rápido "Enumerar etiquetas de confidencialidad", ejecute el script de PowerShell para adquirir el token cada vez, con los valores proporcionados para $authority y $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 . . .
Puede comprobar la aplicación de la etiqueta si abre el archivo de salida e inspecciona visualmente la configuración de protección de la información del documento.
Nota:
Si va a etiquetar un documento de Office, pero no ha iniciado sesión con una cuenta desde el inquilino de Microsoft Entra donde se ha obtenido el token de acceso (y se han configurado las etiquetas de confidencialidad), es posible que se le pida que inicie sesión antes de poder abrir el documento etiquetado.