存储专用数据

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) ,仅允许创建者和管理员读取数据。