Domanda

Sto usando un progetto di installazione web per installare la mia app ASP.NET che deve scrivere in una cartella esistente nella cartella principale della directory virtuale. Come configuro il progetto di installazione per concedere le autorizzazioni utente ASPNET a quella cartella?

È stato utile?

Soluzione

Il modo per farlo è creare una classe derivata da System.Configuration.Install.Installer . Sostituisci il metodo Install () . Di seguito è riportato un esempio che modifica le autorizzazioni per una directory e un file, probabilmente non si desidera essere così permissivi, ma dipende dal contesto di sicurezza. Affinché ciò funzioni, il progetto di installazione deve eseguirlo come un'azione personalizzata. Aggiungi l '"Uscita principale" da qualunque progetto si trovi in ??questa classe. Dovrai anche passare la directory all'azione personalizzata nelle sue proprietà. Il nome della prima variabile deve corrispondere al codice. In questo modo: /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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top