Microsoft Information Protection SDK — pojęcia dotyczące obsługi plików
W zestawie SDK plików MIP uwidacznia wszystkie różne operacje, mip::FileHandler
które mogą służyć do odczytywania i zapisywania etykiet lub ochrony w zestawie typów plików, dla których obsługa jest wbudowana.
Typy obsługiwanych plików
- Formaty plików pakietu Office oparte na OPC (pakiet Office 2010 i nowsze)
- Starsze formaty plików pakietu Office (Office 2007)
- Ogólna obsługa pliku PFILE
- Pliki obsługujące program Adobe XMP
Funkcje obsługi plików
mip::FileHandler
uwidacznia metody odczytywania, zapisywania i usuwania zarówno etykiet, jak i informacji o ochronie. Aby uzyskać pełną listę, zapoznaj się z dokumentacją interfejsu API.
W tym artykule zostaną omówione następujące metody:
GetLabelAsync()
SetLabel()
DeleteLabel()
RemoveProtection()
CommitAsync()
Wymagania
Utworzenie elementu FileHandler
do pracy z określonym plikiem wymaga:
- Polecenie
FileProfile
- Element
FileEngine
dodany do elementuFileProfile
- Klasa dziedziczona
mip::FileHandler::Observer
Tworzenie procedury obsługi plików
Pierwszym krokiem wymaganym do zarządzania wszystkimi plikami w zestawie SDK plików jest utworzenie FileHandler
obiektu. Ta klasa implementuje wszystkie funkcje wymagane do pobierania, ustawiania, aktualizowania, usuwania i zatwierdzania zmian etykiet w plikach.
FileHandler
Tworzenie elementu jest tak proste, jak wywoływanie FileEngine
funkcji przy CreateFileHandlerAsync
użyciu wzorca obietnicy/przyszłości.
CreateFileHandlerAsync
akceptuje trzy parametry: ścieżka do pliku, który ma zostać odczytany lub zmodyfikowany, mip::FileHandler::Observer
powiadomienia o zdarzeniach asynchronicznych i obietnica dla elementu FileHandler
.
Uwaga: mip::FileHandler::Observer
klasa musi być zaimplementowana w klasie pochodnej, ponieważ CreateFileHandler
wymaga Observer
obiektu .
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();
Po pomyślnym utworzeniu FileHandler
obiektu można wykonać operacje na plikach (get/set/delete/commit).
Odczytywanie etykiety
Wymagania dotyczące metadanych
Istnieje kilka wymagań dotyczących pomyślnego odczytywania metadanych z pliku i tłumaczenia ich na coś, co może być używane w aplikacjach.
- Odczytywana etykieta musi nadal istnieć w usłudze Microsoft 365. Jeśli zostanie on całkowicie usunięty, zestaw SDK nie będzie mógł uzyskać informacji o tej etykiecie i zwróci błąd.
- Metadane pliku muszą być nienaruszone. Te metadane obejmują:
- Atrybut1
- Atrybut2
GetLabelAsync()
Po utworzeniu programu obsługi w celu wskazania określonego pliku wrócimy do wzorca obietnicy/przyszłego, aby asynchronicznie odczytać etykietę. Obietnica mip::ContentLabel
dotyczy obiektu zawierającego wszystkie informacje o zastosowanej etykiecie.
Po utworzeniu promise
wystąpienia obiektów i future
odczytamy etykietę, wywołując fileHandler->GetLabelAsync()
i podając parametr promise
jako samotny. Na koniec etykietę można przechowywać w mip::ContentLabel
obiekcie, który otrzymamy z obiektu 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();
Dane etykiet mogą być odczytywane z label
obiektu i przekazywane do dowolnego innego składnika lub funkcji w aplikacji.
Ustawianie etykiety
Ustawianie etykiety jest procesem dwuczęściowym. Najpierw po utworzeniu procedury obsługi wskazującej plik można ustawić etykietę za pomocą FileHandler->SetLabel()
niektórych parametrów: mip::Label
, mip::LabelingOptions
, i mip::ProtectionOptions
. Najpierw musimy rozpoznać identyfikator etykiety do etykiety, a następnie zdefiniować opcje etykietowania.
Rozpoznawanie identyfikatora etykiety do mip::Label
Pierwszy parametr funkcji SetLabel to mip::Label
. Często aplikacja pracuje z identyfikatorami etykiet, a nie etykietami. Identyfikator etykiety można rozpoznać przez mip::Label
wywołanie polecenia GetLabelById w pliku lub a aparatu zasad:
mip::Label label = mEngine->GetLabelById(labelId);
Opcje etykietowania
Drugi parametr wymagany do ustawienia etykiety to mip::LabelingOptions
.
LabelingOptions
Określa dodatkowe informacje o etykiecie, takie jak AssignmentMethod
i uzasadnienie dla akcji.
mip::AssignmentMethod
to moduł wyliczający, który ma trzy wartości:STANDARD
, lubPRIVILEGED
AUTO
. Zapoznaj się z dokumentacją,mip::AssignmentMethod
aby uzyskać więcej informacji.- Uzasadnienie jest wymagane tylko wtedy, gdy zasady usługi tego wymagają i podczas obniżania istniejącej poufności pliku.
Ten fragment kodu przedstawia tworzenie mip::LabelingOptions
obiektu i ustawianie uzasadnienia i komunikatu obniżania poziomu.
auto labelingOptions = mip::LabelingOptions(mip::AssignmentMethod::STANDARD);
labelingOptions.SetDowngradeJustification(true, "Because I made an educated decision based upon the contents of this file.");
Ustawienia zabezpieczeń
Niektóre aplikacje mogą wymagać wykonywania operacji w imieniu delegowanej tożsamości użytkownika. Klasa mip::ProtectionSettings
umożliwia aplikacji zdefiniowanie tożsamości delegowanej na program obsługi. Wcześniej delegowanie było wykonywane przez klasy aparatu. Miało to znaczne wady związane z obciążeniem aplikacji i rundami usług. Przenosząc delegowane ustawienia użytkownika do mip::ProtectionSettings
i tworząc tę część klasy obsługi, eliminujemy to obciążenie, co skutkuje lepszą wydajnością aplikacji wykonujących wiele operacji w imieniu różnych zestawów tożsamości użytkowników.
Jeśli delegowanie nie jest wymagane, przekaż mip::ProtectionSettings()
polecenie do funkcji SetLabel . Jeśli delegowanie jest wymagane, można to osiągnąć, tworząc mip::ProtectionSettings
obiekt i ustawiając delegowany adres e-mail:
mip::ProtectionSettings protectionSettings;
protectionSettings.SetDelegatedUserEmail("alice@contoso.com");
Ustawianie etykiety
Po pobraniu mip::Label
identyfikatora, ustawieniu opcji etykietowania i opcjonalnie ustawieniu ustawień ochrony można teraz ustawić etykietę w procedurze obsługi.
Jeśli nie ustawiono ustawień ochrony, ustaw etykietę, wywołując SetLabel
program obsługi:
fileHandler->SetLabel(label, labelingOptions, mip::ProtectionSettings());
Jeśli do wykonania operacji delegowanej wymagane są ustawienia ochrony, wykonaj następujące czynności:
fileHandler->SetLabel(label, labelingOptions, protectionSettings);
Po ustawieniu etykiety w pliku, do którego odwołuje się program obsługi, istnieje jeszcze jeden krok umożliwiający zatwierdzenie zmiany i zapisanie pliku na dysku lub utworzenie strumienia wyjściowego.
Zatwierdź zmiany
Ostatnim krokiem zatwierdzania wszelkich zmian w pliku w zestawie MIP SDK jest zatwierdzenie zmiany. Jest to realizowane przy użyciu FileHandler->CommitAsync()
funkcji .
Aby zaimplementować funkcję zobowiązania, wracamy do obietnicy/przyszłości, tworząc obietnicę dla elementu bool
. Funkcja CommitAsync()
zwróci wartość true, jeśli operacja zakończyła się powodzeniem lub fałszem, jeśli nie powiodła się z jakiegokolwiek powodu.
Po utworzeniu elementu i CommitAsync()
future
jest wywoływana promise
i podano dwa parametry: ścieżka pliku wyjściowego (std::string
) i obietnica. Na koniec wynik jest uzyskiwany przez uzyskanie wartości future
obiektu.
auto commitPromise = std::make_shared<std::promise<bool>>();
auto commitFuture = commitPromise->get_future();
fileHandler->CommitAsync(outputFile, commitPromise);
auto wasCommitted = commitFuture.get();
Ważne: Element FileHandler
nie zaktualizuje ani nie zastąpi istniejących plików. Deweloper musi zaimplementować zastąpienie pliku, który jest oznaczony etykietą.
Jeśli napiszesz etykietę do FileA.docx, zostanie utworzona kopia pliku FileB.docx z zastosowaną etykietą. Kod musi zostać zapisany w celu usunięcia/zmiany nazwy FileA.docx i zmiany nazwy FileB.docx.
Usuwanie etykiety
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);
Usuwanie ochrony
Aplikacja zestawu MIP File SDK musi sprawdzić, czy użytkownik ma uprawnienia do usunięcia ochrony z pliku, do którego jest uzyskiwany dostęp. Można to zrobić, wykonując kontrolę dostępu przed usunięciem ochrony.
Funkcja RemoveProtection()
zachowuje się w sposób podobny do SetLabel()
lub DeleteLabel()
. Metoda jest wywoływana w istniejącym FileHandler
obiekcie, a następnie musi zostać zatwierdzona zmiana.
Ważne
Jako deweloper aplikacji można wykonać tę kontrolę dostępu. Niepowodzenie prawidłowego sprawdzania dostępu może ponownie uruchomić w wycieku danych.
Przykład języka C++:
// 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.");
}
}
Przykład platformy .NET:
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.");
}
}