2009-12-06 66 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 
相關問題