プライベート データの格納
LSA ポリシーには、プライベート データの設定と取得に使用できる 2 つの機能が用意されています。 このデータは、暗号化された文字列としてレジストリに格納されます。 たとえば、これらの関数を使用して、サーバー アカウントのパスワードやその他の機密情報を格納できます。
LsaStorePrivateData 関数を呼び出して、プライベート データを格納および暗号化します。 「プライベート データ オブジェクト」で説明されているように、プライベート データ オブジェクトには、ローカル、グローバル、マシンの 3 つの特殊な型が含まれます。 特殊化されたオブジェクトを作成するには、 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;
}
Note
LsaStorePrivateData 関数によって格納されるデータは、絶対に保護されていません。 ただし、キーには、作成者と管理者のみがデータを読み取る 随意アクセス制御リスト (DACL) があります。