Partager via


Stockage de données privées

La stratégie LSA fournit deux fonctions que vous pouvez utiliser pour définir et récupérer des données privées. Ces données sont stockées sous forme de chaîne chiffrée dans le Registre. Par exemple, vous pouvez utiliser ces fonctions pour stocker les mots de passe de compte de serveur et d’autres informations sensibles.

Appelez la fonction LsaStorePrivateData pour stocker et chiffrer des données privées. Comme décrit dans Private Data Object, les objets de données privées incluent trois types spécialisés : local, global et machine. Pour créer un objet spécialisé, ajoutez un préfixe au nom de clé passé à LsaStorePrivateData : « L$ » pour les objets locaux, « G$ » pour les objets globaux et « M$ » pour les objets machine. Si vous ne créez pas l’un de ces types spécialisés, vous n’avez pas besoin de spécifier un préfixe de nom de clé.

Pour récupérer et décoder des données privées précédemment stockées, appelez LsaRetrievePrivateData. Notez que vous ne pouvez pas récupérer les objets de données privées de l’ordinateur ; les objets machine ne peuvent être récupérés que par le système d’exploitation.

Avant de pouvoir stocker ou récupérer des données privées, votre application doit obtenir un handle pour l’objet Policy local, comme illustré dans Ouverture d’un handle d’objet de stratégie.

L’exemple suivant crée un objet de données privées local. Notez que la fonction InitLsaString convertit une chaîne Unicode en structure LSA_UNICODE_STRING . Le code de cette fonction s’affiche dans Utilisation de chaînes 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;
}

Notes

Les données stockées par la fonction LsaStorePrivateData ne sont pas absolument protégées. La clé, toutefois, a une liste de contrôle d’accès discrétionnaire (DACL) qui permet uniquement au créateur et aux administrateurs de lire les données.