我使用Windows Azure的本地存储来存储临时文件。在那里,我调用一个。exe文件来转换同一本地存储文件夹中的其他几个文件。问题是我总是得到异常"访问路径XYZ.exe被拒绝"。
我应该提到以下几点:-我使用的是worker角色-在服务定义文件
中设置并尝试为我正在访问的文件夹添加权限:
public static void AddPermission(string absoluteFolderPath)
{
DirectoryInfo myDirectoryInfo = new DirectoryInfo(absoluteFolderPath);
DirectorySecurity myDirectorySecurity = myDirectoryInfo.GetAccessControl();
myDirectorySecurity.AddAccessRule(new FileSystemAccessRule(
"NETWORK SERVICE",
FileSystemRights.FullControl,
AccessControlType.Allow));
myDirectoryInfo.SetAccessControl(myDirectorySecurity);
}
更新:我现在试着用这段代码:
public static void FixPermissions()
{
var tempDirectory = RoleEnvironment.GetLocalResource("localStorage").RootPath;
Helper.addPermission(tempDirectory);
var dir = new DirectoryInfo(tempDirectory);
foreach (var d in dir.GetDirectories())
Helper.addPermission(d.FullName);
}
private static void addPermission(string path)
{
FileSystemAccessRule everyoneFileSystemAccessRule = new FileSystemAccessRule("Everyone",
FileSystemRights.FullControl,
InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
PropagationFlags.None, AccessControlType.Allow);
DirectoryInfo directoryInfo = new DirectoryInfo(path);
DirectorySecurity directorySecurity = directoryInfo.GetAccessControl();
directorySecurity.AddAccessRule(everyoneFileSystemAccessRule);
directoryInfo.SetAccessControl(directorySecurity);
}
我得到了一个非常奇怪的页面行为。我仍然得到错误,但有时有些文件被ffmpeg.exe文件转换。
有人能帮我一下吗?谢谢你。
解决方案:
所以问题似乎是我在本地存储中运行。exe文件,因此有给定的安全问题。将。exe放入应用程序并直接引用解决了我的问题。
谢谢你的帮助。
默认情况下,您的worker角色很可能没有足够的权限来允许更改Azure文件夹上的访问控制列表。
有两个可能的选项:
-
最好:在启动时运行脚本设置权限。详细信息请访问MSDN: http://msdn.microsoft.com/en-us/library/gg456327.aspx。你需要设置
executionContext="elevated"
。编写脚本本身的最佳方式是通过Powershell。这里有一个例子:http://weblogs.thinktecture.com/cweyer/2011/01/fixing-windows-azure-sdk-13-full-iis-diagnostics-and-tracing-bug-with-a-startup-task-a-grain-of-salt.html。或者,编写一个控制台应用程序来做同样的事情。
-
最简单,但不太安全:在你的
OnStart
方法中设置安全性,并提升运行你的整个worker角色:在你的服务定义文件中包含
<WebRole name="WebApplication2"> <Runtime executionContext="elevated" /> <Sites>
但是,我真的不建议这样做,因为对于在公共云上运行的东西来说,这是一个可怕的安全漏洞。