Savoir si un usager a access à un fichier ou un dossier

Soyez le premier à donner votre avis sur cette source.

Snippet vu 5 302 fois - Téléchargée 36 fois

Contenu du snippet

reçoi un nom de fichier et un mask et permet de savoir si on a acces à ce dossier

j'ai pris une partie du code ici, masi j'ai du modifier beaucoup pour avoir se résultat. par contre, ça risque d,en aider plusieurs

exemple : If GetAccess(fichier, GENERIC_EXECUTE Or GENERIC_READ) Then

Source / Exemple :


Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long
Declare Function LookupAccountName Lib "advapi32.dll" Alias "LookupAccountNameA" (lpSystemName As String, ByVal lpAccountName As String, sid As Any, cbSid As Long, ByVal ReferencedDomainName As String, cbReferencedDomainName As Long, peUse As Long) As Long
Declare Function GetFileSecurity Lib "advapi32.dll" Alias "GetFileSecurityA" (ByVal lpFileName As String, ByVal RequestedInformation As Long, pSecurityDescriptor As Byte, ByVal nLength As Long, lpnLengthNeeded As Long) As Long
Declare Function GetFileSecurityN Lib "advapi32.dll" Alias "GetFileSecurityA" (ByVal lpFileName As String, ByVal RequestedInformation As Long, ByVal pSecurityDescriptor As Long, ByVal nLength As Long, lpnLengthNeeded As Long) As Long

' The file/security API call constants.
' Refer to the MSDN for more information on how/what these constants
' are used for.
Public Const DACL_SECURITY_INFORMATION = &H4

Public Const GENERIC_READ = &H80000000
Public Const GENERIC_EXECUTE = &H20000000

'savoir si on a acces au fichier ou dossier
Public Function GetAccess(ByVal sFileName As String, lMask As Long) As Boolean

    Dim strUserName As String
    Dim lResult As Long            ' Result of various API calls.
    
    Dim bUserSid(255) As Byte      ' This will contain your SID.
    
    Dim lUserSID As Long           ' Used to hold the SID of the
                                  ' current user.
    Dim lSIDType As Long              ' The type of SID info we are
                                     ' getting back.
    Dim lFileSDSize As Long           ' Size of the File SD.
    Dim lSizeNeeded As Long           ' Size needed for SD for file.
                                     
    
    Dim sDomainName As String * 255   ' Domain the user belongs to.
    Dim lDomainNameLength As Long     ' Length of domain name needed.
    
    Dim bSDBuf() As Byte           ' Buffer that holds the security
                                  ' descriptor for this file.
   
    GetAccess = False
    
    Dim temp As Integer

    If InStr(Mid(sFileName, 2), "*") <> 0 Then
        sFileName = Mid(sFileName, InStr(Mid(sFileName, 2), "*") + 2)
    End If
    'Create a buffer
    strUserName = String(100, Chr$(0))
    'Get the username
    GetUserName strUserName, 100
    'strip the rest of the buffer
    strUserName = Left$(strUserName, InStr(strUserName, Chr$(0)) - 1)
' Get the SID of the user. (Refer to the MSDN for more information on SIDs
   ' and their function/purpose in the operating system.) Get the SID of this
   ' user by using the LookupAccountName API. In order to use the SID
   ' of the current user account, call the LookupAccountName API
   ' twice. The first time is to get the required sizes of the SID
   ' and the DomainName string. The second call is to actually get
   ' the desired information.

   lResult = LookupAccountName(vbNullString, strUserName, _
      bUserSid(0), 255, sDomainName, lDomainNameLength, _
      lSIDType)

   ' Now set the sDomainName string buffer to its proper size before
   ' calling the API again.
   sDomainName = Space(lDomainNameLength)

   ' Call the LookupAccountName again to get the actual SID for user.
   lResult = LookupAccountName(vbNullString, strUserName, _
      bUserSid(0), 255, sDomainName, lDomainNameLength, _
      lSIDType)

   ' Return value of zero means the call to LookupAccountName failed;
   ' test for this before you continue.
     If (lResult = 0) Then
        MsgBox "Error: Unable to Lookup the Current User Account: " _
           & sUserName
        Exit Function
     End If

   ' You now have the SID for the user who is logged on.
   ' The SID is of interest since it will get the security descriptor
   ' for the file that the user is interested in.
   ' The GetFileSecurity API will retrieve the Security Descriptor
   ' for the file. However, you must call this API twice: once to get
   ' the proper size for the Security Descriptor and once to get the
   ' actual Security Descriptor information.

   lResult = GetFileSecurityN(sFileName, DACL_SECURITY_INFORMATION, _
      0, 0, lSizeNeeded)

   ' Redimension the Security Descriptor buffer to the proper size.
   ReDim bSDBuf(lSizeNeeded)

   ' Now get the actual Security Descriptor for the file.
   lResult = GetFileSecurity(sFileName, DACL_SECURITY_INFORMATION, _
      bSDBuf(0), lSizeNeeded, lSizeNeeded)

   ' A return code of zero means the call failed; test for this
   ' before continuing.
   If (lResult <> 0) Then
      GetAccess = True
   End If
End Function

A voir également

Ajouter un commentaire Commentaires
Messages postés
2336
Date d'inscription
samedi 14 juillet 2001
Statut
Membre
Dernière intervention
5 mai 2009
6
c'est une source qui date de 2003 et qui était fait pour Access

en .net, regarde sous system.io.file, tu trouveras ton bonheur
Messages postés
98
Date d'inscription
vendredi 4 juin 2004
Statut
Membre
Dernière intervention
20 août 2012

Salut! C'est intéressant!
Si je comprend bien, ce code s'applique aux systèmes serveurs ... Mais alors, comment l'appliquer aux systèmes non serveur comme XP, Seven, ... car depuis un temps je cherche à empêcher un utilisateur de copier, enregistrer sous ou supprimer un fichier se trouvant sur le poste d'où il travail selon une stratégie du genre celles de Windows server. Alors comment car les documents concernés ne peuvent qu'être lus à qui de droit.
De l'aide svp!
Messages postés
51
Date d'inscription
dimanche 24 août 2003
Statut
Membre
Dernière intervention
29 octobre 2010
2
J'ai pas très bien compris le truc !
=> si un fichier est utilisé par une personne ce bout de prog va le signaler ?
ou seulement un accès dossier
dans un intranet ou sur une même machine ?
bon faut que j'essaie mais moi je recherche ça pour un intranet !
Messages postés
63
Date d'inscription
mercredi 28 février 2001
Statut
Membre
Dernière intervention
25 novembre 2010

Ce que je cherchais depuis 3 jours !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.