是否有任何方法可以告诉Windows目录是否可写,而无需实际写入以进行测试?

是否有任何方法可以告诉Windows目录是否可写,而无需实际写入以进行测试?,windows,vb6,file-io,Windows,Vb6,File Io,我有一些旧的vb6代码,通过写入Windows目录,然后读回一个值来检查该目录是否可写 但是。。。我们有一个病毒扫描器,它将这视为可疑行为,所以我想检查它,但不要触摸它 有Windows API调用过吗?(最适合Win 98及以上版本)这里需要记住的是文件系统是不稳定的。我能看到这段代码被使用的唯一方法是首先检查文件夹是否可写,然后尝试写一些你想写的东西。这里的问题是,对于易失性文件系统,在进行检查和尝试写入之间,情况可能会发生变化。因此,如果写入失败,您仍然必须能够处理异常。这意味着最初的检查

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

但是。。。我们有一个病毒扫描器,它将这视为可疑行为,所以我想检查它,但不要触摸它


有Windows API调用过吗?(最适合Win 98及以上版本)

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

此外,对于windows 2000及更高版本,仅当用户以管理员身份运行时,windows Direct才应该是可写的。很长一段时间以来,以管理员身份运行是一种常见的做法,但人们开始意识到这不是一个好主意。从长远来看,您的程序执行任何需要以这种方式运行的操作都不是一个好主意


事实上,从Windows Vista开始,默认情况下用户不会以管理员身份运行任何东西,即使登录到管理员帐户。相反,他们必须手动选择以管理员身份运行程序,或者等待安全检查失败,系统会提示他们升级。

如果您有VB6代码,你应该花些时间来修复它,这样它根本不需要写入Windows目录,因为不管你是否是一个管理员——除非你在微软工作,否则你应该考虑这个目录是不受限制的。

但是,您应该考虑在Windows 98上,用户将总是有能力写入Windows目录。在Windows XP上,本地管理员将。在WindowsVista和Seven上,即使是管理员也不会这样做,除非您的应用程序已升级

因此,您可以使用检查用户是否处于内置角色BUILTIN\Administrators中。对于非管理员或非提升进程,这将是错误的。它不能保证您可以写入Windows目录,但大多数情况下都是正确的。然后,您可以为调用实际失败时添加错误处理逻辑


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

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

这里有一个函数可以做到这一点。我很快从其他代码中修改了它,因此如果您使用它,您需要添加错误处理(例如,不存在的目录只返回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
函数folderisradonly(ByVal FolderSpec作为字符串)作为布尔值
长得一样
Dim udtW32FindD作为WIN32_FIND_数据
暗淡的长柄
Dim strFolder As String'设置为FolderSpec参数,以便我可以更改它
如果Len(FolderSpec)=0,则
folderisreadoly=False
退出功能
如果结束
strFolder=FolderSpec
如果右$(strFolder,1)“\”则
strFolder=strFolder&“\”
如果结束
strFolder=strFolder&“*”'添加通配符以允许查找共享根
lngFHandle=FindFirstFile(strFolder,udtW32FindD)
如果lngFHandle的句柄值无效,则
呼叫FindClose(lngFHandle)
folderisradonly=(udtW32FindD.dwFileAttributes和文件\属性\只读)=文件\属性\只读
如果结束
端函数

为什么要写入windows目录?在windows 98中,文件系统中没有安全和访问控制,因此您可以放心地假设它是可写的。程序本身可以很好地处理异常。这里的问题是,尝试写入Win.ini会触发病毒警告。(尝试失败,程序正常运行,但我们不想吓唬用户:-)在这种情况下,我怀疑您的AV程序正在监视win.ini文件本身,而不是整个folder.AV程序正在监视任何看起来像系统文件(win.ini、abc.dll等)的内容在\Windows directoryIMO中,您正在向Windows文件夹写入内容的事实是可疑的,并且被正确标记。此外,AV警告不一定会阻止您在那里写入内容,即使您可以在那里写入内容,也很可能会出现。(如果您不能,则可能永远不会到达AV检查的范围)。这不会捕获权限检查。此外,文件夹上的只读标志在写入其内容时不会起作用。
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