使用C#控制台应用程序为IIS应用程序池设置文件夹权限

时间:2016-11-14 11:13:41

标签: c#

我想以编程方式为用户(即IIS应用程序池)设置文件夹权限,如:

string websiteDict = @"C:\inetpub\wwwroot\mywebsite";
DirectoryInfo di = new DirectoryInfo( websiteDict );
DirectorySecurity ds = di.GetAccessControl();

ds.SetAccessRule( new FileSystemAccessRule( @"IIS AppPool\myAppPool", FileSystemRights.FullControl,
AccessControlType.Allow ) );

di.SetAccessControl( ds );

上述规则添加的用户(myAppPool)没有权利,允许栏中没有任何内容(请参阅属性标签标签对话框)甚至我设置了完全访问控制。

我以管理员身份运行可执行程序,但同样的事情。

为什么?

2 个答案:

答案 0 :(得分:0)

我检查了我的服务器,并且池没有直接显示为我可以在Windows下分配的组。

在您的情况下,“IIS AppPool \ myAppPool”可能无法作为安全组用于Windows。如果没有,则无法将其应用于权限。

答案 1 :(得分:0)

我遇到了同样的问题-我成功设置了IIS APPPOOL的权限(在我的情况下-修改,我强烈建议您使用它而不是完全控制,除非您的应用程序池确实需要更改这些文件夹中文件的所有权)。但是,当我在文件系统中选中它时,我注意到该应用程序池未显示任何复选框。

仔细查看后,我注意到有一个特殊权限复选框(您必须向下滚动权限列表中的一项)。然后,我单击“高级”按钮,打开了我的apppool的权限,并意识到它确实具有“修改”权限,但是未配置任何权限继承。如果我将“适用于”字段手动设置为“此文件夹,子文件夹和文件”,则所有预期的复选框都会出现在应有的位置。

要将“适用于”设置为“此文件夹,子文件夹和文件”,您必须添加三个ACL规则,而不是一个,就像这样:

var pathToGrantRights = fs.Path.Combine(Folder, "App_Data");
fs.Directory.CreateDirectory(pathToGrantRights);
var acl = fs.Directory.GetAccessControl(pathToGrantRights);

string acc = $"IIS APPPOOL\\{webapp.ApplicationPoolName}";
acl.AddAccessRule(new FileSystemAccessRule(acc, FileSystemRights.Modify, AccessControlType.Allow));
acl.AddAccessRule(new FileSystemAccessRule(acc, FileSystemRights.Modify, InheritanceFlags.ContainerInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
acl.AddAccessRule(new FileSystemAccessRule(acc, FileSystemRights.Modify, InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
fs.Directory.SetAccessControl(pathToGrantRights, acl);

当您添加对象本身之外的文件夹和文件的继承时,它将开始正常工作。