LSA ポリシーには、プライベート データの設定と取得に使用できる 2 つの機能が用意されています。 このデータは、暗号化された文字列としてレジストリに格納されます。 たとえば、これらの関数を使用して、サーバー アカウントのパスワードやその他の機密情報を格納できます。
LsaStorePrivateData 関数を呼び出して、プライベート データを格納および暗号化します。 プライベート データ オブジェクトで説明されているように、プライベート データ オブジェクトには、ローカル、グローバル、マシンの 3 つの特殊な種類が含まれます。 特殊化されたオブジェクトを作成するには、ローカル オブジェクトの場合は "L$"、グローバル オブジェクトの場合は "G$"、コンピューター オブジェクトの場合は "M$" LsaStorePrivateDataに渡されるキー名にプレフィックスを追加します。 これらの特殊な型のいずれかを作成しない場合は、キー名のプレフィックスを指定する必要はありません。
以前に保存したプライベート データを取得してデコードするには、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) があります。