次の方法で共有


プライベート データの格納

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) があります。