Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Artiklar / Titel på artikeln

Sätt behörighet på en NTFS mapp

Postad 2001-01-01 av Daniel Albertsson i sektionen ASP.NET, C#, Okategoriserat med 0 Kommentarer | Läst av: 4106, Betyg: 0%

Förord

Det här exemplet beskriver hur du sätter behörighet på en mapp med hjälp av API. Denna funktion fungerar bara på NTFS-formaterade diskar. Du behöver vara medlem av en Administrator grupp samt ha skriv och läs behörighet.
Innehåll
  » Avslutningsvis
Alla objekt i NT/W2000 har säkerhets attribut som beskrivs av en Säkerhets Beskrivare (SD). SD'n innehåller information om vem som äger objektet och vem som har tillgång till objektet. SD'n innehåller en tillgångs kontroll lista (Access Control List) som förkortas ACL och specificerar behörigheterna för användare och grupper för objektet. Det finns två typer av ACL's: diskret och system. Den diskreta ACL (DACL) kontrolleras av ägaren för objektet. DACL innehåller en post för varje användare, global eller lokal grupp som givits åtkomstbehörighet till objektet. Alla dessa poster innehåller en behörighets kontroll post (Access Control Entry, ACE). En ACE innehåller en ACE_HEADER struktur, följt av åtkomstbehörighet för den ACE typen och SID (Security Identifier, Säkerhets identifierare) ACE_HEADER definerar typen av ACE (ACCESS_ALLOWED_ACE_TYPE eller ACCESS_DENIED_ACE_TYPE), storleken av ACE'n samt kontroll flaggor för ACE'n. Åtkomstbehörigheten bestämmer typen av behörighet (som är läsa, skriva osv.) som användaren eller gruppen har. Koden nedan beskriver hur man modifierar DACL'en för en sökväg. Det behövs läggas till två ACE's. En ACE för mappen och sökvägen och en för eventuella filer i mappen.

Notera

- Följande kod ändrar behörigheten på en katalog till Läs & Skriv eller Ändra.
- Foldern måste ligga på en NTFS partition.
- Du behöver vara Administrator på maskinen mappen ligger på.

1. Öppna ett nytt standard EXE projekt. Form1 skapas automatiskt.
2. Lägg till två Textboxar (Text1 och Text2) och två Knappar (Command1 och Command2) till Form1.
3. Klistra in följande kod i Form1´s kodfönster


' kommentarer i mörkgrått
Private Sub Command1_Click()
Dim sUserName As String
Dim sFolderName As String
sUserName = Trim$(CStr(Text2.Text))
sFolderName = Trim$(CStr(Text1.Text))
SetAccess sUserName, sFolderName, GENERIC_READ Or GENERIC_EXECUTE Or DELETE Or GENERIC_WRITE
End Sub
Private Sub Command2_Click()
Dim sUserName As String
Dim sFolderName As String
sUserName = Trim$(Text2.Text)
sFolderName = Trim$(Text1.Text)
SetAccess sUserName, sFolderName, GENERIC_EXECUTE Or GENERIC_READ
End Sub

Private Sub Form_Load()
Text1.Text = "Ange en mapp"
Text2.Text = "Ange användare"
Command1.Caption = "Ändra"
Command2.Caption = "Läs && Skriv"
End Sub

4. Lägg till en standardmodul (Module1) till projektet och klipp in följande kod i Module1


Option Explicit
' Konstanter som anänds i våra API anrop

' Minnes konstatner som används i olika API anrop.
Public Const GMEM_MOVEABLE = &H2
Public Const LMEM_FIXED = &H0
Public Const LMEM_ZEROINIT = &H40
Public Const LPTR = (LMEM_FIXED + LMEM_ZEROINIT)
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_ALL = &H10000000
Public Const GENERIC_EXECUTE = &H20000000
Public Const GENERIC_WRITE = &H40000000

