Udostępnij za pośrednictwem


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.