LsaRemoveAccountRights アカウントから特権を削除

Cの宣言:

NTSTATUS LsaRemoveAccountRights(
	IN LSA_HANDLE hPolicy,
	IN PSID Sid,
	IN BOOLEAN RemoveAll,
	IN OPTIONAL PSA_UNICODE_STRING UserRights,
	IN ULONG UserRightNum);

説明:

アカウントから特権を削除する。

本関数の実行にはアカウントオブジェクトに対してACCOUNT_ADJUST_PRIVILEGES及びDELETEアクセス権が、ローカルポリシオブジェクトに対してPOLICY_LOOKUP_NAMESアクセス権が必要である。

引数の意味は以下の通り。
hPolicy ローカルポリシオブジェクトのハンドル。
Sid 削除先のアカウントを識別するSID。
RemoveAll 真の場合、すべての特権を削除した後に、アカウントを削除する。偽の場合、UserRightsで指定された特権が削除される。
UserRights 削除する特権。RemoveAllが真の場合無視される。
UserRightNum 削除する特権の数。

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

Cのサンプル:

LsaRemoveAccountRightsを使用して、ローカルマシン上の“Guests”というグループの持つシステム時刻の変更の特権を削除する。
void DelRights()
{
	LSA_UNICODE_STRING Rights[1];
	LSA_HANDLE hPolicy;
	LSA_OBJECT_ATTRIBUTES Attr;
	SECURITY_QUALITY_OF_SERVICE Quality;

	PSID psid;
	DWORD SidSize = 1000;
	LPWSTR DomainName;
	DWORD DomainNameSize = 1000;
	DWORD SidType;

	/* 初期設定 */
	Rights[0].Buffer = SE_SYSTEMTIME_NAME;
	Rights[0].Length = lstrlen(SE_SYSTEMTIME_NAME) * sizeof(WCHAR);
	Rights[0].MaximumLength = (lstrlen(SE_SYSTEMTIME_NAME) + 1) * sizeof(WCHAR);

	/* GuestsのSID取得 */
	psid = GlobalAlloc(GMEM_FIXED, SidSize);
	DomainName = GlobalAlloc(GMEM_FIXED, DomainNameSize);
	LookupAccountName(NULL, L"Guests", psid, &SidSize, DomainName, &DomainNameSize, &SidType);

	/* ポリシオブジェクトのオープン */
	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_LOOKUP_NAMES,
		&hPolicy);

	/* 特権の削除 */
	LsaRemoveAccountRights(hPolicy, psid, FALSE, Rights, 1);

	/* 後処理 */
	GlobalFree(psid);
	GlobalFree(DomainName);
	LsaClose(hPolicy);
}

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

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