» Определение SID пользователя

K.A.V.
www.oszone.net
22.02.2010
Автор: kotkovets
Последнее обновление: 01.09.2011

SID(security identifier) - идентификатор безопасности, которая идентифицирует учетную запись пользователя, группы,
домена или компьютера (в Windows на базе технологии NT (NT4, 2000, XP, 2003, Vista, 7).
SID ставится в соответствие каждой учетной записи в момент её создания. Система оперирует с SID'ами учетных записей, а не их именами.
Если снова создать запись с тем же именем и паролем, SID будет уже другой и права не сохраняться.
SID создается при создании учетной записи. Этот идентификатор генерируется при создании учетной записи.
Повторное создание приведет к генерации нового SID и это не зависит от паролей и имен.

Макрос определения SID пользователя:
!define GetUserSID "!insertmacro CallGetUserSID"
!macro CallGetUserSID USERNAME SID
      System::Store S
      StrCpy '$0' '${USERNAME}'
      StrCmp '$0' '' 0 +2
      ExpandEnvStrings '$0' "%USERNAME%"
      System::Call "*(&t1024)i.r1"
      System::Call "advapi32::LookupAccountName(tn,tr0,ir1,*i1024,tn,*i1024,*in)i.r0"
      IntCmp $0 1 0 +2 +2
      System::Call "advapi32::ConvertSidToStringSid(ir1,*t.s)"
      IntCmp $0 1 +2 0 0
      Push error
      System::Free $1
      System::Store L
      Pop "${SID}"
!macroend
Вызов макроса:
${GetUserSID} "username" $var
username - Имя пользователя, если имя пользователя задать, как пустое значение,
                   то в переменную $var возвратится SID текущего пользователя.
$var - Возвращается SID пользователя, в случае ошибки - error
Пример определения SID текущего пользователя:
${GetUserSID} "" $0
MessageBox MB_ICONINFORMATION|MB_OK "SID: $0" IDOK
Пример перечисление всех зарегистрированных пользователей в системе:
!include "MUI2.nsh"

!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_LANGUAGE "Russian"

ShowInstDetails show
OutFile GetUserSID.exe
Caption "GetUserSID"

!define GetUserSID "!insertmacro CallGetUserSID"

!macro CallGetUserSID USERNAME SID
      System::Store S
      StrCpy '$0' '${USERNAME}'
      StrCmp '$0' '' 0 +2
      ExpandEnvStrings '$0' "%USERNAME%"
      System::Call "*(&t1024)i.r1"
      System::Call "advapi32::LookupAccountName(tn,tr0,ir1,*i1024,tn,*i1024,*in)i.r0"
      IntCmp $0 1 0 +2 +2
      System::Call "advapi32::ConvertSidToStringSid(ir1,*t.s)"
      IntCmp $0 1 +2 0 0
      Push error
      System::Free $1
      System::Store L
      Pop "${SID}"
!macroend

!ifdef NSIS_UNICODE
   !define STR %s
!else
   !define STR %S
!endif

Section
   System::Call "netapi32::NetQueryDisplayInformation(wn,i1,i0,i-1,i${NSIS_MAX_STRLEN},*i.R0,*i.R1)i.R4"
   ${If} $R4 = 0
      ${For} $R4 1 $R0
         System::Call "*$R1(i.R2,i.R3,i,w,i,i)"
         IntFmt '$R2' ${STR} $R2
         IntFmt '$R3' ${STR} $R3
         ${GetUserSID} '$R2' '$R5'
         IntOp $R1 $R1 + 24
         DetailPrint "-----------------"
         DetailPrint "Name: $R2" # имя пользователя
         DetailPrint "SID: $R5"  # SID пользователя
         DetailPrint "$R3"       # описание пользователя
      ${Next}
      System::Call "netapi32::NetApiBufferFree(iR1)"
   ${EndIf}
SectionEnd
Данный скрипт полностью совместим с юникодной версией компилятора NSIS.