LsaLookupSids SIDからアカウント名を取得

Cの宣言:

NTSTATUS LsaLookupSids(
	IN LSA_HANDLE hPolicy,
	IN ULONG SidNum,
	IN PSID *Sids,
	OUTPLSA_REFERENCED_DOMAIN_LIST *DomainList,
	OUT PLSA_TRANSLATED_NAME TransNames);

説明:

SIDからアカウント名を取得する。

本関数の実行にはポリシオブジェクトに対してPOLICY_LOOKUP_NAMESアクセス権が必要。

引数の意味は以下の通り。
hPolicy ポリシオブジェクトのハンドル。
SidNum 変換するSIDの数。
Sids 変換するSIDのリスト。
DomainList アカウントが見つかったドメインのリスト。LSA_TRANSLATED_NAMEのDomainIndexで参照される。
TransNames 変換結果のアカウント名。

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

Cのサンプル:

LsaEnumerateAccountsWithUserRightを使用して、“hogehoge”というマシンにおける、システム時刻の変更の特権を持つアカウントのリストを取得し、結果を表示する。
void EnumSysTimeAccount(void)
{
	LSA_HANDLE hPolicy;
	LSA_OBJECT_ATTRIBUTES Attr;
	SECURITY_QUALITY_OF_SERVICE Quality;
	LPWSTR SystemName = L"hogehoge";
	LSA_UNICODE_STRING LsaSystemName;

	LSA_UNICODE_STRING UserRight;
	PLSA_ENUMERATION_INFORMATION pEnumInfo;
	ULONG InfoNum;
	ULONG i;
	WCHAR msg[1000];

	/* 初期化 */
	PLSA_REFERENCED_DOMAIN_LIST pDomainList;
	PLSA_TRANSLATED_NAME pTransName;

	UserRight.Buffer = SE_SYSTEMTIME_NAME;
	UserRight.Length = lstrlen(SE_SYSTEMTIME_NAME) * sizeof(WCHAR);
	UserRight.MaximumLength = (lstrlen(SE_SYSTEMTIME_NAME) + 1) * sizeof(WCHAR);

	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_VIEW_LOCAL_INFORMATION | POLICY_LOOKUP_NAMES,
		&hPolicy);

	/* システム時刻変更特権を持つアカウントの列挙 */
	LsaEnumerateAccountsWithUserRight(
		hPolicy,
		&UserRight,
		&pEnumInfo,
		&InfoNum);

	/* 取得結果のSIDをアカウント名に変更 */
	LsaLookupSids(
		hPolicy,
		InfoNum,
		(PSID *)pEnumInfo,
		&pDomainList,
		&pTransName);

	/* アカウント名を表示 */
	for(i=0; i<InfoNum; i++) {
		lstrcpyn(msg, pTransName[i].Name.Buffer, pTransName[i].Name.Length / sizeof(WCHAR) + 1);
		msg[pTransName[i].Name.Length / sizeof(WCHAR)] = '\0';
		wprintf(L"%s\n", msg);
	}

	/* 後処理 */
	LsaFreeMemory(pTransName);
	LsaFreeMemory(pDomainList);
	LsaFreeMemory(pEnumInfo);

	LsaClose(hPolicy);
}

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

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