站内搜索:
| Public Declare Sub MapGenericMask Lib "advapi32.dll" (AccessMask As Long,GenericMapping As GENERIC_MAPPING) Public Declare Function OpenThreadToken Lib "advapi32.dll"(ByVal ThreadHandle As Long, ByVal DesiredAccess As Long,ByVal OpenAsSelf As Long, TokenHandle As Long) As Long Public Declare Function GetCurrentThread Lib "kernel32" () As Long Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Public Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type Public Const VER_PLATFORM_WIN32_NT As Long = 2 Public Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _ (lpVersionInformation As OSVERSIONINFO) As Long Public Const FS_PERSISTENT_ACLS As Long = &H8 Public Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String,ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long,lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long,lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String,ByVal nFileSystemNameSize As Long) As Long ’检查文件的访问权限 Public Function CheckFileAccess(fileName As String, ByVal DesiredAccess As Long) As Long Dim r As Long, SecDesc() As Byte, SDSize As Long, hToken As Long Dim PrivSet As PRIVILEGE_SET, GenMap As GENERIC_MAPPING Dim Volume As String, FSFlags As Long If Not IsNT() Then CheckFileAccess = -1 Exit Function End If If Left$(fileName, 2) = "\\" Then r = InStr(3, fileName, "\") If r = 0 Then Volume = fileName & "\" Else Volume = Left$(fileName, r) End If ElseIf Mid$(fileName, 2, 2) = ":\" Then Volume = Left$(fileName, 3) End If GetVolumeInformation Volume, vbNullString, 0, ByVal 0&, _ ByVal 0&, FSFlags, vbNullString, 0 If (FSFlags And FS_PERSISTENT_ACLS) = 0 Then CheckFileAccess = -1 Exit Function End If GetFileSecurity fileName, OWNER_SECURITY_INFORMATION Or GROUP_SECURITY_INFORMATION Or DACL_SECURITY_INFORMATION, 0, 0, SDSize If Err.LastDllError <> 122 Then CheckFileAccess = -1 'Rights not supported. Returning -1. Exit Function End If If SDSize = 0 Then Exit Function ReDim SecDesc(1 To SDSize) If GetFileSecurity(fileName, OWNER_SECURITY_INFORMATION _ Or GROUP_SECURITY_INFORMATION _ Or DACL_SECURITY_INFORMATION, _ SecDesc(1), SDSize, SDSize) = 0 Then Exit Function End If ImpersonateSelf SecurityImpersonation 'Adding Impersonation Token for thread OpenThreadToken GetCurrentThread(), TOKEN_QUERY, 0, hToken 'Opening of Token of current thread If hToken <> 0 Then GenMap.GenericRead = FILE_GENERIC_READ GenMap.GenericWrite = FILE_GENERIC_WRITE GenMap.GenericExecute = FILE_GENERIC_EXECUTE GenMap.GenericAll = FILE_ALL_ACCESS MapGenericMask DesiredAccess, GenMap AccessCheck SecDesc(1), hToken, DesiredAccess, GenMap, PrivSet, Len(PrivSet), CheckFileAccess, r CloseHandle hToken End If RevertToSelf End Function
上一篇:java的DBC接口设计[ 10-23 ]
下一篇:C语言的优先性和结合方向[ 10-23 ]
|