Compartilhar via


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.