有没有办法判断Windows目录是否可写而没有实际写入它进行测试?

时间:2009-12-06 00:32:15

标签: windows vb6 file-io

我有一些旧的vb6代码,通过WRITING检查Windows目录是否可写,然后再读回一个值。

但是......我们有一个病毒扫描程序,它将其视为可疑行为,因此我想检查它而不接触它。

是否有任何Windows API调用? (理想情况下适用于Win 98及以上版本)

5 个答案:

答案 0 :(得分:5)

这里要记住的是文件系统是不稳定的。关于我可以看到使用此代码的唯一方法是首先检查文件夹是否可写,然后尝试编写您想要编写的内容。这里的问题是,对于易失性文件系统,在您进行检查和尝试编写之间可能会发生变化。因此,如果写入失败,您仍然必须能够处理异常。这意味着初步检查几乎浪费了。最好将您的精力放在编写更好的异常处理程序上。

此外,对于Windows 2000及更高版本,如果用户以管理员身份运行,则Windows应该只能是可写的。作为管理员运行很长一段时间是常见的做法,但人们开始明白这不是一个好主意。从长远来看,你的程序做任何需要以这种方式运行的事情都不是一个好主意。

事实上,从Windows Vista开始,即使登录管理员帐户,用户也不会默认以管理员身份运行任何内容。相反,他们必须手动选择以管理员身份运行程序或等待安全检查以使系统无法提示它们提升。

答案 1 :(得分:4)

如果你有VB6代码,你应该花时间修复它,这样根本不需要写入Windows目录,因为无论你是否是管理员 - 除非你在Microsoft工作,你应该考虑该目录不受限制。

但是,您应该考虑在Windows 98上,用户始终可以写入Windows目录。在Windows XP上,本地管理员会。在Windows Vista和Seven上,除非你的应用程序被提升,否则管理员也不会。

因此,您可以使用CheckTokenMembership检查用户是否在内置角色BUILTIN \ Administrators中。对于非管理员或非提升的流程,这将是错误的。它不保证您可以写入Windows目录,但它将是大多数的时间。然后,您可以在呼叫实际失败时添加错误处理逻辑。

但是,您应该抓住机会修复代码,而不是使用Windows目录。

答案 2 :(得分:0)

对于Windows 2000及更高版本,您可以使用GetNamedSecurityInfo()和AccessCheck(),但我认为从VB调用是很痛苦的。

答案 3 :(得分:0)

这是一个可以做到的功能。我很快就从其他代码中调整了这个,所以如果你使用它,你需要添加错误处理,(例如一个不存在的目录只返回False。我不知道你的防病毒软件是否会喜欢这个与否。

Function FolderIsReadOnly(ByVal FolderSpec As String) As Boolean
   Dim rst As Long
   Dim udtW32FindD As WIN32_FIND_DATA
   Dim lngFHandle As Long
   Dim strFolder As String 'set to FolderSpec parameter so I can change it

   If Len(FolderSpec) = 0 Then
      FolderIsReadOnly = False
      Exit Function
   End If

   strFolder = FolderSpec
   If Right$(strFolder, 1) <> "\" Then
      strFolder = strFolder & "\"
   End If
   strFolder = strFolder & "*"   'add the wildcard allows finding share roots

   lngFHandle = FindFirstFile(strFolder, udtW32FindD)
   If lngFHandle <> INVALID_HANDLE_VALUE Then
      Call FindClose(lngFHandle)
      FolderIsReadOnly = (udtW32FindD.dwFileAttributes And FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY
   End If

End Function

答案 4 :(得分:0)

Function IsPathAccessible(ByVal sPath As String) As Boolean
    On Error GoTo ErrHandler

    FileSystem.SetAttr sPath, vbNormal
    IsPathAccessible = True
    Exit Function

ErrHandler:
    IsPathAccessible = False
End Function