Microsoft Information Protection SDK - Concepten van bestandshandler
In de MIP-bestands-SDK mip::FileHandler
worden alle verschillende bewerkingen weergegeven die kunnen worden gebruikt voor het lezen en schrijven van labels of beveiliging voor een set bestandstypen waarvoor ondersteuning is ingebouwd.
Ondersteunde bestandstypen
- Office-bestandsindelingen op basis van OPC (Office 2010 en hoger)
- Verouderde Office-bestandsindelingen (Office 2007)
- Algemene PFILE-ondersteuning
- Bestanden die Adobe XMP ondersteunen
Bestandshandlerfuncties
mip::FileHandler
biedt methoden voor het lezen, schrijven en verwijderen van zowel labels als beveiligingsinformatie. Raadpleeg de API-verwijzing voor de volledige lijst.
In dit artikel worden de volgende methoden behandeld:
GetLabelAsync()
SetLabel()
DeleteLabel()
RemoveProtection()
CommitAsync()
Vereisten
Voor het maken van een FileHandler
bestand om te kunnen werken met een specifiek bestand is het volgende vereist:
- A
FileProfile
- Een
FileEngine
toegevoegd aan deFileProfile
- Een klasse die wordt overgenomen
mip::FileHandler::Observer
Een bestandshandler maken
De eerste stap die nodig is bij het beheren van bestanden in de File SDK, is het maken van een FileHandler
object. Deze klasse implementeert alle functionaliteit die nodig is voor het ophalen, instellen, bijwerken, verwijderen en doorvoeren van labelwijzigingen in bestanden.
Het maken van de FileHandler
functie is net zo eenvoudig als het aanroepen van de FileEngine
CreateFileHandlerAsync
functie met behulp van het promise/future-patroon.
CreateFileHandlerAsync
accepteert drie parameters: het pad naar het bestand dat moet worden gelezen of gewijzigd, de mip::FileHandler::Observer
voor asynchrone gebeurtenismeldingen en de belofte voor de FileHandler
.
Opmerking: De mip::FileHandler::Observer
klasse moet worden geïmplementeerd in een afgeleide klasse, zoals CreateFileHandler
vereist voor het Observer
object.
auto createFileHandlerPromise = std::make_shared<std::promise<std::shared_ptr<mip::FileHandler>>>();
auto createFileHandlerFuture = createFileHandlerPromise->get_future();
fileEngine->CreateFileHandlerAsync(filePath, std::make_shared<FileHandlerObserver>(), createFileHandlerPromise);
auto fileHandler = createFileHandlerFuture.get();
Nadat het FileHandler
object is gemaakt, kunnen bestandsbewerkingen (get/set/delete/commit) worden uitgevoerd.
Een label lezen
Vereisten voor metagegevens
Er zijn enkele vereisten voor het lezen van metagegevens uit een bestand en het vertalen naar iets dat kan worden gebruikt in toepassingen.
- Het label dat wordt gelezen, moet nog steeds bestaan in de Microsoft 365-service. Als deze volledig is verwijderd, kan de SDK geen informatie over dat label ophalen en wordt er een fout geretourneerd.
- De metagegevens van het bestand moeten intact zijn. Deze metagegevens omvatten:
- Kenmerk1
- Kenmerk2
GetLabelAsync()
Nadat u de handler hebt gemaakt om naar een specifiek bestand te verwijzen, keren we terug naar het promise/future-patroon om het label asynchroon te lezen. De belofte is voor een mip::ContentLabel
object dat alle informatie over het toegepaste label bevat.
Na het instantiëren van de promise
en future
objecten, lezen we het label door het aanroepen fileHandler->GetLabelAsync()
en opgegeven promise
als de enige parameter. Ten slotte kan het label worden opgeslagen in een mip::ContentLabel
object dat we van de future
.
auto loadPromise = std::make_shared<std::promise<std::shared_ptr<mip::ContentLabel>>>();
auto loadFuture = loadPromise->get_future();
fileHandler->GetLabelAsync(loadPromise);
auto label = loadFuture.get();
Labelgegevens kunnen worden gelezen uit het label
object en worden doorgegeven aan elk ander onderdeel of elke andere functionaliteit in de toepassing.
Een label instellen
Het instellen van een label is een proces van twee delen. Als u eerst een handler hebt gemaakt die verwijst naar het betreffende bestand, kan het label worden ingesteld door een aantal parameters aan te roepen FileHandler->SetLabel()
: mip::Label
, mip::LabelingOptions
en mip::ProtectionOptions
. Eerst moeten we de label-id naar een label oplossen en vervolgens de labelopties definiëren.
Label-id oplossen om te mip::Label
De eerste parameter van de functie SetLabel is een mip::Label
. Vaak werkt de toepassing met label-id's in plaats van labels. De label-id kan worden omgezet naar de mip::Label
id door GetLabelById aan te roepen op de bestands- of beleidsengine:
mip::Label label = mEngine->GetLabelById(labelId);
Labelopties
De tweede parameter die is vereist om het label in te stellen, is mip::LabelingOptions
.
LabelingOptions
geeft aanvullende informatie op over het label, zoals de AssignmentMethod
en reden voor een actie.
-
mip::AssignmentMethod
is een enumerator met drie waarden:STANDARD
,PRIVILEGED
ofAUTO
. Bekijk demip::AssignmentMethod
verwijzing voor meer informatie. - De reden is alleen vereist als het servicebeleid dit vereist en wanneer u de bestaande gevoeligheid van een bestand verlaagt.
Dit knipsel laat zien hoe u het mip::LabelingOptions
object maakt en de reden voor downgraden en het bericht instelt.
auto labelingOptions = mip::LabelingOptions(mip::AssignmentMethod::STANDARD);
labelingOptions.SetDowngradeJustification(true, "Because I made an educated decision based upon the contents of this file.");
Beveiligingsinstellingen
Sommige toepassingen moeten mogelijk bewerkingen uitvoeren namens een gedelegeerde gebruikersidentiteit. Met mip::ProtectionSettings
de klasse kan de toepassing de gedelegeerde identiteit per handler definiëren. Voorheen werd de delegatie uitgevoerd door de engineklassen. Dit had aanzienlijke nadelen in de overhead van toepassingen en retouren van services. Door de gedelegeerde gebruikersinstellingen te verplaatsen naar mip::ProtectionSettings
en dit onderdeel van de handlerklasse te maken, elimineren we deze overhead, wat resulteert in betere prestaties voor toepassingen die veel bewerkingen uitvoeren namens diverse sets gebruikersidentiteiten.
Als delegering niet vereist is, geeft mip::ProtectionSettings()
u deze door aan de functie SetLabel . Als delegatie is vereist, kan dit worden bereikt door een mip::ProtectionSettings
object te maken en het gedelegeerde e-mailadres in te stellen:
mip::ProtectionSettings protectionSettings;
protectionSettings.SetDelegatedUserEmail("alice@contoso.com");
Het label instellen
Nadat u de mip::Label
id hebt opgehaald, stelt u de labelopties in en kunt u desgewenst de beveiligingsinstellingen instellen. Het label kan nu op de handler worden ingesteld.
Als u geen beveiligingsinstellingen hebt ingesteld, stelt u het label in door de handler aan te roepen SetLabel
:
fileHandler->SetLabel(label, labelingOptions, mip::ProtectionSettings());
Als u wel beveiligingsinstellingen nodig hebt om een gedelegeerde bewerking uit te voeren, gaat u als volgt te werk:
fileHandler->SetLabel(label, labelingOptions, protectionSettings);
Nadat u nu het label hebt ingesteld op het bestand waarnaar wordt verwezen door de handler, is er nog één stap om de wijziging door te voeren en een bestand naar de schijf te schrijven of een uitvoerstroom te maken.
Wijzigingen doorvoeren
De laatste stap bij het doorvoeren van wijzigingen in een bestand in de MIP SDK is het doorvoeren van de wijziging. Dit wordt bereikt met behulp van de FileHandler->CommitAsync()
functie.
Om de toezeggingsfunctie te implementeren, gaan we terug naar belofte/toekomst, waardoor we een belofte voor een bool
. De CommitAsync()
functie retourneert waar als de bewerking is geslaagd of onwaar als deze om welke reden dan ook is mislukt.
Nadat u de promise
en future
hebt gemaakt, CommitAsync()
worden er twee parameters opgegeven: het pad naar het uitvoerbestand (std::string
) en de belofte. Ten slotte wordt het resultaat verkregen door de waarde van het future
object op te halen.
auto commitPromise = std::make_shared<std::promise<bool>>();
auto commitFuture = commitPromise->get_future();
fileHandler->CommitAsync(outputFile, commitPromise);
auto wasCommitted = commitFuture.get();
Belangrijk: Bestaande FileHandler
bestanden worden niet bijgewerkt of overschreven. Het is aan de ontwikkelaar om het bestand te vervangen dat wordt gelabeld.
Als u een label naar FileA.docx schrijft, wordt er een kopie van het bestand, FileB.docx, gemaakt met het toegepaste label. Code moet worden geschreven om FileA.docx te verwijderen/te wijzigen en de naam van FileB.docx te wijzigen.
Een label verwijderen
auto fileHandler = mEngine->CreateFileHandler(filePath, std::make_shared<FileHandlerObserverImpl>());
fileHandler->DeleteLabel(mip::AssignmentMethod::PRIVILEGED, "Label unnecessary.");
auto commitPromise = std::make_shared<std::promise<bool>>();
auto commitFuture = commitPromise->get_future();
fileHandler->CommitAsync(outputFile, commitPromise);
Beveiliging verwijderen
Uw MIP File SDK-toepassing moet valideren dat de gebruiker rechten heeft om de beveiliging te verwijderen van het bestand dat wordt geopend. Dit kan worden bereikt door een toegangscontrole uit te voeren voordat u de beveiliging verwijdert.
De RemoveProtection()
functie gedraagt zich op een manier die vergelijkbaar is met SetLabel()
of DeleteLabel()
. De methode wordt aangeroepen op het bestaande FileHandler
object, waarna de wijziging moet worden doorgevoerd.
Belangrijk
Als ontwikkelaar van de toepassing is het de mogelijkheid om deze toegangscontrole uit te voeren. Als de toegangscontrole niet goed kan worden uitgevoerd, kan de gegevenslekken opnieuw worden gelekt.
C++-voorbeeld:
// Validate that the file referred to by the FileHandler is protected.
if (fileHandler->GetProtection() != nullptr)
{
// Validate that user is allowed to remove protection.
if (fileHandler->GetProtection()->AccessCheck(mip::rights::Export() || fileHandler->GetProtection()->AccessCheck(mip::rights::Owner()))
{
auto commitPromise = std::make_shared<std::promise<bool>>();
auto commitFuture = commitPromise->get_future();
// Remove protection and commit changes to file.
fileHandler->RemoveProtection();
fileHandler->CommitAsync(outputFile, commitPromise);
result = commitFuture.get();
}
else
{
// Throw an exception if the user doesn't have rights to remove protection.
throw std::runtime_error("User doesn't have EXPORT or OWNER right.");
}
}
.NET-voorbeeld:
if(handler.Protection != null)
{
// Validate that user has rights to remove protection from the file.
if(handler.Protection.AccessCheck(Rights.Export) || handler.Protection.AccessCheck(Rights.Owner))
{
// If user has Extract right, remove protection and commit the change. Otherwise, throw exception.
handler.RemoveProtection();
bool result = handler.CommitAsync(outputPath).GetAwaiter().GetResult();
return result;
}
else
{
throw new Microsoft.InformationProtection.Exceptions.AccessDeniedException("User lacks EXPORT right.");
}
}