LsaAddAccountRights アカウントに特権を追加

Cの宣言:

NTSTATUS LsaAddAccountRights(
	IN LSA_HANDLE hPolicy,
	IN PSID Sid,
	IN PLSA_UNICODE_STRING UserRights,
	IN ULONG UserRightNum);

説明:

Sidで指定したアカウントにUserRightsで指定した特権を追加する。指定した特権が既に付与されている場合はその特権は無視される。アカウントが存在しない場合、新規アカウントが作成される。

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

引数の意味は以下の通り。
hPolicy ローカルポリシオブジェクトのハンドル。
Sid 追加先のアカウントを識別するSID。
UserRights 追加する特権のリスト。
UserRightNum 追加する特権の数。

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

Cのサンプル:

LsaAddAccountRightsを使用して、ローカルマシン上の“Guests”というグループに対してシステム時刻の変更の特権を追加する。
void AddRights()
{
	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 | POLICY_CREATE_ACCOUNT,
		&hPolicy);

	/* アカウントに特権追加 */
	LsaAddAccountRights(
		hPolicy,
		psid,
		Rights,
		1);

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

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

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