Snabbstart: Ange och få en känslighetsetikett (C++)

I den här snabbstarten visas hur du använder fler MIP-fil-SDKs. Med hjälp av en av de känslighetsetiketter som du listade i föregående snabbstart använder du en filhanterare för att ange/hämta etiketten till en fil. I klassen Filhanterare visas olika åtgärder för att ställa in/skaffa etiketter eller skydd för filtyper som stöds.

Krav

Om du inte redan har gjort det måste du slutföra följande krav innan du fortsätter:

  • Fullständig snabbstart: Lista känslighetsetiketter (C++) först, som skapar en Visual Studio lösning, för att lista en organisations känslighetsetiketter. Snabbstartsguide för "Ange och få en känslighetsetikett" bygger på den föregående.
  • Valfritt: Granska filhanterare i MIP SDK-begreppen.

Implementera en lektionsklass för att övervaka filhanterareobjektet

På ungefär samma sätt som den du implementerade (för filprofilen och motorn) i Snabbstart för programstart implementerar du nu en seraktionsklass för ett filhanterareobjekt.

Skapa en grundläggande implementering för en filhanterare genom att utöka SDK:s mip::FileHandler::Observer klass. Så här kan man använda så mycket som det går att använda så att man kan hantera filer senare.

  1. Öppna den Visual Studio lösning du arbetade med i den föregående artikeln "Snabbstart: Lista känslighetsetiketter (C++)".

  2. Lägg till en ny klass i projektet, som genererar både header/.h- och implementation/.cpp-filer åt dig:

    • Högerklicka på projektnodenigen i Lösningsutforskaren, välj Lägg tilloch välj sedan Klass.
    • I dialogrutan Lägg till klass:
      • I fältet Klassnamn anger du "filehandler_observer". Observera att både .h-filen och .cpp-filfälten fylls i automatiskt, baserat på det namn du anger.
      • Klicka på OK när du är klar.
  3. När du har genererat .h- och .cpp-filerna för klassen öppnas båda filerna på editorgruppflikarna. Uppdatera nu varje fil för att implementera din nya se bildklass:

    • Uppdatera "filehandler_observer.h", genom att markera/ta bort den genererade filehandler_observer klassen. Ta inte bort de anvisningar som getts av förprocessorn som genererades i föregående steg (#pragma, #include). Kopiera och klistra sedan in följande källa i filen, efter att eventuella befintliga anvisningar från förprocessorn gäller:

      #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;		
      };
      
    • Uppdatera "filehandler_observer.cpp", genom att markera/ta bort den genererade filehandler_observer klassimplementering. Ta inte bort de anvisningar som getts av förprocessorn som genererades i föregående steg (#pragma, #include). Kopiera och klistra sedan in följande källa i filen, efter att eventuella befintliga anvisningar från förprocessorn gäller:

      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);
      }
      
  4. Du kan också använda F6(buildlösning)för att köra en testkompilera/länk av lösningen för att försäkra dig om att den byggs korrekt innan du fortsätter.

Lägga till logik för att ange och få en känslighetsetikett

Lägg till logik för att ange och få en känslighetsetikett för en fil med hjälp av File engine-objektet.

  1. Med Solution Exploreröppnar du .cpp-filen i projektet som innehåller implementeringen av metoden. Standardnamnet anges till samma som det projekt som innehåller det, som du angav när projektet skapades.

  2. Lägg till #include följande och using direktiv, under motsvarande befintliga direktiv, högst upp i filen:

    #include "filehandler_observer.h" 
    #include "mip/file/file_handler.h" 
    
    using mip::FileHandler;
    
  3. Infoga följande kod mot slutet av brödtexten under och ovanför (där du slutade i föregående main()system("pause");return 0; snabbstart):

    // 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");
    
  4. I slutet av hittar du stängningsblocket som skapades i den första snabbstarten och tar bort main() hanterarens linje:

    // 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;
    
  5. Ersätt platshållarvärdena i källkoden enligt följande, med hjälp av strängkonstanterna:

    Platshållare Värde
    <input-file-path> Den fullständiga sökvägen till en testindatafil, till exempel: "c:\\Test\\Test.docx" .
    <content-identifier> En läsbar identifierare för innehållet. Till exempel:
    • för en fil kan du överväga sökväg\filnamn: "c:\Test\Test.docx"
    • för ett e-postmeddelande, ta en hänsyn till ämne:avsändare: "RE: Audit design:user1@contoso.com"
    <label-id> Ett känslighetsetikett-ID som kopierats från konsolens utdata i föregående Snabbstart, till exempel: "f42a3342-8706-4288-bd31-ebb85995028z" .
    <utdatafilsökväg> Den fullständiga sökvägen till utdatafilen, som blir en märkt kopia av indatafilen, till exempel: "c:\\Test\\Test_labeled.docx" .

Skapa och testa programmet

Skapa och testa klientprogrammet.

  1. Använd F6(buildlösning)för att skapa klientprogrammet. Om du inte har några byggfel kan du använda F5(Start debugging)för att köra programmet.

  2. Om projektet har skapats och körs uppmanas du att ange en åtkomsttoken varje gång SDK anropar din AcquireOAuth2Token() metod. Som du gjorde tidigare i snabbstartsrutan "Lista känslighetsetiketter" kör du PowerShell-skriptet för att hämta token varje gång, med hjälp av värdena som anges för $authority och $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 . . .
    

Du kan kontrollera programmet för etiketten genom att öppna utdatafilen och kontrollera dokumentets inställningar för informationsskydd.

Obs!

Om du etiketterar ett Office-dokument, men inte är inloggad med ett konto från Azure Active Directory (AD)-klienten där åtkomsttoken erhållits (och känslighetsetiketter har konfigurerats), kan du uppmanas att logga in innan du kan öppna det etiketterade dokumentet.