2012-02-01 33 views
4

我已經安裝了Windows服務作爲本地系統帳戶,偶爾它會在機器上生成一個目錄列表。它在Windows 7下的c:\ users ...目錄下失敗。我檢查了這些文件夾,它們似乎處於系統帳戶的完全控制之下。爲什麼我無法訪問這些目錄?作爲系統無法訪問的Windows服務正在運行C: users

System.UnauthorizedAccessException: Access to the path 'C:\Users\Public\Documents\My   Videos' is denied. 
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
at System.IO.Directory.InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption) 
at System.IO.Directory.GetDirectories(String path, String searchPattern, SearchOption searchOption) 
at LS.Core.Backup.DirectoryMapper.GetDirectories(String SeedDir, Int32 Count) 

更新:

詳情見下面我的回答,但我也貼我用來解決這個問題的類。請參閱GitHub Gist - DirectoryHelper

+0

是否有'InnerException'?請發佈完整的例外跟蹤。另外,你打電話什麼功能?你的程序有什麼特權? – cyanic 2012-02-01 02:25:15

+0

我已經添加了堆棧跟蹤,不幸的是沒有內部異常。我作爲SYSTEM帳戶運行,所以不應該讓我訪問整個驅動器? – 2012-02-01 02:29:52

+0

如果例外包括'HResult'字段,請查看它是什麼。從我可以告訴MSDN文檔(http://msdn.microsoft.com/en-us/library/system.exception.hresult.aspx),它應該是相同的HRESULT本地Windows調用將返回。同樣如Grant H.所說,嘗試Process Monitor。如果未設置'HResult',則可以看到Process Monitor的代碼。 – cyanic 2012-02-01 02:42:14

回答

1

所以我弄成這樣回答自己。問題在於使用Directory.GetFiles()Directory.GetDirectories()。在Windows 7中,使用這些方法時,在C:\ Users ...樹下搜索時會遇到交叉點和/或硬鏈接,因爲爲了與XP生成的應用程序向後兼容,添加了交接點。當您嘗試讀取這些連接點之一(以防止這些連接點的安排中可能存在無限循環)時,MS會觸發UnauthorizedAccessException,並且它會導致整個撥號失敗,不會返回任何內容.或GetDirectories()調用失敗。作爲一種解決方案,我實現了一個http://tom-shelton.net/index.php/2010/01/02/using-extension-methods-and-the-win32-api-to-efficiently-enumerate-the-file-system/的變體,它將逐個迭代文件,允許您在遇到連接點時繼續處理異常。很愚蠢的問題,希望它可以幫助別人。

0

使用Sysinternals(Microsoft Technet)的工具(如Process Monitor)監視更具體的錯誤詳細信息。這個信息可能會讓人產生誤解。 「訪問被拒絕」錯誤的一些常見條件包括打開的文件和防病毒軟件。

+0

謝謝,但是這臺機器沒有防病毒功能,並且它對c:\ users \ branch下的任何和所有目錄都這樣做,所以它看起來像是某種形式的安全問題。 – 2012-02-01 02:25:16

1

正如你在一個想法發佈我的想法,我想我會返回的青睞。是的,我知道你找到了一個解決方案已經....

我用從MSDN這個迭代搜索的變化 - Iterate Through a Directory Tree

這可以讓你在你的錯誤處理提示的海拔特權,如果你這樣想可以訪問未經授權的文件或文件夾。

希望它有幫助。

乾杯,

相關問題