' Filsäkerhets konstanter.
' Se MSDN för mer information om vad de betyder.
Public Const DACL_SECURITY_INFORMATION = &H4
Public Const SECURITY_DESCRIPTOR_REVISION = 1
Public Const SECURITY_DESCRIPTOR_MIN_LENGTH = 20
Public Const SD_SIZE = (65536 + SECURITY_DESCRIPTOR_MIN_LENGTH)
Public Const ACL_REVISION2 = 2
Public Const ACL_REVISION = 2
Public Const MAXDWORD = &HFFFFFFFF
Public Const SidTypeUser = 1
Public Const AclSizeInformation = 2

' Följande är flaggor som ingår i ACE_HEADER.

Public Const OBJECT_INHERIT_ACE = &H1
Public Const CONTAINER_INHERIT_ACE = &H2
Public Const NO_PROPAGATE_INHERIT_ACE = &H4
Public Const INHERIT_ONLY_ACE = &H8
Public Const INHERITED_ACE = &H10
Public Const VALID_INHERIT_FLAGS = &H1F
Public Const DELETE = &H10000

' Strukturer som används av våra API anrop.
Type ACE_HEADER
AceType As Byte
AceFlags As Byte
AceSize As Integer
End Type


Public Type ACCESS_DENIED_ACE
Header As ACE_HEADER
Mask As Long
SidStart As Long
End Type

Type ACCESS_ALLOWED_ACE
Header As ACE_HEADER
Mask As Long
SidStart As Long
End Type

Type ACL
AclRevision As Byte
Sbz1 As Byte
AclSize As Integer
AceCount As Integer
Sbz2 As Integer
End Type

Type ACL_SIZE_INFORMATION
AceCount As Long
AclBytesInUse As Long
AclBytesFree As Long
End Type

Type SECURITY_DESCRIPTOR
Revision As Byte
Sbz1 As Byte
Control As Long
Owner As Long
Group As Long
sACL As ACL
Dacl As ACL
End Type

' För mer information om vad dessa API gör, se MSDN

Declare Function GetComputerName Lib "kernel32" Alias _
"GetComputerNameA" (ByVal lpBuffer As String, _
nSize As Long) As Long

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 InitializeSecurityDescriptor Lib "advapi32.dll" _
(pSecurityDescriptor As SECURITY_DESCRIPTOR, _
ByVal dwRevision As Long) As Long

Declare Function GetSecurityDescriptorDacl Lib "advapi32.dll" _
(pSecurityDescriptor As Byte, lpbDaclPresent As Long, _
pDacl As Long, lpbDaclDefaulted 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

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 GetAclInformation Lib "advapi32.dll" _
(ByVal pAcl As Long, pAclInformation As Any, _
ByVal nAclInformationLength As Long, _
ByVal dwAclInformationClass As Long) As Long

Public Declare Function EqualSid Lib "advapi32.dll" (pSid1 As Byte, ByVal pSid2 As Long) As Long

Declare Function GetLengthSid Lib "advapi32.dll" (pSid As Any) As _
Long

Declare Function InitializeAcl Lib "advapi32.dll" (pAcl As Byte, _
ByVal nAclLength As Long, ByVal dwAclRevision As Long) As Long

Declare Function GetAce Lib "advapi32.dll" (ByVal pAcl As Long, _
ByVal dwAceIndex As Long, pace As Any) As Long

Declare Function AddAce Lib "advapi32.dll" (ByVal pAcl As Long, _
ByVal dwAceRevision As Long, ByVal dwStartingAceIndex As Long, _
ByVal pAceList As Long, ByVal nAceListLength As Long) As Long

Declare Function AddAccessAllowedAce Lib "advapi32.dll" _
(pAcl As Byte, ByVal dwAceRevision As Long, _
ByVal AccessMask As Long, pSid As Byte) As Long

Public Declare Function AddAccessDeniedAce Lib "advapi32.dll" _
(pAcl As Byte, ByVal dwAceRevision As Long, _
ByVal AccessMask As Long, pSid As Byte) As Long

Declare Function SetSecurityDescriptorDacl Lib "advapi32.dll" _
(pSecurityDescriptor As SECURITY_DESCRIPTOR, _
ByVal bDaclPresent As Long, pDacl As Byte, _
ByVal bDaclDefaulted As Long) As Long

Declare Function SetFileSecurity Lib "advapi32.dll" Alias _
"SetFileSecurityA" (ByVal lpFileName As String, _
ByVal SecurityInformation As Long, _
pSecurityDescriptor As SECURITY_DESCRIPTOR) As Long

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, lMask As Long)
Dim lResult As Long ' Resultat av olika API anrop.
Dim I As Integer ' Används i lopar.
Dim bUserSid(255) As Byte ' Denna innehåller din SID.
Dim bTempSid(255) As Byte ' Denna innehåller SID'en för varje ACE in ACL'en.

