2009-12-06 60 views
1

我有一些旧的vb6代码,检查Windows目录是否可通过WRITING写入,然后读取值。有没有什么办法可以告诉Windows目录是否可写,而不需要写入测试?

但是...我们有,所以我要检查它不接触是在观看,作为可疑行为病毒扫描程序。

任何Windows API调用? (理想的Win 98以上版本)

+7

为什么它写入到Windows目录? – 2009-12-06 00:34:07

+1

在Windows 98中,文件系统中没有安全和访问控制,因此您可以放心地认为它是可写的。 – Joey 2009-12-06 00:40:01

回答

5

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

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

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

+0

程序本身处理异常就好了。这里的问题是*尝试*写入Win.ini触发病毒警告。 (尝试失败,程序正常进行,但我们不想吓唬用户:-) – 2009-12-06 02:46:52

+0

在这种情况下,我怀疑你的AV程序正在观看win.ini文件本身,而不是整个文件夹。 – 2009-12-06 13:53:26

+0

@Joel:好点。 – 2009-12-06 17:42:10

4

如果你有VB6代码,你应该花时间修复它,以便它根本不需要写入Windows目录,因为不管你是否是管理员 - 除非你在微软工作应该考虑该目录关闭限制。

但是,您应该考虑在Windows 98上,用户将始终有能力写入Windows目录。在Windows XP上,本地管理员将会。在Windows Vista和Seven上,即使管理员不会升级您的应用程序。

所以,你可以检查用户是否是在BUILTIN \管理员使用CheckTokenMembership内置的角色。对于非管理员或非升级的流程,这将是错误的。它并不能保证你可以写入Windows目录,但它将是正确的大部分的时间。然后,您可以为呼叫实际失败时添加错误处理逻辑。

但是,您应该再次修复代码并且不要使用Windows目录。

0

对于Windows 2000及以上的,你可以使用GetNamedSecurityInfo()和AccessCheck的(),但我想那是一个痛苦的从VB调用。

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 
+1

这没有捕获权限检查。此外,文件夹上的只读标志在写入其内容时不起作用。 – Deanna 2014-08-13 08:49:01

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 
相关问题