Access Rights on NTFS volumes GetFileSecurity (Windows API)

Share your advanced PureBasic knowledge/code with the community.
ABBKlaus
Addict
Addict
Posts: 1143
Joined: Sat Apr 10, 2004 1:20 pm
Location: Germany

Access Rights on NTFS volumes GetFileSecurity (Windows API)

Post by ABBKlaus »

Code updated for 5.20+

Hi ,
i translated this piece of code if found :

Code: Select all

; http://www.vbcity.com/forums/topic.asp?tid=16545
;
; Translated into PB by ABBKlaus on 24.1.2006

Declare.s GetLastError()
Declare CheckFileAccess(Filename$,DesiredAccess)

;FileName$="C:\System Volume Information"
FileName$="C:\"

Mask=CheckFileAccess(Filename$,#MAXIMUM_ALLOWED)
If Mask & #FILE_GENERIC_READ
  Debug "Access #FILE_GENERIC_READ is granted"
Else
  Debug "Access #FILE_GENERIC_READ is not granted"
EndIf

Procedure CheckFileAccess(Filename$,DesiredAccess)
  ;DesiredAccess can contain
  ;
  ;#FILE_GENERIC_READ
  ;#FILE_GENERIC_WRITE
  ;#FILE_GENERIC_EXECUTE
  ;#DELETE
  ;#WRITE_DAC
  ;#WRITE_OWNER
  ;#FILE_ALL_ACCESS
  ;#MAXIMUM_ALLOWED
  
  #TOKEN_QUERY                           = $8
  #SecurityImpersonation                 = $3
  #OWNER_SECURITY_INFORMATION            = $1
  #GROUP_SECURITY_INFORMATION            = $2
  #DACL_SECURITY_INFORMATION             = $4
  
  OSVer=OSVersion()
  If OSVer=#PB_OS_Windows_95 Or OSVer=#PB_OS_Windows_98 Or OSVer=#PB_OS_Windows_ME
    Debug "OS does not support user rights"
  EndIf
  
  Result=0
  hToken=0
  FSFlags=0
  Volume$=GetPathPart(FileName$)
  
  GetVolumeInformation_(Volume$,#Null, 0, 0,0,@FSFlags,#Null,0)
  If FSFlags & #FS_PERSISTENT_ACLS = 0
    Debug "Rights not supported"
    ProcedureReturn -1
  EndIf
  
  RequestedInformation=#DACL_SECURITY_INFORMATION|#GROUP_SECURITY_INFORMATION|#OWNER_SECURITY_INFORMATION
  pSecurityDescriptor.b=0
  nLength=0
  lpnLengthNeeded=0
  
  Debug "GetFileSecurity("+Filename$+")"
  If GetFileSecurity_(@FileName$,RequestedInformation,pSecurityDescriptor,nLength,@lpnLengthNeeded)=0
    Debug GetLastError()
    *Buf=AllocateMemory(lpnLengthNeeded)
    If *Buf>0
      If GetFileSecurity_(@FileName$,RequestedInformation,*Buf,lpnLengthNeeded,@lpnLengthNeeded)
        Debug "GetFileSecurity Success"
        If ImpersonateSelf_(#SecurityImpersonation)
          Debug "ImpersonateSelf Success"
        Else
          Debug "ImpersonateSelf Failed"
        EndIf
        
        If OpenThreadToken_(GetCurrentThread_(),#TOKEN_QUERY,0,@hToken)
          Debug "OpenThreadToken Success"
        Else
          Debug "OpenThreadToken Failed"
        EndIf
        If hToken<>0
          GenMap.GENERIC_MAPPING
          GenMap\GenericRead    = #FILE_GENERIC_READ
          GenMap\GenericWrite   = #FILE_GENERIC_WRITE
          GenMap\GenericExecute = #FILE_GENERIC_EXECUTE
          GenMap\GenericAll     = #FILE_ALL_ACCESS
          MapGenericMask_(@DesiredAccess,GenMap)
          PrivSet.PRIVILEGE_SET
          Size=SizeOf(PrivSet)
          GrantedAccess=0
          r=0
          If AccessCheck_(*Buf,hToken,DesiredAccess,GenMap,PrivSet.PRIVILEGE_SET,@Size,@GrantedAccess,@r)
            Debug "AccessCheck Success"
            
            If GrantedAccess & #FILE_READ_DATA
              Debug "#FILE_READ_DATA"
            EndIf
            If GrantedAccess & #FILE_WRITE_DATA
              Debug "#FILE_WRITE_DATA"
            EndIf
            If GrantedAccess & #FILE_APPEND_DATA
              Debug "#FILE_APPEND_DATA"
            EndIf
            If GrantedAccess & #FILE_READ_EA
              Debug "#FILE_READ_EA"
            EndIf
            If GrantedAccess & #FILE_WRITE_EA
              Debug "#FILE_WRITE_EA"
            EndIf
            If GrantedAccess & #FILE_EXECUTE
              Debug "#FILE_EXECUTE"
            EndIf
            If GrantedAccess & #FILE_DELETE_CHILD
              Debug "#FILE_DELETE_CHILD"
            EndIf
            If GrantedAccess & #FILE_READ_ATTRIBUTES
              Debug "#FILE_READ_ATTRIBUTES"
            EndIf
            If GrantedAccess & #FILE_WRITE_ATTRIBUTES
              Debug "#FILE_WRITE_ATTRIBUTES"
            EndIf
            If (GrantedAccess & #FILE_GENERIC_READ)=#FILE_GENERIC_READ
              Debug "#FILE_GENERIC_READ"
            EndIf
            If (GrantedAccess & #FILE_GENERIC_WRITE)=#FILE_GENERIC_WRITE
              Debug "#FILE_GENERIC_WRITE"
            EndIf
            If (GrantedAccess & #FILE_GENERIC_EXECUTE)=#FILE_GENERIC_EXECUTE
              Debug "#FILE_GENERIC_EXECUTE"
            EndIf
            If (GrantedAccess & #FILE_ALL_ACCESS)=#FILE_ALL_ACCESS
              Debug "#FILE_ALL_ACCESS"
            EndIf
            
            Result=1
          Else
            Debug GetLastError()
          EndIf
          CloseHandle_(hToken)
        EndIf
        RevertToSelf_()
      Else
        Debug "GetFileSecurity Failed"
      EndIf
      FreeMemory(*Buf)
    EndIf
  EndIf
  
  If Result=1
    ProcedureReturn GrantedAccess
  Else
    ProcedureReturn -1
  EndIf
EndProcedure

Procedure.s GetLastError()
  err=GetLastError_()
  buffer=0
  ferr=FormatMessage_(#FORMAT_MESSAGE_ALLOCATE_BUFFER|#FORMAT_MESSAGE_FROM_SYSTEM,0,err,GetUserDefaultLangID_(),@buffer,0,0)
  If buffer<>0
    errormsg$=PeekS(buffer)
    LocalFree_(buffer)
    ProcedureReturn RemoveString(errormsg$,Chr(13)+Chr(10))
  EndIf
EndProcedure