2012-04-17 239 views
20

我有一行代碼檢查是否存在目錄,然後獲取其中的文件列表。Directory.Exists不適用於網絡路徑

System.IO.Directory.Exists(@"\\Server\Folder\"); 

我的作品時,我測試(從Visual Studio運行),但是當我部署的網站,它始終返回false。

我在另一個服務器(比如說Server2)上對另一個文件夾進行相同的驗證,並且它工作正常。

然後,我認爲這是一個訪問問題,但共享文件夾和網絡都可以訪問所有人...是否有另一個原因爲什麼它不起作用?

+6

是否帳戶IIS運行在訪問? – Matthew 2012-04-17 18:24:24

+0

是否無法取消引用'服務器'? – David 2012-04-17 18:25:41

回答

15

當您在Visual Studio中運行代碼時,它將在您的用戶權限下運行。

當您運行在IIS中它的應用程序池默認情況下是內置的用戶的身份運行的代碼「網絡服務」,這是不具有本地機器外部訪問本地用戶帳戶。

在網絡共享上的權利是第一層,之後在目錄中的NTFS權限檢查。

您需要具有同樣的權利,你的用戶更改應用程序池的標識域用戶。

+1

它的工作在我的本地IIS用於測試過,但設置了對應用程序的用戶,所以這是考慮我的本地Windows用戶連接到網絡。我將我的特定用戶設置爲官方服務器的IIS,並且它工作正常。謝謝。 – Amaranth 2012-04-17 19:36:50

3

我可能有點晚,但我發現,沒有對Directory類的這種方法的一個問題。 相反,我使用DirectoryInfo與模擬這種方式:

new DirectoryInfo(path).Exists 

這樣你避免整個身份變化問題,這是由我們的IT領域拒絕。

我希望這可以幫助別人!

+0

這不能解決模擬問題。主要區別在於'Directory'是一個靜態類,'DirectoryInfo'是一個類的實例。 – 2016-06-30 16:04:02

1

以備將來參考,這也適用:

bool result = false; 
try 
{ 
    Directory.GetAccessControl(path); 
    result = true; 
} 
catch (UnauthorizedAccessException) 
{ 
    result = true; 
} 
catch 
{ 
    result = false; 
}