我在Windows Azure上使用本地存储来存储临时文件。在那里,我调用.exe文件来转换同一本地存储文件夹中的其他几个文件。问题是我总是得到异常“访问路径XYZ.exe被拒绝。”。
我应该提到以下内容: - 我正在使用工人角色 - 在服务定义文件中设置
并尝试为我正在访问的文件夹添加权限:
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文件转换。
有人能帮帮我吗?
非常感谢。
SOLUTION:
所以似乎问题是我在本地存储中运行.exe文件,因此遇到了给定的安全问题。将.exe放入应用程序并直接引用解决了我的问题。
感谢您的帮助。
答案 0 :(得分:3)
默认情况下,您的辅助角色很可能无法以足够的权限运行,以允许更改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
方法中设置安全性,并提升整个工作人员角色:在服务定义文件中包含
<WebRole name="WebApplication2"> <Runtime executionContext="elevated" /> <Sites>
但是,我真的不建议这样做,因为它对于在公共云中运行的东西来说是一个可怕的安全漏洞。