2009-10-28 83 views

回答

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); 
    } 
} 
+0

您节省了一大堆时间。谢谢一堆! – kakopappa

+3

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