Przechowywanie danych prywatnych
Zasady LSA udostępniają dwie funkcje, których można użyć do ustawiania i pobierania danych prywatnych. Te dane są przechowywane jako zaszyfrowany ciąg w rejestrze. Można na przykład użyć tych funkcji do przechowywania haseł kont serwera i innych poufnych informacji.
Wywołaj funkcję LsaStorePrivateData w celu przechowywania i szyfrowania danych prywatnych. Zgodnie z opisem w obiektów prywatnych danychobiekty danych prywatnych obejmują trzy wyspecjalizowane typy: lokalne, globalne i maszynowe. Aby utworzyć wyspecjalizowany obiekt, dodaj prefiks do nazwy klucza przekazanej do LsaStorePrivateData: "L$" dla obiektów lokalnych, "G$" dla obiektów globalnych i "M$" dla obiektów maszyny. Jeśli nie tworzysz jednego z tych wyspecjalizowanych typów, nie musisz określać prefiksu nazwy klucza.
Aby pobrać i zdekodować wcześniej przechowywane dane prywatne, wywołaj metodę LsaRetrievePrivateData. Należy pamiętać, że nie można pobrać obiektów danych prywatnych maszyny; obiekty maszyny mogą być pobierane tylko przez system operacyjny.
Aby można było przechowywać lub pobierać dane prywatne, aplikacja musi uzyskać dojście do lokalnego obiektu Policy, jak pokazano w Otwieranie dojścia obiektu zasad.
Poniższy przykład tworzy lokalny obiekt danych prywatnych. Należy pamiętać, że funkcja InitLsaString konwertuje ciągUnicodena strukturę LSA_UNICODE_STRING. Kod tej funkcji jest wyświetlany w części Używanie ciągów Unicode LSA.
#include <windows.h>
#include <stdio.h>
BOOL CreatePrivateDataObject(LSA_HANDLE PolicyHandle)
{
NTSTATUS ntsResult;
LSA_UNICODE_STRING lucKeyName;
LSA_UNICODE_STRING lucPrivateData;
// The L$ prefix specifies a local private data object
WCHAR wszKeyName[] = L"L$MyPrivateKey";
WCHAR wszPrivateData[] = L"Something secret.";
// Initializing PLSA_UNICODE_STRING structures
if (!InitLsaString(&lucKeyName, wszKeyName))
{
wprintf(L"Failed InitLsaString\n");
return FALSE;
}
if (!InitLsaString(&lucPrivateData, wszPrivateData))
{
wprintf(L"Failed InitLsaString\n");
return FALSE;
}
// Store the private data.
ntsResult = LsaStorePrivateData(
PolicyHandle, // handle to a Policy object
&lucKeyName, // key to identify the data
&lucPrivateData // the private data
);
if (ntsResult != STATUS_SUCCESS)
{
wprintf(L"Store private object failed %lu\n",
LsaNtStatusToWinError(ntsResult));
return FALSE;
}
return TRUE;
}
Notatka
Dane przechowywane przez funkcję LsaStorePrivateData nie są całkowicie chronione. Klucz ma jednak uznaniową listę kontroli dostępu (DACL), która umożliwia odczytywanie danych tylko twórcom i administratorom.