關鍵字:WebRole
1. 背景
Web應用程式需要讀取和寫入該專案下的檔案的許可權。
在預設情況下,W3wp.exe 和WaIISHost.exe的執行賬號是Network Service,而Network Service 的對檔案的訪問權只有讀取許可權。
所以要讀取和更改web站點下的檔案,需要提升IIS對該檔案的訪問許可權,也就是提高Network Service賬號的訪問該檔案的許可權。
2. 解決辦法
首先我們會想到在ServiceDefinition.cscfg配置檔案加上提升許可權的配置。如:
<WebRole name="WebRole1" vmsize="Small">
<Runtime executionContext="elevated"/>
這裡提升的是部署WebRole的許可權。
但是要知道,不管怎麼提升,w3wp這個程式在webrole裡面始終以Network Service 來執行,所以這種配置是無效的。
http://technet.microsoft.com/en-us/library/cc771170(v=ws.10).aspx
從上述文件中知道,
如果執行在一個具有很高許可權的賬號下Application pool會有安全風險的
文章Startup Lifecycle of a Windows Azure Role告訴我們不能在部署Startup task中來更改Network Service的許可權,因為這個時候IIS Application Pool 還沒有生成。
我們可以更改檔案的訪問許可權,這個是跟IIS配置無關的。也就是上面貼圖中network service的許可權列表。
1)編寫Startup.cmd
set filePath=%RoleRoot%\sitesroot\0\App_Data\mycompactdb.sdf
ModifyFileSecurity.exe "%filePath%" "NETWORK SERVICE"
EXIT /B 0
2)編寫ModifyFileSecurity
ModifyFileSecurity.exe
class Program
{
static void Main(string[] args)
{
if (args.Length == 2)
{
string fileName = args[0];
string account = args[1];
AddFileSecurity(fileName, account, FileSystemRights.Modify, AccessControlType.Allow);
}
}
public static void AddFileSecurity(string fileName, string account,
FileSystemRights rights, AccessControlType controlType)
{
// Get a FileSecurity object that represents the
// current security settings.
FileSecurity fSecurity = File.GetAccessControl(fileName);
// Add the FileSystemAccessRule to the security settings.
fSecurity.AddAccessRule(new FileSystemAccessRule(account,
rights, controlType));
// Set the new access settings.
File.SetAccessControl(fileName, fSecurity);
}
}
當然我們也可以編寫Powershell 命令SET-ACL來辯解訪問檔案的訪問許可權
http://technet.microsoft.com/en-us/library/hh849810.aspx
http://technet.microsoft.com/en-us/library/ff730951.aspx
http://blogs.msdn.com/b/johan/archive/2008/10/01/powershell-editing-permissions-on-a-file-or-folder.aspx
How to update role code in startup task.