Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zestaw SDK plików obsługuje operacje etykietowania dla plików .msg w sposób identyczny z dowolnym innym typem pliku, z tą różnicą, że zestaw SDK potrzebuje aplikacji do włączenia flagi funkcji MSG. W tym miejscu zobaczymy, jak ustawić tę flagę.
Jak wspomniano wcześniej, instancjowanie mip::FileEngine
wymaga obiektu ustawień mip::FileEngineSettings
. FileEngineSettings może służyć do przekazywania parametrów dla ustawień niestandardowych, które aplikacja musi ustawić dla określonego wystąpienia.
CustomSettings
Właściwość mip::FileEngineSettings
jest używana do ustawienia flagi dla enable_msg_file_type
w celu umożliwienia przetwarzania plików .msg.
Wymagania wstępne
Jeśli jeszcze tego nie zrobiono, przed kontynuowaniem upewnij się, że zostały spełnione następujące wymagania wstępne:
- Najpierw ukończ szybki start: inicjację aplikacji Pakietu SDK plików (C++), co tworzy początkowe rozwiązanie programu Visual Studio. Na tym szybkim przewodniku "Jak przetwarzać pliki wiadomości e-mail .msg (C++)" bazuje się na poprzednim.
- Zapoznaj się z przewodnikiem Szybki start: wyświetlanie listy etykiet poufności (C++).
- Recenzja Przewodnik szybkiego startu: ustawianie/uzyskiwanie etykiet dotyczących poziomu poufności (C++).
- Zapoznaj się z pojęciami dotyczącymi MIP SDK dla plików e-mail.
- Opcjonalnie: Zapoznaj się z pojęciami dotyczącymi silników plików w zestawie MIP SDK.
- Opcjonalnie: Zapoznaj się z koncepcjami obsługi plików w zestawie MIP SDK.
Kroki implementacji wymagań wstępnych
Otwórz rozwiązanie programu Visual Studio utworzone w poprzednim artykule "Szybki start: inicjowanie aplikacji klienckiej (C++)".
Utwórz skrypt programu PowerShell w celu wygenerowania tokenów dostępu, jak to wyjaśniono w przewodniku Szybki Przewodnik "Lista etykiet poufności (C++)".
Zaimplementuj klasę obserwatora do monitorowania
mip::FileHandler
zgodnie z wyjaśnieniem w przewodniku Szybki start "Ustawianie/uzyskiwanie etykiet poufności (C++)".
Ustaw enable_msg_file_type i użyj File SDK do oznaczania pliku .msg
Dodaj poniższy kod konstrukcyjny silnika pliku, aby ustawić enable_msg_file_type flag
i użyć silnika pliku do oznaczenia pliku .msg.
Za pomocą Eksploratora rozwiązań otwórz plik .cpp w projekcie zawierający implementację
main()
metody . Domyślnie ma taką samą nazwę jak projekt zawierający go, który został określony podczas tworzenia projektu.Dodaj następujące dyrektywy #include i using poniżej odpowiednich istniejących dyrektyw w górnej części pliku.
#include "filehandler_observer.h" #include "mip/file/file_handler.h" #include <iostream> using mip::FileHandler; using std::endl;
Usuń implementację funkcji
main()
z poprzedniego przewodnika szybkiego startu.main()
Wewnątrz treści wstaw następujący kod. W poniższym bloku koduenable_msg_file_type
flaga jest ustawiana podczas tworzenia mechanizmu plików, plik .msg może być następnie przetwarzany przezmip::FileHandler
obiekty utworzone przy użyciu mechanizmu plików.
int main()
{
// Construct/initialize objects required by the application's profile object
ApplicationInfo appInfo { "<application-id>", // ApplicationInfo object (App ID, name, version)
"<application-name>",
"1.0"
};
std::shared_ptr<mip::MipConfiguration> mipConfiguration = std::make_shared<mip::MipConfiguration>(mAppInfo,
"mip_data",
mip::LogLevel::Trace,
false);
std::shared_ptr<mip::MipContext> mMipContext = mip::MipContext::Create(mipConfiguration);
auto profileObserver = make_shared<ProfileObserver>(); // Observer object
auto authDelegateImpl = make_shared<AuthDelegateImpl>("<application-id>"); // Authentication delegate object (App ID)
auto consentDelegateImpl = make_shared<ConsentDelegateImpl>(); // Consent delegate object
// Construct/initialize profile object
FileProfile::Settings profileSettings(mipContext,mip::CacheStorageType::OnDisk,authDelegateImpl,
consentDelegateImpl,profileObserver);
// Set up promise/future connection for async profile operations; load profile asynchronously
auto profilePromise = make_shared<promise<shared_ptr<FileProfile>>>();
auto profileFuture = profilePromise->get_future();
try
{
mip::FileProfile::LoadAsync(profileSettings, profilePromise);
}
catch (const std::exception& e)
{
std::cout << "An exception occurred. Are the Settings and ApplicationInfo objects populated correctly?\n\n"<< e.what() << "'\n";
system("pause");
return 1;
}
auto profile = profileFuture.get();
// Construct/initialize engine object
FileEngine::Settings engineSettings(
mip::Identity("<engine-account>"), // Engine identity (account used for authentication)
"<engine-state>", // User-defined engine state
"en-US"); // Locale (default = en-US)
//Set enable_msg_file_type flag as true
std::vector<std::pair<string, string>> customSettings;
customSettings.emplace_back(mip::GetCustomSettingEnableMsgFileType(), "true");
engineSettings.SetCustomSettings(customSettings);
// Set up promise/future connection for async engine operations; add engine to profile asynchronously
auto enginePromise = make_shared<promise<shared_ptr<FileEngine>>>();
auto engineFuture = enginePromise->get_future();
profile->AddEngineAsync(engineSettings, enginePromise);
std::shared_ptr<FileEngine> engine;
try
{
engine = engineFuture.get();
}
catch (const std::exception& e)
{
cout << "An exception occurred... is the access token incorrect/expired?\n\n"<< e.what() << "'\n";
system("pause");
return 1;
}
//Set file paths
string inputFilePath = "<input-file-path>"; //.msg file to be labeled
string actualFilePath = inputFilePath;
string outputFilePath = "<output-file-path>"; //labeled .msg file
string actualOutputFilePath = outputFilePath;
//Create a file handler for original file
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);
auto fileHandler = handlerFuture.get();
//List labels available to the user
// Use mip::FileEngine to list all labels
labels = mEngine->ListSensitivityLabels();
// Iterate through each label, first listing details
for (const auto& label : labels) {
cout << label->GetName() << " : " << label->GetId() << endl;
// get all children for mip::Label and list details
for (const auto& child : label->GetChildren()) {
cout << "-> " << child->GetName() << " : " << child->GetId() << endl;
}
}
string labelId = "<labelId-id>"; //set a label ID to use
// Labeling requires a mip::LabelingOptions object.
// Review API ref for more details. The sample implies that the file was labeled manually by a user.
mip::LabelingOptions labelingOptions(mip::AssignmentMethod::PRIVILEGED);
fileHandler->SetLabel(labelId, labelingOptions, mip::ProtectionSettings());
// Commit changes, save as outputFilePath
auto commitPromise = std::make_shared<std::promise<bool>>();
auto commitFuture = commitPromise->get_future();
if(fileHandler->IsModified())
{
fileHandler->CommitAsync(outputFilePath, commitPromise);
}
if (commitFuture.get()) {
cout << "\n Label applied to file: " << outputFilePath << endl;
}
else {
cout << "Failed to label: " + outputFilePath << endl;
return 1;
}
// Create a new handler to read the label
auto msgHandlerPromise = std::make_shared<std::promise<std::shared_ptr<FileHandler>>>();
auto msgHandlerFuture = handlerPromise->get_future();
engine->CreateFileHandlerAsync(inputFilePath,
actualFilePath,
true,
std::make_shared<FileHandlerObserver>(),
msgHandlerPromise);
auto msgFileHandler = msgHandlerFuture.get();
cout << "Original file: " << inputFilePath << endl;
cout << "Labeled file: " << outputFilePath << endl;
cout << "Label applied to file : "
<< msgFileHandler->GetName()
<< endl;
// Application shutdown. Null out profile, engine, handler.
// Application may crash at shutdown if resources aren't properly released.
msgFileHandler = nullptr;
fileHandler = nullptr;
engine = nullptr;
profile = nullptr;
mipContext = nullptr;
return 0;
}
Aby uzyskać więcej informacji na temat operacji na plikach, zapoznaj się z pojęciami dotyczącymi obsługi plików.
Zastąp wartości symboli zastępczych w kodzie źródłowym przy użyciu następujących wartości:
Element zastępczy Wartość <identyfikator aplikacji> Identyfikator aplikacji zarejestrowany w dzierżawcy Microsoft Entra, na przykład: 0edbblll-8773-44de-b87c-b8c6276d41eb
.<konto silnika> Konto używane dla tożsamości silnika, na przykład: user@tenant.onmicrosoft.com
.<stan silnika> Stan aplikacji zdefiniowanej przez użytkownika, na przykład: My engine state
.<ścieżka pliku wejściowego> Pełna ścieżka do pliku komunikatu wejściowego testu, na przykład: c:\\Test\\message.msg
.<ścieżka pliku wyjściowego> Pełna ścieżka do pliku wyjściowego, który będzie oznakowaną kopią pliku wejściowego, na przykład: c:\\Test\\message_labeled.msg
.<label-id> Identyfikator labelId pobrany za pomocą ListSensitivityLabels
, na przykład:667466bf-a01b-4b0a-8bbf-a79a3d96f720
.
Kompilowanie i testowanie aplikacji
Skompiluj aplikację kliencą przy użyciu F6 (rozwiązanie kompilacji). Jeśli nie masz błędów kompilacji, użyj F5 (Rozpocznij debugowanie), aby uruchomić aplikację.