Establecer permisos de directorio en VB
'Agregar nuevo usuario a la carpeta
'Agregar al módulo estándar:
Opción explícita
Const pública GMEM_MOVEABLE = &H2
Const pública LMEM_FIXED = &H0
Const pública LMEM_ZEROINIT = &H40
Const pública LPTR = (LMEM_FIXED + LMEM_ZEROINIT)
Pública Const GENERIC_READ = & >
' Constantes de llamada de API de seguridad/archivo.
Para obtener más información sobre el propósito de estas constantes, consulte MSDN.
'para.
Const pública DACL_SECURITY_INFORMATION = & H4
Const pública SECURITY_DESCRIPTOR_REVISION = 1
Const pública SECURITY_DESCRIPTOR_MIN_LENGTH = 20
Const pública SD_SIZE = ( 65536+ SECURITY_DESCRIPTOR_MIN_LENGTH)
Const pública ACL_REVISION2 = 2
Const pública ACL_REVISION = 2
Const pública MAXDWORD = &HFFFFFFFF
Pública Const SidTypeUser = 1
Public Const AclSizeInformation = 2
' A continuación se muestran los indicadores de herencia que van en el campo AceFlags del encabezado Ace
'.
Const pública OBJECT_INHERIT_ACE = &H1
Const pública CONTAER_INHERIT_ACE = &H2
Const pública NO_PROPAGATE_INHERIT_ACE = &H4
Const pública INHERIT_ONLY_ACE = &
Const pública INHERITED_ACE = &H10
Const pública VALID_INHERIT_FLAGS = &H1F
Const pública DELETE = &H10000
' utilizada por nuestra estructura de llamadas API .
' Consulte MSDN para obtener detalles sobre cómo/qué se utilizan estas
' estructuras.
Escriba ACE_HEADER
AceType como byte
AceFlags como byte
AceSize como entero
Tipo de fin p>
p>
' Tipo público ACCESS_DENIED_ACE
Encabezado como ACE_HEADER
Máscara tan larga
SidStart tan larga
Tipo de fin
p>Escriba ACCESS_ALLOWED_ ACE
Encabezado como ACE_HEADER
Máscara mientras sea largo
SidStart como largo
Tipo de fin
Tipo ACL
AclRevision como byte
Sbz1 como byte
AclSize AsSbz1 como byte
AclSize como entero p>
AceCount como entero
Sbz2 como entero
Tipo final
Tipo ACL_SIZE_INFORMATION
AceCount tan largo
AclBytesInUse tan largo
AclBytesFree tan largo
Tipo de fin
TipoSECURITY_DESCRIPTOR
Revisión como byte
Sbz1 Como Byte
Control Mientras
Propietario Mientras
Grupo Mientras
sACL Como ACL
Dacl As ACL
End Type
' llamada API utilizada en este ejemplo. Llamadas API utilizadas en este ejemplo.
Declarar la función GetComputerName Lib "kernel32" alias "GetComputerNameA" (ByVal lpBuffer como cadena, nSize As Long) durante el tiempo
Declarar la función GetUserName Lib "advapi32.dll" alias "GetUserNameA" (ByVal lpBuffer como cadena, nSize como largo) Mientras
Declarar función LookupAccountName Lib "advapi32.dll" Alias "LookupAccountNameA" (lpSystemName como cadena, ByVal lpAccountName como cadena, sid como cualquiera, cbSid como Largo, ByVal ReferencedDomainName como cadena, cbReferencedDomainName como cadena, cbReferencedDomainName como largo, cbReferencedDomainName como largo cbReferencedDomainName como largo, peUse mientras) como largo
Declarar función InitializeSecurityDescriptor Lib "advapi32.dll" ( pSecurityDescriptor como SECURITY_DESCRIPTOR, ByVal dwRevision As Long) As Long
Declarar función GetSecurityDescriptorDacl Lib "advapi32.dll" (pSecurityDescriptor As Long) As Long
Declarar función GetFileSecurityN Lib "advapi32.dll" alias "GetFileSecurityA" (ByVal lpFileName como cadena, ByVal RequestedInformation mientras, ByVal ByVal lpFileName como cadena, ByVal RequestedInformation mientras, ByVal SecurityDescriptor mientras, ByVal nLength mientras, lpnLengthNeeded mientras) Mientras
Declarar función GetFileSecurity Lib "advapi32.dll" Alias "GetFileSecurityA" (ByVal lpFileName como cadena, ByVal RequestedInformation tan larga, pSecurityDescriptor como byte, ByVal nLength como larga, lpnLengthNeeded como larga, lpnLengthNeeded como larga, lpnLengthNeeded Siempre, lpnLe
ngthNeeded As Long lpnLengthNeeded As Long) As Long
Declarar función GetAclInformation Lib "advapi32.dll" (ByVal pAcl As Long, pAclInformation As Any, ByVal nAclInformationLength As Long, ByVal dwAclInformationClass As Long) As Long
Declaración pública de la función EqualSid Lib "advapi32.dll" (pSid1 como byte, ByVal pSid2 durante el tiempo)
Declaración de la función GetLengthSid Lib "advapi32.dll" (pSid como cualquiera) durante el tiempo
Declarar función InitializeAcl Lib "advapi32.dll" (pAcl como byte, ByVal nAclLength como largo, ByVal dwAclRevision como largo) como largo
Declarar función GetAce Lib "advapi32.dll" (ByVal pAcl mientras, ByVal dwAceIndex mientras, ritmo como cualquiera) Mientras
Declarar función AddAce Lib "advapi32.dll" (ByVal pAcl mientras, ByVal dwAceRevision mientras, ByVal dwAclRevision mientras, ByVal dwAclRevision como Long) ByVal dwAceRevision As Long, ByVal dwStartingAceIndex As Long, ByVal pAceList As Long, ByVal nAceListLength As Long) As Long
Declarar función AddAccessAllowedAce Lib "advapi32.dll" (pAcl As Byte, ByVal dwAceRevision As Long, ByVal AccessMask mientras, pSid como byte) mientras
Función de declaración pública AddAccessDeniedAce Lib "advapi32.dll" (pAcl como byte, ByVal dwAceRevision mientras, ByVal AccessMask mientras, pSid como byte) mientras pDacl Como byte, ByVal bDaclDefaulted As Long) As Long
Declarar función SetFileSecurity Lib "advapi32.dll" Alias "SetFileSecurityA" (ByVal lpFileName como cadena, ByVal SecurityInformation mientras, pSecurityDescriptor como SECURITY_DESC
RIPTOR) Mientras
Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, ByVal hpvSource As Long, ByVal cbCopy As Long)
Public Sub SetAccess( sUserName As String, sFileName As String, pSecurityDescriptor As SECURITY_DESCRIPTOR) As Long sFileName As String, lMask As Long)
Dim lResult As Long ' Los resultados de varias llamadas API.
Dim I As Integer ' para bucle.
Dim bUserSid(255) As Byte ' Esto contendrá su SID.
Dim bTempSid(255) As Byte ' Esto contendrá el Sid para cada ACE en la ACL.
Dim sSystemName As String 'El nombre de este sistema informático.
Dim lSystemNameLength As Long 'Contiene
'La longitud de la cadena de este nombre de sistema.
Dim lTempSid(255) As Byte ' Esto contendrá su SID en este sistema.
Dim lLengthUserName As Long ' La longitud máxima del nombre de usuario.
'Dim sUserName As String * 255 ' Guarda la cadena del nombre de usuario actual
'.
Dim lUserSID As Long ' Se usa para guardar
' El SID del usuario actual.
Dim lTempSid As Long ' Se utiliza para guardar el SID de cada ACE en la ACL
Dim lUserSIDSize As Long ' El tamaño del SID.
Dim sDomainName As String * 255 'El dominio al que pertenece el usuario.
Dim lDomainNameLength As Long ' La longitud requerida del nombre de dominio.
Dim lSIDType As Long 'El tipo de información SID que queremos devolver
'La información devuelta.
Dim sFileSD As SECURITY_DESCRIPTOR ' SECURITY_DESCRIPTOR DESCRIPTOR's SD ' La SD del archivo que necesitamos.
Dim bSDBuf() As Byte ' Buffer que contiene un descriptor
seguro.
Dim lFileSDSize As Long 'El tamaño del archivo SD.
Dim lSizeNeeded As Long ' El tamaño requerido del archivo SD.
Dim sNewSD As SECURITY_DESCRIPTOR ' Nuevo descriptor de seguridad.
Dim sACL As ACL ' se utiliza para obtener el DACL de
' el archivo SD.
Dim lDaclPresent As Long ' Se utiliza para obtener el DACL del
' archivo SD.
Dim lDaclDefaulted As Long ' para desde
' archivo SD.
Dim sACLInfo As ACL_SIZE_ INFORMACIÓN ' para desde
' Coge el DACL del archivo SD.
. Se utiliza al obtener ACL del archivo SD.
Dim lACLSize As Long 'El tamaño de la estructura ACL utilizada al obtener la ACL del archivo SD
Dim pAcl As Long 'La ACL actual de este archivo.
Dim bNewACL() As Byte ' Buffer para guardar la nueva ACL.
Dim sCurrentACE As ACCESS_ALLOWED_ACE ' ACE actual.
Dim pCurrentAce As Long ' Nuestro ACE actual.
Dim nRecordNumber As Long
' Obtiene el SID del usuario. (Consulte MSDN para obtener más información sobre SID
' y su función/propósito en los sistemas operativos). Utilice la API LookupAccountName para obtener el SID del
' usuario. (Para obtener más información sobre SID
' y su función/propósito en los sistemas operativos, consulte MSDN.
lResult = LookupAccountName(vbNullString, sUserName, _
bUserSid (0), 255, sDomainName, lDomainName, lDomainName(0), _
' y cadena DomainName, lDomainNameLength, _
lSIDType)
'. Ahora configure el buffer de cadena sDomainName al tamaño apropiado, luego
' Llame a la API nuevamente
sDomainName = Space(lDomainNameLength)
' Llame a LookupAccountName nuevamente para obtener el SID real del usuario
lResult = LookupAccountName(vbNullString, sUserName, _
bUserSid(0), 255, sDomainName, lDomainNameLength, _
lSIDType)<. /p>
' Un valor de retorno de 0 significa que la llamada a LookupAccountName falló;
' Prueba antes de continuar
si (lResult = 0) entonces
<. p> MsgBox "Error. No se puede consultar la cuenta de usuario actual:" _& sUserName
Salir de Sub
End If
' Ahora tiene el SID del usuario que inició sesión
' El SID obtiene el descriptor de seguridad del archivo que le interesa al usuario.
Entonces tiene sentido
'. La API GetFileSecurity obtendrá el descriptor de seguridad de un archivo.
Sin embargo, debe llamar a esta API dos veces: una para obtener
' el tamaño apropiado del descriptor de seguridad. utilizado para obtener
' la información real del descriptor de seguridad.
lResult = GetFileSecurityN(sFileName, DACL_SECURITY_INFORMATION, _
0, 0, lSizeNeeded)
' Cambia el tamaño del búfer del descriptor de seguridad al tamaño apropiado.
ReDim bSDBuf (lSizeNeeded)
' Ahora obtiene el descriptor de seguridad real del archivo.
lResultado = GetFileSecurity(sFileName, DACL_SECURITY_INFORMATION, _
lResultado = GetFileSecurity(sFileName, DACL_SECURITY_INFORMATION, _ CopyMemory sCB = 0.p> CopyMemory sCurrentACE, pCurrentAce, LenB(sCurrentACE) p> p>
'Si esta es la misma identificación de usuario, omita agregar ACE a ACL
lTempSid = pCurrentAce + 8
If EqualSid(bUserSid(0), lTempSid ) = 0 Entonces
'Ahora que tiene una ACE, agréguela a la nueva ACL
lResult = AddAce( VarPtr(bNewACL(0)), ACL_REVISION, _< /p. >
MAXDWORD, pCurrentAce, _
sCurrentACE.Header.AceSize)
' Asegúrese de haber colocado el ACE actual debajo del problema
If. (lResultado = 0) Luego
MsgBox "Error: No se puede agregar ACE a la nueva ACL"
Salir de Sub
Finalizar si
nRecordNumber = nRecordNumber + 1
Finalizar si
Siguiente I
' Ahora ha reconstruido una nueva ACL y desea agregarla a
'En el DACL recién creado
lResult = AddAccessAllowedAce(bNewACL(0), ACL_REVISION, _
lMask, bUserSid(0))
'No se puede para agregar ACL a DACL"
Salir de Sub
End If
'Si es un directorio, necesitamos agregar personal de herencia.
' If GetAttr(sFileName) And vbDirectory Then
' Intenta tomar el siguiente ACE, que es lo que acabamos de agregar.
lResult = GetAce(VarPtr(bNewACL(0 )), nRecordNumber, pCurrentAce)
'Asegúrese de tener el ACE actual.
Si (lResult = 0) Entonces
MsgBox "Error: No se puede obtener ACE (" & I & ")"
Salir de Sub
End If
' Tiene un puntero a ACE.
'Ponlo en una estructura para que puedas ver su tamaño. AceFlags = OBJECT_INHERIT_ACE + INHERIT_ ONLY_ACE
CopyMemory ByVal pCurrentAce, VarPtr(sCurrentACE), LenB(sCurrentACE)
'Agrega otra ACE al archivo
lResult = AddAccessAllowedAce (bNewACL(0), ACL_REVISION, _
lMask, bUserSid(0))
' Asegúrese de que la ACL se haya agregado a la DACL.
Si (lResultado = 0) Entonces
MsgBox "Error:
Salir del sub
Finalizar si
' Intente tomar el siguiente ACE
lResult = GetAce(VarPtr(bNewACL(0)), nRecordNumber + 1, pCurrentAce)
' Asegúrese de tener el ACE actual. >
Si (lResultado = 0) Entonces
MsgBox "Error: No se puede obtener ACE (" & I & ")"
Salir de Sub
Fin si
CopyMemory sCurrentACE, pCurrentAce, LenB(sCurrentACE)
sCurrentACE.Header.AceFlags = CONTAINER.AceFlags = CONTAINER.AceFlags = CONTAINER.AceFlags = CONTAINER.AceFlags.AceFlags = CONTAINER_INHERIT_ACE
CopyMemory ByVal pCurrentAce, VarPtr(sCurrentACE), LenB(sCurrentACE)
End If
' Establece el descriptor de seguridad del archivo en el nuevo DACL
lResult = SetSecurityDescriptorDacl(sNewSD, 1, _
bNewACL(0), 0 )
'Asegúrese de que SD esté configurado en la nueva DACL.
Si (lResult = 0) Entonces
MsgBox "Error:" & _
"No se puede configurar el nuevo DACL como descriptor de seguridad"
Salir Sub
End If
' ¡El último paso es volver a agregar el descriptor de seguridad al archivo
'!
lResult = SetFileSecurity(sFileName, _
DACL_SECURITY_INFORMATION, sNewSD)
' ¡Asegúrese de haber agregado el descriptor de seguridad al archivo!
' Si (lResult = 0), el paso final es volver a agregar el descriptor de seguridad al archivo
' ¡Archivo! Si (lResult = 0) Entonces
MsgBox "Error: No se puede establecer un nuevo descriptor de seguridad " _
& " en el archivo: " & sFileName
MsgBox Err .LastDllError
Else
MsgBox "Descriptor de seguridad actualizado en el archivo: " _
& sFileName
Fin si
Finalizar si
Finalizar si
Finalizar si
Finalizar si
Fin Sub.p>
End Sub
'Agregar código al formulario:
Opción explícita
Subcomando privado1_Click()
Dim sUserName As String p>
Dim sFolderName As String
sUserName = Trim$(CStr(Text2.Text))
sFolderName = Trim$(CStr(Text1.Text))