Freigeben über


Speichern privater Daten

Die LSA-Richtlinie bietet zwei Funktionen, mit denen Sie private Daten festlegen und abrufen können. Diese Daten werden als verschlüsselte Zeichenfolge in der Registrierung gespeichert. Beispielsweise können Sie diese Funktionen verwenden, um Serverkontokennwörter und andere vertrauliche Informationen zu speichern.

Rufen Sie die LsaStorePrivateData-Funktion auf, um private Daten zu speichern und zu verschlüsseln. Wie unter Private Data Object beschrieben, umfassen private Datenobjekte drei spezialisierte Typen: lokal, global und computer. Um ein spezialisiertes Objekt zu erstellen, fügen Sie dem an LsaStorePrivateData übergebenen Schlüsselnamen ein Präfix hinzu: "L$" für lokale Objekte, "G$" für globale Objekte und "M$" für Computerobjekte. Wenn Sie keinen dieser spezialisierten Typen erstellen, müssen Sie kein Schlüsselnamenpräfix angeben.

Rufen Sie LsaRetrievePrivateData auf, um zuvor gespeicherte private Daten abzurufen und zu decodieren. Beachten Sie, dass Sie keine privaten Datenobjekte vom Computer abrufen können. Computerobjekte können nur vom Betriebssystem abgerufen werden.

Bevor Sie private Daten speichern oder abrufen können, muss Ihre Anwendung ein Handle für das lokale Policy-Objekt abrufen, wie unter Öffnen eines Richtlinienobjekthandles veranschaulicht.

Im folgenden Beispiel wird ein lokales privates Datenobjekt erstellt. Beachten Sie, dass die Funktion InitLsaString eine Unicode-Zeichenfolge in eine LSA_UNICODE_STRING-Struktur konvertiert. Der Code für diese Funktion wird unter Verwenden von LSA-Unicode-Zeichenfolgen angezeigt.

#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;
}

Hinweis

Die von der LsaStorePrivateData-Funktion gespeicherten Daten sind nicht absolut geschützt. Der Schlüssel verfügt jedoch über eine daCL (Discretionary Access Control List ), die es nur dem Ersteller und Administratoren ermöglicht, die Daten zu lesen.