存储专用数据
LSA Policy 提供了两个可用于设置和检索私有数据的函数。 此数据存储为注册表中的加密字符串。 例如,可以使用这些函数来存储服务器帐户密码和其他敏感信息。
调用 LsaStorePrivateData 函数来存储和加密私有数据。 如 专用数据对象中所述,专用数据对象包括三种专用类型:本地、全局和计算机。 若要创建专用对象,请向传递给 LsaStorePrivateData 的密钥名称添加前缀:“L$”表示本地对象,“G$”表示全局对象,为计算机对象添加“M$”。 如果不创建这些专用类型之一,则无需指定键名称前缀。
若要检索和解码以前存储的私有数据,请调用 LsaRetrievePrivateData。 请注意,无法检索计算机专用数据对象;计算机对象只能由操作系统检索。
在存储或检索私有数据之前,应用程序必须获取本地 Policy 对象的句柄,如 打开策略对象句柄中所述。
以下示例创建本地专用数据对象。 请注意,函数 InitLsaString 将 Unicode 字符串转换为 LSA_UNICODE_STRING 结构。 此函数的代码显示在 使用 LSA Unicode 字符串中。
#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) ,仅允许创建者和管理员读取数据。