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 Privates Datenobjektbeschrieben, enthalten private Datenobjekte drei spezielle Typen: lokal, global und Computer. Um ein spezialisiertes Objekt zu erstellen, fügen Sie dem Schlüsselnamen, der an LsaStorePrivateData übergeben wird, 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 LsaRetrievePrivateDataauf, um zuvor gespeicherte private Daten abzurufen und zu decodieren. Beachten Sie, dass Sie keine privaten Computerdatenobjekte 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 Richtlinienobjekt abrufen, wie unter Öffnen eines Richtlinienobjekthandleveranschaulicht.
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-Zeichenfolgengezeigt.
#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 unbedingt geschützt. Der Schlüssel verfügt jedoch über eine DACL (Discretionary Access Control List), die nur dem Ersteller und den Administratoren das Lesen der Daten ermöglicht.