Condividi tramite


Archiviazione di dati privati

I criteri LSA forniscono due funzioni che è possibile usare per impostare e recuperare dati privati. Questi dati vengono archiviati come stringa crittografata nel Registro di sistema. Ad esempio, è possibile usare queste funzioni per archiviare le password dell'account server e altre informazioni riservate.

Chiamare la funzione LsaStorePrivateData per archiviare e crittografare i dati privati. Come descritto in Private Data Object, gli oggetti dati privati includono tre tipi specializzati: locale, globale e computer. Per creare un oggetto specializzato, aggiungere un prefisso al nome della chiave passato a LsaStorePrivateData: "L$" per oggetti locali, "G$" per gli oggetti globali e "M$" per gli oggetti computer. Se non si crea uno di questi tipi specializzati, non è necessario specificare un prefisso del nome della chiave.

Per recuperare e decodificare i dati privati archiviati in precedenza, chiamare LsaRetrievePrivateData. Si noti che non è possibile recuperare oggetti dati privati del computer; gli oggetti computer possono essere recuperati solo dal sistema operativo.

Prima di poter archiviare o recuperare dati privati, l'applicazione deve ottenere un handle all'oggetto Criteri locale, come illustrato in Apertura di un handle oggetto Criteri.

Nell'esempio seguente viene creato un oggetto dati privato locale. Si noti che la funzione InitLsaString converte una stringa Unicode in una struttura LSA_UNICODE_STRING . Il codice per questa funzione viene visualizzato in Uso di stringhe 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;
}

Nota

I dati archiviati dalla funzione LsaStorePrivateData non sono assolutamente protetti. La chiave, tuttavia, ha un elenco di controllo di accesso discrezionale (DACL) che consente solo all'autore e agli amministratori di leggere i dati.