次の方法で共有


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

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