简体   繁体   中英

Prevent file from being (Deleted/Edited) in Runtime VB.NET

is that possible to protect a file inside project directory location.

for example (test.txt or test.bat or ... Etc).

i have important data dont wanna change inside txt, while runing the project.

tired many thing's.

  • lock file by permission / file stream (but not work good, it easy to unlock by change user's permission.

now my code i tried but it lock only the project not the file, in runtime

let's say my file type (test.txt or test.bat or ... Etc).

Imports System.Runtime.InteropServices
Imports System.ComponentModel
Imports System.Security.AccessControl
Imports System.Security.Principal

Public Class c_AntiKill
<DllImport("advapi32.dll", SetLastError:=True)> _
Shared Function GetKernelObjectSecurity(Handle As IntPtr, securityInformation As Integer, <Out> pSecurityDescriptor As Byte(), nLength As UInteger, ByRef lpnLengthNeeded As UInteger) As Boolean
End Function
<DllImport("advapi32.dll", SetLastError:=True)> _
Shared Function SetKernelObjectSecurity(Handle As IntPtr, securityInformation As Integer, <[In]> pSecurityDescriptor As Byte()) As Boolean
End Function
<DllImport("kernel32.dll")> _
Shared Function GetCurrentProcess() As IntPtr
End Function
Protected Function GetProcessSecurityDescriptor(processHandle As IntPtr) As RawSecurityDescriptor
    Dim psd() As Byte = New Byte(1) {}
    Dim bufSizeNeeded As UInteger
    GetKernelObjectSecurity(processHandle, &H4, psd, 0, bufSizeNeeded)
    psd = New Byte(bufSizeNeeded) {}
    If bufSizeNeeded < 0 OrElse bufSizeNeeded > Short.MaxValue Then
        Throw New Win32Exception()
    End If
    If Not GetKernelObjectSecurity(processHandle, &H4, psd, bufSizeNeeded, bufSizeNeeded) Then
        Throw New Win32Exception()
    End If
    Return New RawSecurityDescriptor(psd, 0)
End Function
Protected Sub SetProcessSecurityDescriptor(processHandle As IntPtr, dacl As RawSecurityDescriptor)
    Dim rawsd As Byte() = New Byte(dacl.BinaryLength - 1) {}
    dacl.GetBinaryForm(rawsd, 0)
    If Not SetKernelObjectSecurity(processHandle, &H4, rawsd) Then
        Throw New Win32Exception()
    End If
End Sub
Public Sub c_ImAntiKill()
    Dim hProcess As IntPtr = GetCurrentProcess()
    Dim dacl = GetProcessSecurityDescriptor(hProcess)
    dacl.DiscretionaryAcl.InsertAce(0, New CommonAce(AceFlags.None, AceQualifier.AccessDenied, CInt(&HF0000 Or &H100000 Or &HFFF), New SecurityIdentifier(WellKnownSidType.WorldSid, Nothing), False, Nothing))
    SetProcessSecurityDescriptor(hProcess, dacl)
    '   Console.ReadKey()
End Sub
End Class

you can use user's permission. answer from another thread.(work good) https://stackoverflow.com/a/45785316

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM