NTSTATUS LsaRetrievePrivateData( IN LSA_HANDLE hPolicy, IN PLSA_UNICODE_STRING KeyName, OUT PLSA_UNICODE_STRING *PrivateData);
引数の意味は以下の通り。
hPolicy | ポリシオブジェクトのハンドル。 |
KeyName | キーの名前。 |
PrivateData | 取得結果のLSA秘密。 |
戻り値はエラーコードである。
void TestPrivateData(void) { LSA_HANDLE hPolicy; LSA_OBJECT_ATTRIBUTES Attr; SECURITY_QUALITY_OF_SERVICE Quality; LPWSTR KeyName = L"$MACHINE.ACC"; LSA_UNICODE_STRING LsaKeyName; PLSA_UNICODE_STRING pResult; WCHAR msg[1000]; Attr.Length = sizeof(Attr); Attr.RootDirectory = NULL; Attr.ObjectName = NULL; Attr.Attributes = 0; Attr.SecurityDescriptor = NULL; Attr.SecurityQualityOfService = &Quality; Quality.Length = sizeof(Quality); Quality.ImpersonationLevel = SecurityImpersonation; Quality.ContextTrackingMode = SECURITY_DYNAMIC_TRACKING; Quality.EffectiveOnly = FALSE; /* ポリシオブジェクトのオープン */ LsaOpenPolicy(NULL, &Attr, POLICY_READ, &hPolicy); /* パスワードの取得 */ LsaKeyName.Buffer = KeyName; LsaKeyName.Length = lstrlen(KeyName) * sizeof(WCHAR); LsaKeyName.MaximumLength = (lstrlen(KeyName) + 1) * sizeof(WCHAR); LsaRetrievePrivateData(hPolicy, &LsaKeyName, &pResult); /* 結果の表示(プレーンテキストと仮定) */ lstrcpyn(msg, pResult->Buffer, pResult->Length / sizeof(WCHAR) + 1); msg[pResult->Length / sizeof(WCHAR)] = '\0'; wprintf(L"%s\n", msg); /* 後処理 */ LsaFreeMemory(pResult); LsaClose(hPolicy); }