2016-02-02 47 views
1

我將內部Web應用程序部署到服務器A,並在創建服務器B上的網絡驅動器時出錯。如果我在本地運行,則成功在服務器B上創建文件。。部署後出現未經授權的訪問異常

System.UnauthorizedAccessException:對路徑'\\ b \ folder \ test.pdf'的訪問被拒絕。

應用程序池的標識是networkservice。而且我對服務器B上的目標文件夾進行了networkservice完全控制。我甚至給出了Everyone完全控制權,但仍然出現錯誤。

服務器A運行.NET 7.5。代碼創建文件:

var byteArray = generateArray(); 
var destination = "\\\\b\\folder\\test.pdf"; 
try { 
    var destinationFile = new FileInfo(destination); 
    if (destinationFile.Exists) { 
     destinationFile.Delete(); 
    } 
    System.IO.File.WriteAllBytes(destination, byteArray); 
} catch (UnauthorizedAccessException) { 
    // 
} 

我看到有人得到了完全相同的問題here。但它沒有解決我的問題。

解決方案: 我將身份更改爲管理員帳戶,而不是將network service用於應用程序池。它有效,但我不完全明白它爲什麼起作用。由於A上的網絡服務不同於B上的網絡服務?

+0

您是否嘗試模擬服務器B的用戶或管理員? – Pikoh

+1

「網絡服務」對每臺服務器都是唯一的,因此一臺機器上的「網絡服務」與另一臺機器上的「網絡服務」不同。但是,這不在重點。 「網絡服務」實際上正在做一些完全不同的事情。當應用程序池作爲「網絡服務」運行時,它實際上是通過Active Directory身份驗證中的*計算機名稱進行身份驗證的。所以如果你的機器被命名爲'WEB1',那麼它就會對'$ WEB1'進行驗證 –

回答

0

即使您向所有人提供訪問權限,某些應用程序也必須獲得特定權限。這是Window's Vista中引入的UAC系統的一部分。此舉旨在提高安全性,因此應用程序無法在任何用戶下運行,並且基本上具有完全訪問權限。

你應該做的,是在目錄中提供以下訪問:

IIS AppPool\NameOfAppPool 

,將提供特定的訪問到託管Web應用程序到該目錄下,IIS將能夠正確操作的目錄。一些代碼,你可以實現以幫助驗證您寫入或讀取之前,將是:

public static bool ValidateIOPermission(string path) 
{ 
    try 
    { 
      if(Directory.Exist(path)) 
       return true; 

      else { Directory.CreateDirectory(path); } 
    } 

    catch(Exception ex) { return false; } 
} 

上面的代碼是一個小樣本,基本上嘗試執行的動作和捕獲異常,你知道,如果你有辦法訪問與否。