如何修改Web设置项目中的文件夹权限?

Dan*_*fer 4 asp.net installation web-setup-project

我正在使用Web安装项目来安装我的ASP.NET应用程序,该应用程序需要写入主虚拟目录文件夹下的文件夹.如何配置安装项目以授予ASPNET用户对该文件夹的权限?

Dan*_*fer 6

这样做的方法是创建一个派生自的类System.Configuration.Install.Installer.覆盖该Install()方法.以下是更改目录和文件权限的示例,您可能不希望如此宽容,但这取决于您的安全上下文.为了使其工作,安装项目必须将其作为自定义操作运行.从该类所在的任何项目中添加"主要输出".您还需要将该目录传递给其属性中的自定义操作.第一个变量名必须与代码匹配.像这样:/targetdir="[TARGETDIR]\"

[RunInstaller(true)]
public partial class SetPermissions : Installer
{
    private const string STR_targetdir = "targetdir";
    private const string STR_aspnetUser = "ASPNET";

    public SetPermissions()
    {
        InitializeComponent();
    }

    public override void Install(IDictionary stateSaver)
    {
        base.Install(stateSaver);

        Context.LogMessage(
            Context.Parameters
                .Cast<DictionaryEntry>()
                .Select(entry => String.Format("String = {0} Value = {1}", entry.Key, entry.Value))
                .Aggregate(new StringBuilder("From install\n"), (accumulator, next) => accumulator.AppendLine(next))
                .ToString()
        );

        string targetDir = Context.Parameters[STR_targetdir];
        string dbDir = Path.Combine(targetDir, "db");

        AddFullControlPermissionToDir(dbDir, STR_aspnetUser);
        string rimdbSqliteFilename = Path.Combine(dbDir, "db.sqlite");
        AddFullControlPermissionToFile(rimdbSqliteFilename, STR_aspnetUser);
        string logsDir = Path.Combine(targetDir, "logs");
        AddFullControlPermissionToDir(logsDir, STR_aspnetUser);
    }

    private static void AddFullControlPermissionToDir(string dir, string user)
    {
        DirectorySecurity directorySecurity = Directory.GetAccessControl(dir);
        directorySecurity.AddAccessRule(
            new FileSystemAccessRule(
                user,
                FileSystemRights.FullControl,
                InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit,
                PropagationFlags.None,
                AccessControlType.Allow));
        Directory.SetAccessControl(dir, directorySecurity);
    }

    private static void AddFullControlPermissionToFile(string filename, string user)
    {
        FileSecurity fileSecurity = File.GetAccessControl(filename);
        fileSecurity.AddAccessRule(
            new FileSystemAccessRule(
                user,
                FileSystemRights.FullControl,
                AccessControlType.Allow));
        File.SetAccessControl(filename, fileSecurity);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提供完整的代码示例,节省了大量时间.我在实现这个动作时学到了两件事:1)如果你在TARGETDIR中有空格,你需要像这样传递它:/ targetdir ="[TARGETDIR] \"当然,尝试引号很明显,但不明显只能逃避最后一个!(http://msdn.microsoft.com/en-us/library/2w2fhwzz%28VS.80%29.aspx)我学到的另一件事是调试一个动作,它可以方便地打破并附加调试器,如下所示:System .Diagnostics.Debugger.Launch(); (3认同)