Хранение личных данных
Политика 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), который позволяет только создателю и администраторам считывать данные.