Partilhar via


Armazenamento de 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 cifrar dados privados. Conforme descrito em Private Data Object, os objetos de dados privados incluem três tipos especializados: local, global e de máquina. 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 máquina. 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, ligue LsaRetrievePrivateData. Observe que não é possível recuperar objetos de dados privados da máquina; Os objetos de máquina podem ser recuperados apenas pelo sistema operacional.

Antes de armazenar ou recuperar dados privados, a sua aplicação deve obter um identificador para o objeto de política local, conforme demonstrado em Abrindo um Identificador de Objeto de Política.

O exemplo a seguir cria um objeto de dados privado local. Observe que a função InitLsaString converte uma cadeia de caracteresUnicodeem uma estrutura LSA_UNICODE_STRING. O código para esta função é mostrado em Usando LSA Unicode Strings.

#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 estão absolutamente protegidos. A chave, no entanto, tem uma lista de controle de acesso discricionário (DACL) que permite que apenas o criador e os administradores leiam os dados.