【问题标题】:How to modify folder permissions in a web setup project?如何在 Web 设置项目中修改文件夹权限?
【发布时间】:2009-10-28 20:18:14
【问题描述】:

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

【问题讨论】:

    标签: asp.net installation web-setup-project


    【解决方案1】:

    方法是创建一个派生自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);
        }
    }
    

    【讨论】:

    • 感谢您提供完整的代码示例,节省了大量时间。我在执行此操作时学到了两件事:1)如果您在 TARGETDIR 中有空格,则需要像这样传递它: /targetdir="[TARGETDIR]\" 当然尝试引号很明显,但仅转义并不明显最后一个! (msdn.microsoft.com/en-us/library/2w2fhwzz%28VS.80%29.aspx) 我学到的另一件事是,要调试一个动作,可以很方便地像这样中断和附加调试器:System.Diagnostics.Debugger.Launch();
    猜你喜欢
    • 2016-05-16
    • 2012-03-02
    • 2012-08-23
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2015-03-30
    • 2015-09-13
    • 1970-01-01
    相关资源
    最近更新 更多