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

3
我希望你能够编写程序来设置文件夹权限,以便让一个用户(即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)通过上述规则添加的问题是没有权限的,在“允许”列中没有任何选择(请参见“属性”对话框的“安全”选项卡),即使我设置了完全访问控制。
我以管理员身份运行可执行程序,但是同样的情况。
为什么?

如果您尝试手动执行此操作,您的计算机是否接受“IIS AppPool\myAppPool”组/用户名? - BugFinder
2个回答

2
我遇到了同样的问题 - 我成功地为IIS 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);

当你为文件夹和文件添加继承权限时,它会开始正常工作。

0

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

在您的情况下,“IIS AppPool\myAppPool”可能无法作为安全组提供给Windows使用。如果不是这样,它就无法应用到权限上。


我在生产环境中尝试了一下,用户已存在,但仍然没有完成“允许”复选框...出了什么问题? - Snake Eyes
我手动尝试过,可以运行。但如果通过C#来运行,即使以管理员身份启动控制台也无法运行。 - Snake Eyes
好的,那是一个不错的开始 - 让我找一些代码,我整天都在接电话,与完全无关的事情有关,可能不能做太多...但是...我会看看我能找到什么。我确实记得一些东西... - BugFinder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接