Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to give Read/Write permissions to a Folder during installation using .NET

I have a Setup project that I have build using Visual Studio 2010.

The installer works fine in terms of installing the application and all its dependencies into their proper sub directories and Program Data directories.

However, I noticed that each directory (the root folder and all of its sub directories) that the installer created does not give "Write" permissions. The only permissions that are added to the directories for the "Users" group are:

  • Read & Execute
  • List folder contents
  • Read

This, apparent default permissions setting, will happen regardless if the user installs the application as "Administrator" or not.

It seems odd to me that the installer doesn't give "Write" permissions to a folder that is being used by the application that is getting installed - It's even more confusing that the folder that the installer creates in the ProgramData folder for the application's database doesn't get "Write" permissions.

My question is, is there a way to configure the Setup project so that if and when it creates a folder, we can tell it what type of permissions to give it and to whom. In my case, I need give the root directory (of the application) and all of its sub directories, and the folder that is placed in the ProgramData folder "Read/Write" permissions for the "Users Group". Technically, I'm cool with giving the dirs "Full Control" to the "Users Group".

like image 383
Jed Avatar asked Sep 02 '11 19:09

Jed


People also ask

How can I give permission to a folder in C#?

To grant directory rights that inherit "normally" (i.e. propagate to subdirectories and all files), use the following values for InheritanceFlags and PropagationFlags: InheritanceFlags. ContainerInherit | InheritanceFlags. ObjectInherit and PropagationFlags. None .

How can I give permission to a file in C#?

FileSecurity fSecurity = File. GetAccessControl(fileName); // Add the FileSystemAccessRule to the security settings. fSecurity. AddAccessRule(new FileSystemAccessRule(account, rights, controlType)); // Set the new access settings.


1 Answers

I guess my other post was deleted for being a little too general, so I've refined it below:

The thing to do is make a custom action. It's pretty straightforward, check out the MSDN walkthrough for writing a C# custom action here. You'll put your permission-changing code inside the Install method:

Follow the first few steps from the link to get a new installer project referenced from your installer solution. You have to do it this way, so you can build a dll that is called at the end of installation.

Actually setting read/write privileges for Users was a little trickier, and the closest I could get was to set for Authenticated Users. I cobbled together a few other solutions I found on the Internet to come up with this:

public override void Install(IDictionary stateSaver) {     // This gets the named parameters passed in from your custom action     string folder = Context.Parameters["folder"];      // This gets the "Authenticated Users" group, no matter what it's called     SecurityIdentifier sid = new SecurityIdentifier(WellKnownSidType.AuthenticatedUserSid, null);      // Create the rules     FileSystemAccessRule writerule = new FileSystemAccessRule(sid, FileSystemRights.Write, AccessControlType.Allow);      if (!string.IsNullOrEmpty(folder) && Directory.Exists(folder))     {         // Get your file's ACL         DirectorySecurity fsecurity = Directory.GetAccessControl(folder);          // Add the new rule to the ACL         fsecurity.AddAccessRule(writerule);          // Set the ACL back to the file         Directory.SetAccessControl(folder, fsecurity);     }      // Explicitly call the overriden method to properly return control to the installer     base.Install(stateSaver); } 

Then, when you create your custom action, edit its properties, and add something like this under the CustomActionData property:

/folder="[CommonAppDataFolder][ProductName]" 
like image 72
ACK_stoverflow Avatar answered Sep 22 '22 06:09

ACK_stoverflow