Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En esta guía de inicio rápido se muestra cómo usar más de los SDK de archivo 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 o obtener etiquetas, o protección, para los tipos de archivo admitidos.
Prerrequisitos
Si aún no lo ha hecho, asegúrese de completar los siguientes requisitos previos antes de continuar:
- Primero, completa el Inicio rápido: Lista las etiquetas de sensibilidad (C++), que construye una solución inicial de Visual Studio para listar las etiquetas de sensibilidad de una organización. Esta guía de inicio rápido "Establecer y obtener una etiqueta de confidencialidad" se basa en la anterior.
- Opcional: Revisar los conceptos de los controladores de archivos en el SDK de MIP.
Implementación de una clase de observador para supervisar el objeto de controlador de archivos
De forma similar al observador que implementó (para el perfil de archivo y el motor) en el inicio rápido de inicialización de la aplicación, ahora se implementa una clase de observador para un objeto de controlador de archivos.
Cree una implementación básica para un observador del controlador de archivos mediante la extensión de la clase del mip::FileHandler::Observer SDK. El observador se instancia y se utiliza más adelante para monitorear las operaciones del manejador de archivos.
Abra la solución de Visual Studio en la que ha trabajado en el artículo anterior "Inicio rápido: Enumerar etiquetas de confidencialidad (C++)".
Agregue una nueva clase al proyecto, que genera los archivos header/.h e implementation/.cpp automáticamente:
- En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto de nuevo, seleccione Agregar y, a continuación, seleccione Clase.
- En el cuadro de diálogo Agregar clase:
- En el campo Nombre de clase, escriba "filehandler_observer". Tenga en cuenta que tanto el archivo .h como los campos de 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 , ambos archivos se abren en las pestañas Grupo de editores. Ahora actualice cada archivo para implementar la nueva clase de observador:
Actualice "filehandler_observer.h", seleccionando o eliminando la clase generada
filehandler_observer. 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", seleccionando o eliminando la implementación de clase generada
filehandler_observer. No quite las directivas de preprocesador generadas por el paso anterior (#pragma, #include). A continuación, copie y pegue el siguiente código fuente en el archivo después de cualquier directiva de preprocesador existente.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, use F6 (Compilar solución) para 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 del motor de archivos.
Con el Explorador de soluciones, abra el archivo .cpp en el proyecto que contiene la implementación del
main()método . El valor predeterminado es el mismo nombre que el proyecto que lo contiene, que especificó durante la creación del proyecto.Agregue las siguientes directivas
#includeyusingdebajo 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 de posición Valor <input-file-path> Ruta de acceso completa a un archivo de entrada de prueba, por ejemplo: "c:\\Test\\Test.docx".<identificador de contenido> Identificador legible por humanos para el contenido. Por ejemplo: - para un archivo, considere la posibilidad de usar path\filename:
"c:\Test\Test.docx" - para un correo electrónico, considere asunto:remitente :
"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".<ruta del archivo de salida> Ruta de acceso 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 la posibilidad de usar path\filename:
Crear y probar la aplicación
Compile y pruebe la aplicación cliente.
Use F6 (Compilar solución) para compilar la aplicación cliente. Si no tiene errores de compilación, use 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
AcquireOAuth2Token()método . 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 . . .
Para comprobar la aplicación de la etiqueta, abra el archivo de salida e inspeccione 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 del inquilino de Microsoft Entra donde se obtuvo el token de acceso (y se configuran las etiquetas de confidencialidad), es posible que se le pida que inicie sesión antes de que pueda abrir el documento etiquetado.