Enumerate User Privileges

From NSIS Wiki

Author: CancerFace (talk, contrib)

NSIS forum thread started by user RobGrant


The following code will enumerate the rights that a given user has. For a list of rights check this MSDN page. The code demonstrates how the rights can be passed to an NSIS variable ($4). The LsaEnumerateAccountRights return code registered on $R8 can be translated into a Windows Error Code using LsaNtStatusToWinError. If the user has no extra rights the error code registered on $R9 is equal to 2.


!define POLICY_LOOKUP_NAMES 0x00000800
!define strLSA_OBJECT_ATTRIBUTES '(i,i,w,i,i,i)i'
!define strLSA_UNICODE_STRING '(&i2,&i2,w)i'
System::Call '*${strLSA_OBJECT_ATTRIBUTES}(24,n,n,0,n,n).r0'
System::Call 'advapi32::LsaOpenPolicy(w n, i r0, i ${POLICY_LOOKUP_NAMES}, *i .R0) i.R8'
StrCpy $2 "$UserName" # define this somewhere
System::Call '*(&w${NSIS_MAX_STRLEN})i.R1'
System::Call 'Advapi32::LookupAccountNameW(w n, w r2, i R1, *i r3, w .R8, *i r3, *i .r4) i .R8'
# Enumerate the rights
; R2 is the pointer to an array of LSA_UNICODE_STRING structures
; R3 is a variable that receives the number of privileges in the R2 array
System::Call 'advapi32::LsaEnumerateAccountRights(i R0, i R1, *i .R2, *i .R3)i.R8'
System::Call 'advapi32::LsaNtStatusToWinError(i R8) i.R9'
# Get the rights out to $4
StrCpy $9 0
 StrCmp $9 $R3 stop
 System::Call '*$R2${strLSA_UNICODE_STRING}(.r2,.r3,.r4)'
 DetailPrint 'Got Privilege $4'
 IntOp $R2 $R2 + 8
 IntOp $9 $9 + 1
 Goto loop
System::Free $0
System::Free $R1
System::Call 'advapi32::LsaFreeMemory(i R2) i .R8'
System::Call 'advapi32::LsaClose(i R0) i .R8'


  • If the LsaOpenPolicy call is succesful then $R8 = 0
  • If the LookupAccountName call is succesful then $R8 <> 0
  • If the LsaEnumerateAccountRights call is succesful then $R8 = 0
  • If the user has no rights then the LsaNtStatusToWinError call returns $R9 = 2

Resources and Links

  • NSIS forum thread started by user RobGrant
  • List of possible rights returned by the LsaEnumerateAccountRights API call

API Functions used:

Personal tools