LsaOpenPolicy ポリシオブジェクトのオープン

Cの宣言:

NTSTATUS LsaOpenPolicy(
	IN PLSA_UNICODE_STRING SystemName OPTIONAL,
	IN PLSA_OBJECT_ATTRIBUTES ObjectAttribtes,
	IN ACCESS_MASK DesiredAccess,
	OUT PLSA_HANDLE hPolicy);

説明:

LSAサブシステムとの接続を確立し、SystemNameで指定されたポリシオブジェクトをオープンする。

引数の意味は以下の通り。
SystemName システム名。NULLを指定した場合、ローカルシステムとみなされる。
ObjectAttributes 接続に使用する属性。
DesiredAccess オープン時のアクセス権。
hPolicy 取得結果のハンドル。

戻り値はエラーコードである。

Cのサンプル:

LsaEnumerateAccountRightsを使用して、“hogehoge”というマシンのAdministratorアカウントが持つ特権のリストを取得し、表示する。
void EnumRights()
{
	LPWSTR SystemName = L"hogehoge"; /* 取得先のシステム名 */
	LPWSTR AccountName = L"Administrators"; /* 取得先のアカウント名 */
	LSA_UNICODE_STRING LsaSystemName; /* LSA用に変換したシステム名 */
	PSID psid; /* アカウント名に対応するSID */

	/* ポリシオブジェクト関連 */
	LSA_HANDLE hPolicy;
	LSA_OBJECT_ATTRIBUTES Attr;
	SECURITY_QUALITY_OF_SERVICE Quality;

	/* 取得結果関連 */
	ULONG RightNum;
	PLSA_UNICODE_STRING UserRights;
	ULONG i;
	WCHAR Right[1000];

	/* LookupAccountName関連。取得後使用されることはない */
	DWORD SidSize = 1000;
	LPWSTR DomainName;
	DWORD DomainNameSize = 1000;
	DWORD SidType;

	/* 初期設定 */
	LsaSystemName.Buffer = SystemName;
	LsaSystemName.Length = lstrlen(SystemName) * sizeof(WCHAR);
	LsaSystemName.MaximumLength = (lstrlen(SystemName) + 1) * sizeof(WCHAR);

	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(&LsaSystemName, &Attr, POLICY_READ | POLICY_EXECUTE, &hPolicy);

	/* 管理者のSIDを取得 */
	psid = GlobalAlloc(GMEM_FIXED, SidSize);
	DomainName = GlobalAlloc(GMEM_FIXED, DomainNameSize);

	LookupAccountName(SystemName, AccountName, psid, &SidSize, DomainName, &DomainNameSize, &SidType);

	/* 特権のリストを取得 */
	LsaEnumerateAccountRights(
		hPolicy,
		psid,
		&UserRights,
		&RightNum);

	/* 特権のリストを表示 */
	for(i=0; i<RightNum; i++) {
		lstrcpyn(Right, UserRights[i].Buffer, UserRights[i].Length / sizeof(WCHAR)  + 1);
		Right[UserRights[i].Length / sizeof(WCHAR)] = '\0';
		wprintf(L"%s\n", Right);
	}

	/* 後処理 */
	GlobalFree(psid);
	GlobalFree(DomainName);
	LsaFreeMemory(UserRights);

	LsaClose(hPolicy);
}

(original text:1999/05/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。