Almacenamiento de datos privados
La directiva de LSA proporciona dos funciones que puede usar para establecer y recuperar datos privados. Estos datos se almacenan como una cadena cifrada en el Registro. Por ejemplo, puede usar estas funciones para almacenar contraseñas de cuenta de servidor y otra información confidencial.
Llame a la función LsaStorePrivateData para almacenar y cifrar datos privados. Como se describe en Private Data Object, los objetos de datos privados incluyen tres tipos especializados: local, global y máquina. Para crear un objeto especializado, agregue un prefijo al nombre de clave pasado a LsaStorePrivateData: "L$" para objetos locales, "G$" para objetos globales y "M$" para objetos de máquina. Si no va a crear uno de estos tipos especializados, no es necesario especificar un prefijo de nombre de clave.
Para recuperar y descodificar datos privados almacenados anteriormente, llame a LsaRetrievePrivateData. Tenga en cuenta que no puede recuperar objetos de datos privados de la máquina; el sistema operativo solo puede recuperar objetos de máquina.
Para poder almacenar o recuperar datos privados, la aplicación debe obtener un identificador para el objeto Policy local, como se muestra en Apertura de un identificador de objeto de directiva.
En el ejemplo siguiente se crea un objeto de datos privado local. Tenga en cuenta que la función InitLsaString convierte una cadena Unicode en una estructura LSA_UNICODE_STRING . El código de esta función se muestra en Uso de cadenas Unicode de 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;
}
Nota
Los datos almacenados por la función LsaStorePrivateData no están absolutamente protegidos. Sin embargo, la clave tiene una lista de control de acceso discrecional (DACL) que solo permite al creador y a los administradores leer los datos.