From b33bc407e95df41e59d0b579b37ebd7f31d0fbb2 Mon Sep 17 00:00:00 2001 From: wj32 Date: Tue, 21 Dec 2010 03:48:57 +0000 Subject: [PATCH] improved PhpGetAccountPrivileges git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3911 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/phlib/include/ph.h | 2 ++ 2.x/trunk/phlib/support.c | 36 +++++++++++++++--------------------- 2 files changed, 17 insertions(+), 21 deletions(-) diff --git a/2.x/trunk/phlib/include/ph.h b/2.x/trunk/phlib/include/ph.h index 90c46abc0..6e301e286 100644 --- a/2.x/trunk/phlib/include/ph.h +++ b/2.x/trunk/phlib/include/ph.h @@ -873,6 +873,8 @@ NTSTATUS PhOpenLsaPolicy( __in_opt PUNICODE_STRING SystemName ); +LSA_HANDLE PhGetLookupPolicyHandle(); + PHLIBAPI BOOLEAN PhLookupPrivilegeName( __in PLUID PrivilegeValue, diff --git a/2.x/trunk/phlib/support.c b/2.x/trunk/phlib/support.c index f79b841cb..861d604f3 100644 --- a/2.x/trunk/phlib/support.c +++ b/2.x/trunk/phlib/support.c @@ -2841,39 +2841,33 @@ NTSTATUS PhCreateProcessAsUser( } NTSTATUS PhpGetAccountPrivileges( - __in PSID Account, + __in PSID AccountSid, __out PTOKEN_PRIVILEGES *Privileges ) { NTSTATUS status; - LSA_HANDLE policyHandle; - PUNICODE_STRING userRights; - ULONG countOfRights; + LSA_HANDLE accountHandle; + PPRIVILEGE_SET accountPrivileges; PTOKEN_PRIVILEGES privileges; - ULONG i; - if (!NT_SUCCESS(status = PhOpenLsaPolicy(&policyHandle, POLICY_LOOKUP_NAMES, NULL))) + status = LsaOpenAccount(PhGetLookupPolicyHandle(), AccountSid, ACCOUNT_VIEW, &accountHandle); + + if (!NT_SUCCESS(status)) return status; - status = LsaEnumerateAccountRights(policyHandle, Account, &userRights, &countOfRights); + status = LsaEnumeratePrivilegesOfAccount(accountHandle, &accountPrivileges); + LsaClose(accountHandle); - if (NT_SUCCESS(status)) - { - privileges = PhAllocate(FIELD_OFFSET(TOKEN_PRIVILEGES, Privileges) + sizeof(LUID_AND_ATTRIBUTES) * countOfRights); - privileges->PrivilegeCount = countOfRights; + if (!NT_SUCCESS(status)) + return status; - for (i = 0; i < countOfRights; i++) - { - privileges->Privileges[i].Attributes = 0; - LsaLookupPrivilegeValue(policyHandle, &userRights[i], &privileges->Privileges[i].Luid); - } + privileges = PhAllocate(FIELD_OFFSET(TOKEN_PRIVILEGES, Privileges) + sizeof(LUID_AND_ATTRIBUTES) * accountPrivileges->PrivilegeCount); + privileges->PrivilegeCount = accountPrivileges->PrivilegeCount; + memcpy(privileges->Privileges, accountPrivileges->Privilege, sizeof(LUID_AND_ATTRIBUTES) * accountPrivileges->PrivilegeCount); - LsaFreeMemory(userRights); + LsaFreeMemory(accountPrivileges); - *Privileges = privileges; - } - - LsaClose(policyHandle); + *Privileges = privileges; return status; }