Поделиться через


Хранение личных данных

Политика LSA предоставляет две функции, которые можно использовать для задания и извлечения частных данных. Эти данные хранятся в реестре в виде зашифрованной строки. Например, эти функции можно использовать для хранения паролей учетных записей сервера и других конфиденциальных сведений.

Вызовите функцию LsaStorePrivateData для хранения и шифрования частных данных. Как описано в разделе Частный объект данных, частные объекты данных включают три специализированных типа: локальный, глобальный и компьютерный. Чтобы создать специализированный объект, добавьте префикс к имени ключа, передаваемого в LsaStorePrivateData: "L$" для локальных объектов, "G$" для глобальных объектов и "M$" для объектов компьютера. Если вы не создаете один из этих специализированных типов, указывать префикс имени ключа не нужно.

Чтобы получить и декодировать ранее сохраненные частные данные, вызовите LsaRetrievePrivateData. Обратите внимание, что вы не можете получить частные объекты данных компьютера; Объекты компьютера могут быть получены только операционной системой.

Перед сохранением или извлечением частных данных приложение должно получить дескриптор локального объекта Policy , как показано в разделе Открытие дескриптора объекта политики.

В следующем примере создается локальный частный объект данных. Обратите внимание, что функция InitLsaString преобразует строку Юникода в структуру LSA_UNICODE_STRING . Код для этой функции показан в разделе Использование строк Юникода 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;
}

Примечание

Данные, хранящиеся функцией LsaStorePrivateData , не защищены абсолютно. Однако у ключа есть дискреционный список управления доступом (DACL), который позволяет только создателю и администраторам считывать данные.