Red de conocimiento informático - Problemas con los teléfonos móviles - Establecer permisos de directorio en VB

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>

' 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

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>

'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

Dim sFolderName As String

sUserName = Trim$(CStr(Text2.Text))

sFolderName = Trim$(CStr(Text1.Text))