Dim lLengthUserName As Long ' Max längd för användare

Dim lUserSID As Long ' SID för den aktuella användaren

Dim lTempSid As Long ' SID för varje ACE i ACL'en.
Dim lUserSIDSize As Long ' Storlek av SID.
Dim sDomainName As String * 255 ' Domänen som användaren tillhör.
Dim lDomainNameLength As Long ' Längs för domännamn.

Dim lSIDType As Long ' Typen av SID information som vi
' får tillbaks.

Dim sFileSD As SECURITY_DESCRIPTOR ' SD av filen vi vill åt.

Dim bSDBuf() As Byte ' Buffer som innehåller SD för denna fil.

Dim lFileSDSize As Long ' Storlek på filens SD.
Dim lSizeNeeded As Long ' Behövande storlek på SD'n för filen.

Dim sNewSD As SECURITY_DESCRIPTOR ' Ny SD.

Dim sACL As ACL ' Används för att greppa DACL'en
' the File SD.

Dim lDaclPresent As Long ' Används för att greppa DACL'en
' the File SD.

Dim lDaclDefaulted As Long ' Används för att greppa DACL'en
' the File SD.

Dim sACLInfo As ACL_SIZE_INFORMATION ' Används för att greppa ACL'en
' from the File SD.

Dim lACLSize As Long ' Storleken på ACL strukturen som används för
' att få ACL'en från filens SD.

Dim pAcl As Long ' Aktuell ACL för filen.
Dim lNewACLSize As Long ' Storleken för den nya ACL'en att skapa.
Dim bNewACL() As Byte ' Buffer för den nya ACL'en'.

Dim sCurrentACE As ACCESS_ALLOWED_ACE ' Aktuell ACE.
Dim pCurrentAce As Long ' Våran aktuella ACE.

Dim nRecordNumber As Long


' Hämtar SID för användaren genom LookupAccountName API. För att använde SID
' det aktuella användarkontot, kallar vi på LookupAccountName API två gånger.
' Den första gången för att för reda på storleken på SID och domännamn.
' Det andra anropet hämtar informationen.

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

' Nu sätter vi sDomainName storlek tillsin riktiga storlek innan vi anropar API'en igen.
sDomainName = Space(lDomainNameLength)

' Anropar LookupAccountName igen för den aktuella SID för användaren.
lResult = LookupAccountName(vbNullString, sUserName, _
bUserSid(0), 255, sDomainName, lDomainNameLength, _
lSIDType)

' Returneras värdet noll så har LookupAccountName inte fungerat;
' testa detta innan du fortsätter.
If (lResult = 0) Then
MsgBox "Error: Kunde inte hitta användarkontot: " _
& sUserName
Exit Sub
End If

' Nu har du SID'et för den som loggat på. SID'et är av intresse för
' det vill ge oss SD't för filen som användaren är intresserad av.
' GetFileSecurity API't hämtar SD't för filen,
' Du måste anropa API't två gånger för att först få storlek på SD't
' och sedan för att få SD informationen.

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

' Åter dimmensionera SD' till den rätta storleken.
ReDim bSDBuf(lSizeNeeded)

' Hämta SD't för filen.
lResult = GetFileSecurity(sFileName, DACL_SECURITY_INFORMATION, _
bSDBuf(0), lSizeNeeded, lSizeNeeded)

