NTSTATUS LsaAddAccountRights( IN LSA_HANDLE hPolicy, IN PSID Sid, IN PLSA_UNICODE_STRING UserRights, IN ULONG UserRightNum);
本関数の呼び出しにはアカウントオブジェクトに対してACCOUNT_ADJUST_PRIVILEGESアクセス権が、ローカルポリシオブジェクトに対してPOLICY_LOOKUP_NAMES及びPOLICY_CREATE_ACCOUNTアクセス権が必要である。
引数の意味は以下の通り。
hPolicy | ローカルポリシオブジェクトのハンドル。 |
Sid | 追加先のアカウントを識別するSID。 |
UserRights | 追加する特権のリスト。 |
UserRightNum | 追加する特権の数。 |
戻り値はエラーコードである。
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); }