儲存私人數據
LSA 策略提供兩個函式,可讓您用來設定和擷取私密資料。 此資料會儲存為登錄中的加密字串。 例如,您可以使用這些函式來儲存伺服器帳戶密碼和其他敏感性資訊。
呼叫 LsaStorePrivateData 函式來儲存和加密私人數據。 如 Private Data Object中所述,私人數據物件包含三種特製化類型:本機、全域和計算機。 若要建立特製化物件,請在傳遞給 LsaStorePrivateData的鍵名前加上前置詞:“L$” 代表本機物件,“G$” 代表全域物件,以及 “M$” 代表機器物件。 如果您未建立下列其中一個特製化類型,則不需要指定索引鍵名稱前置詞。
若要擷取和譯碼先前儲存的私人數據,請呼叫 LsaRetrievePrivateData。 請注意,您無法擷取電腦私人數據物件;機器物件只能由作系統擷取。
在您能夠儲存或擷取私人數據之前,您的應用程式必須取得本機 政策 物件的控制代碼,如 開啟政策物件控制代碼所示。
下列範例會建立本機私人數據物件。 請注意,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),只允許建立者和系統管理員讀取資料。