' Returneras värdet noll så har anropet inte fungerat. Testa innan du fortsätter
If (lResult = 0) Then
MsgBox "Error: Kunde inte hämta säkerhets beskrivningen (SD)"
Exit Sub
End If

' Anropa InitializeSecurityDescriptor för att bygga det nya SD't för filen
lResult = InitializeSecurityDescriptor(sNewSD, _
SECURITY_DESCRIPTOR_REVISION)

' Returneras värdet noll så har anropet inte fungerat. Testa innan du fortsätter
If (lResult = 0) Then
MsgBox "Error: Kunte inte initsiera en ny säkerhets beskrivning (SD)"
Exit Sub
End If

' Nu när du har filens SD och en ny SD som kommer ersätta den befintliga.
' Hänta DACL'en från SD't genom att anropa GetSecurityDescriptorDacl API'et.

lResult = GetSecurityDescriptorDacl(bSDBuf(0), lDaclPresent, _
pAcl, lDaclDefaulted)

' Returneras värdet noll så har anropet inte fungerat. Testa innan du fortsätter
If (lResult = 0) Then
MsgBox "Error: Kunde inte hämta DACL från säkerhets " _
& "beskrivningen (SD)"
Exit Sub
End If

' För att hämta ACL'en från SD't anropa GetACLInformation API funktionen.
' Se efter om ACL'en existerar innan du hämtar information
If (lDaclPresent = False) Then
MsgBox "Error: No ACL Information Available for this File"
Exit Sub
End If

' Försöker hämta ACL'en från SD't.
lResult = GetAclInformation(pAcl, sACLInfo, Len(sACLInfo), 2&)

' Returneras värdet noll så har anropet inte fungerat. Testa innan du fortsätter
If (lResult = 0) Then
MsgBox "Error: Kunde inte hämta DACL från säkerhet beskrivningen (SD)"
Exit Sub
End If

' Nu när du har ACL informationen, räkna ut den nya ACL storleken som behövs.
lNewACLSize = sACLInfo.AclBytesInUse + (Len(sCurrentACE) + _
GetLengthSid(bUserSid(0))) * 2 - 4

' Revidera storleken på våran nya ACL buffer.
ReDim bNewACL(lNewACLSize)

' Använd InitializeAcl API funktionen för att initsiera den nya ACL'en.
lResult = InitializeAcl(bNewACL(0), lNewACLSize, ACL_REVISION)

' Returneras värdet noll så har anropet inte fungerat. Testa innan du fortsätter
If (lResult = 0) Then
MsgBox "Error: Kunde inte initsiera den nya ACL'en."
Exit Sub
End If

' Om en DACL är presenterad, kopiera den till en ny DACL.
If (lDaclPresent) Then

' Kopiera ACE's från filen till den nya ACL'en.
If (sACLInfo.AceCount > 0) Then

' Grab each ACE and stuff them into the new ACL.
nRecordNumber = 0
For I = 0 To (sACLInfo.AceCount - 1)

' Försöker hämta nästa ACE.
lResult = GetAce(pAcl, I, pCurrentAce)

' Ta reda på att du har hämtat ACE'n.
If (lResult = 0) Then
MsgBox "Error: Kunde inte hämta ACE (" & I & ")"
Exit Sub
End If

' Du har en pekare till ACE'n. Placera den i en struktur
' så du kan få dess storlek.
CopyMemory sCurrentACE, pCurrentAce, LenB(sCurrentACE)

'Lägg inte till ACE'n till ACL om det är samma användarid.
lTempSid = pCurrentAce + 8
If EqualSid(bUserSid(0), lTempSid) = 0 Then

' Nu när du har ACE'n, lägg till den i den nya ACL.
lResult = AddAce(VarPtr(bNewACL(0)), ACL_REVISION, _
MAXDWORD, pCurrentAce, _
sCurrentACE.Header.AceSize)

' Försäkra dej att du har rätt ACE..
If (lResult = 0) Then
MsgBox "Error: Kunde inte lägga till ACE'n till den nya ACL"
Exit Sub
End If
nRecordNumber = nRecordNumber + 1
End If

