Armazenando dados privados
A política LSA fornece duas funções que você pode usar para definir e recuperar dados privados. Esses dados são armazenados como uma cadeia de caracteres criptografada no registro. Por exemplo, você pode usar essas funções para armazenar senhas de conta de servidor e outras informações confidenciais.
Chame a função LsaStorePrivateData para armazenar e criptografar dados privados. Conforme descrito em Private Data Object, os objetos de dados privados incluem três tipos especializados: local, global e computador. Para criar um objeto especializado, adicione um prefixo ao nome da chave passado para LsaStorePrivateData: "L$" para objetos locais, "G$" para objetos globais e "M$" para objetos de computador. Se você não estiver criando um desses tipos especializados, não precisará especificar um prefixo de nome de chave.
Para recuperar e decodificar dados privados armazenados anteriormente, chame LsaRetrievePrivateData. Observe que você não pode recuperar objetos de dados privados do computador; objetos de computador só podem ser recuperados pelo sistema operacional.
Antes de armazenar ou recuperar dados privados, seu aplicativo deve obter um identificador para o objeto Policy local, conforme demonstrado em Abrir um Identificador de Objeto de Política.
O exemplo a seguir cria um objeto de dados privados local. Observe que a função InitLsaString converte uma cadeia de caracteres Unicode em uma estrutura LSA_UNICODE_STRING . O código para essa função é mostrado em Usando cadeias de caracteres 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;
}
Observação
Os dados armazenados pela função LsaStorePrivateData não são absolutamente protegidos. A chave, no entanto, tem uma DACL ( lista de controle de acesso discricionário ) que permite que apenas o criador e os administradores leiam os dados.