SDK de archivo de Microsoft Information Protection: justificación de acción para reducir una etiqueta de confidencialidad en un archivo (C++)

Este inicio rápido trata sobre el control de una operación de etiqueta de cambio de una versión anterior cuando la directiva de etiqueta requiere justificación. Aquí se usa la clase mip::FileHandler para cambiar las etiquetas de un archivo. Para obtener más información, vea Referencia de API.

Requisitos previos

Si aún no lo ha hecho, asegúrese de completar los siguientes requisitos previos antes de continuar:

  • Complete primero la guía Inicio rápido: Establecer y obtener etiquetas de confidencialidad (C#), en la que se compila una solución de inicio de Visual Studio, con el fin de mostrar las etiquetas de confidencialidad de una organización y de establecer y leer etiquetas de confidencialidad en o desde un archivo. Esta guía de inicio rápido sobre cómo cambiar a una versión anterior de una etiqueta que necesita una justificación o quitarla (C++) se basa en la anterior.
  • Opcionalmente: revise los conceptos sobre los controladores de archivos en los conceptos del SDK de MIP.

Incorporación de lógica para establecer una etiqueta inferior en un archivo protegido

Agregue lógica para establecer una etiqueta de confidencialidad en un archivo mediante el objeto mip::FileHandler.

  1. Abra la solución de Visual Studio que se ha creado en el artículo anterior Inicio rápido: Establecer y obtener etiquetas de confidencialidad (C++).

  2. Con el Explorador de soluciones, abra el archivo .cpp en el proyecto que contiene la implementación del método main(). El valor predeterminado es el mismo nombre que el proyecto que lo contiene, el cual ha especificado al crear el proyecto.

  3. Agregue las siguientes directivas #include y using debajo de las directivas existentes correspondientes, en la parte superior del archivo:

    
        #include "mip/file/file_error.h"
    
        using mip::JustificationRequiredError;
        using std::cin;
    
    
  4. Actualice el valor <label-id> del inicio rápido anterior a una etiqueta de confidencialidad que requiera justificación para la reducción. Durante la ejecución de esta guía de inicio rápido, primero se establece esta etiqueta y luego se intenta reducir por medio de fragmentos de código en pasos adicionales.

  5. Hacia el final del cuerpo main(), debajo de system("pause"); y encima del bloque de apagado (donde se quedó en la guía de inicio rápido anterior), inserte el código siguiente:


// Downgrade label
// Set paths and lower label ID
// Set a new label on input file.

string lowerlabelId = "<lower-label-id>";
cout << "\nApplying new Label ID " << lowerlabelId << " to " << filePathOut << endl;
mip::LabelingOptions labelingOptions(mip::AssignmentMethod::PRIVILEGED);

// Try to apply a label with lower sensitivity.
try
{
    handler->SetLabel(engine->GetLabelById(lowerlabelId), labelingOptions, mip::ProtectionSettings());
}

catch (const mip::JustificationRequiredError& e)
{
    // Request justification from user.
    cout<<"Please provide justification for downgrading a label: "<<endl;
    string justification;
    cin >> justification;

    // Set Justification provided flag
    bool isDowngradeJustified = true;
    mip::LabelingOptions labelingOptions(mip::AssignmentMethod::PRIVILEGED);
    labelingOptions.SetDowngradeJustification(isDowngradeJustified,justification);

    //Set new label.
    handler->SetLabel(engine->GetLabelById(lowerlabelId), labelingOptions, mip::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 lowerFilePathOut = "<lower-output-file-path>";
try
{
    cout << "Committing changes" << endl;
    auto commitPromise = std::make_shared<std::promise<bool>>();
    auto commitFuture = commitPromise->get_future();
    handler->CommitAsync(lowerFilePathOut, commitPromise);
    if (commitFuture.get()) {
        cout << "\nLabel committed to file: " << lowerFilePathOut << endl;
    }
    else {
        cout << "Failed to label: " + lowerFilePathOut << 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
string lowerActualFilePath = "<lower-content-identifier>";
try
{
    auto handlerPromise = std::make_shared<std::promise<std::shared_ptr<FileHandler>>>();
    auto handlerFuture = handlerPromise->get_future();
    engine->CreateFileHandlerAsync(
        lowerFilePathOut,
        lowerActualFilePath,
        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 lowered label from output file
try
{
    cout << "\nGetting the label committed to file: " << lowerFilePathOut << endl;
    auto lowerLabel = handler->GetLabel();
    cout << "Name: " + lowerLabel->GetLabel()->GetName() << endl;
    cout << "Id: " + lowerLabel->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");

  1. Reemplace los valores de marcador de posición en el código fuente por los valores siguientes:

    Marcador Valor
    <lower-label-id> Identificador de etiqueta copiado de la salida de la consola en el inicio rápido anterior, por ejemplo: bb7ed207-046a-4caf-9826-647cff56b990. Asegúrese de que tenga una sensibilidad inferior a la de la etiqueta de archivo previamente protegida.
    <lower-output-file-path> Ruta de acceso del archivo de salida en el que quiere guardar el archivo modificado.
    <lower-content-identifier> Identificador en lenguaje natural del contenido.

Compilar y probar la aplicación

Compile y pruebe la aplicación cliente.

  1. Presione CTRL-SHIFT-B (Compilar solución) para compilar la aplicación cliente. Si no aparece ningún error de compilación, presione F5 (Iniciar depuración) para ejecutar la aplicación.

  2. 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().

  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 f55c2dea-db0f-47cd-8520-a52e1590fb6z to c:\Test\Test.docx
  Committing changes


  Label committed to file: c:\Test\Test.docx
  Press any key to continue . . .

  Run the PowerShell script to generate an access token using the following values, then copy/paste it below:
  Set $authority to: https://login.windows.net/37f4583d-9985-4e7f-a1ab-71afd8b55ba0
  Set $resourceUrl to: https://aadrm.com
  Sign in with user account: user1@tenant.onmicrosoft.com
  Enter access token: <paste-access-token-here>
  Press any key to continue . . .

  Getting the label committed to file: c:\Test\Test_labeled.docx
  Name: Highly Confidential
  Id: f55c2dea-db0f-47cd-8520-a52e1590fb6z
  Press any key to continue . . . 

  Applying new Label ID f42a3342-8706-4288-bd31-ebb85995028z to c:\Test\Test_labeled.docx
  Please provide justification for downgrading a label:
  Need for sharing with wider audience.
  Committing changes

  Label committed to file: c:\Test\Test_downgraded.docx
  Press any key to continue . . .

  Getting the label committed to file: c:\Test\Test_downgraded.docx
  Name: General
  Id: f42a3342-8706-4288-bd31-ebb85995028z
  Press any key to continue . . .

Tenga en cuenta que, en caso de que la etiqueta que se va a eliminar de un archivo requiera una justificación según la directiva de etiqueta, se debe seguir un enfoque similar para la operación DeleteLabel(). La función La función DeleteLabel() produce una excepción mip::JustificationRequiredError. La marca isDowngradeJustified debe establecerse en true en el control de excepciones antes de eliminar la etiqueta correctamente.