Next I

' Du har nu byggt en ny ACL och vill lägga till den till
' den nyligen skapade DACL'n.
lResult = AddAccessAllowedAce(bNewACL(0), ACL_REVISION, _
lMask, bUserSid(0))

' Försäkra dej om att ACL'n lades till DACL'n.
If (lResult = 0) Then
MsgBox "Error: Kunde inte lägga till ACL till DACL"
Exit Sub
End If

'Om det är en mapp, information om arv.
If GetAttr(sFileName) And vbDirectory Then

' Försök hämta nästa ACE vilket är den vi la till.
lResult = GetAce(VarPtr(bNewACL(0)), nRecordNumber, pCurrentAce)

' Försäkra dej om att du har rätt ACE under behandling.
If (lResult = 0) Then
MsgBox "Error: Kunde inte hämta ACE (" & I & ")"
Exit Sub
End If
' Du har en pekare till ACE. Placera den i en struktur
' så du kan få deras storlek.
CopyMemory sCurrentACE, pCurrentAce, LenB(sCurrentACE)
sCurrentACE.Header.AceFlags = OBJECT_INHERIT_ACE + INHERIT_ONLY_ACE
CopyMemory ByVal pCurrentAce, VarPtr(sCurrentACE), LenB(sCurrentACE)

'Lägg till ytterligare ACE för filer.
lResult = AddAccessAllowedAce(bNewACL(0), ACL_REVISION, _
lMask, bUserSid(0))

' Föraäkrade att ACL'n lades till DACL'n.
If (lResult = 0) Then
MsgBox "Error: Kunde inte lägga till ACL'n till DACL"
Exit Sub
End If

' Försök hämta nästa ACE.
lResult = GetAce(VarPtr(bNewACL(0)), nRecordNumber + 1, pCurrentAce)

' Försäkra dej att du har den aktuella ACE'n under behandling.
If (lResult = 0) Then
MsgBox "Error: Kunde inte hämta ACE (" & I & ")"
Exit Sub
End If

CopyMemory sCurrentACE, pCurrentAce, LenB(sCurrentACE)
sCurrentACE.Header.AceFlags = CONTAINER_INHERIT_ACE
CopyMemory ByVal pCurrentAce, VarPtr(sCurrentACE), LenB(sCurrentACE)
End If

' Sätt filens SD till den nya DACL'n.
lResult = SetSecurityDescriptorDacl(sNewSD, 1, _
bNewACL(0), 0)

' Fösäkra dej att du satt SD'n till den nya DACL.
If (lResult = 0) Then
MsgBox "Error: " & _
"Kunde inte sätta den nya DACL'n till Security Descriptor (SD)"
Exit Sub
End If

' Slutligen lägg till SD'n till filen
lResult = SetFileSecurity(sFileName, _
DACL_SECURITY_INFORMATION, sNewSD)

' Försäkra dej att du lagt till SD'n till filen
If (lResult = 0) Then
MsgBox "Error: Kunde inte sätta ny Security Descriptor (SD)" _
& " på filen : " & sFileName
MsgBox Err.LastDllError
Else
MsgBox "Uppdaterad Security Descriptor (SD) på filen: " _
& sFileName
End If

End If

End If

End Sub

5. Kör applikationen..
6. Ange sökväg för den mapp du vill ändra samt användare
7. Klicka på Läs/skriv gör att ge läs och skrivbehörighet, och klicka på ändra för att ge behörigeht ändra på mappen.
8. Kontrollera sedan behörigheten på mappen genom att välja välja egenskaper, välj flik säkerhet och klicka på behörighet.


Avslutningsvis

För att jag skall veta om kursen är bra eller om den måste skrivas om så rösta gärna här uppe till höger. Skicka gärna ett iMail om du vill kommentera något som är felaktigt eller du tycker borde förtydligas.

/Daniel Albertsson
Upp

0 Kommentarer

Skriv en kommentar på artikeln

Ditt betyg på artikeln



Kommentar:





Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 154
27 952
271 704
1 078
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies