static void

AccessForm

This is the ugly UI for the batch file access permissions utility. You need to be an administrator to do this sort of thing, so add an application manifest file (app.manifest) and set the requestedExecutionLevel level="requireAdministrator" to true.

Did I mention it was ugly?

using System;
using System.ComponentModel;
using System.IO;
using System.Security.Principal;
using System.Windows.Forms;
 
namespace FilePermissions
{
    public partial class AccessForm : Form
    {
        private string _userName;
 
        public AccessForm()
        {
            InitializeComponent();
            errorProvider1.Clear();
        }
 
        private void AccessForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            Properties.Settings.Default.Save();
        }
 
        private void AccessForm_Load(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtFolder.Text))
            {
                txtFolder.Text =
                    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            }
            if (string.IsNullOrEmpty(txtUser.Text))
            {
                var myIdentity = WindowsIdentity.GetCurrent();
                txtUser.Text =
                    myIdentity != null ? myIdentity.Name : Environment.UserDomainName;
            }
            cmbPermission.SelectedIndex = 0;
 
            var isAdmin = new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator);
            labIsAdministrator.Text = "You are running as " +
                (isAdmin ? "administrator" : "a non-administrator- this may not work!");
        }
        private void btnRun_Click(object sender, EventArgs e)
        {
            var path = txtFolder.Text.Trim();
            if (string.IsNullOrEmpty(path) || txtUser.Text == string.Empty)
            {
                return;
            }
            _userName = txtUser.Text.Trim();
            //you could also put this in a background worker
            var accessWriter =
                new AccessReaderWriter(
                    _userName,
                    path,
                    AccessReaderWriter.FileSystemRights(cmbPermission.SelectedItem.ToString()));
            accessWriter.Reverse = chkReverse.Checked;
            accessWriter.Message += ShowStatus;
            if (radApply.Checked)
            {
                accessWriter.Write();
            }
            else
            {
                accessWriter.Read();
            }
        }
 
        private void ShowStatus(object sender, GenericEventArgs<string> e)
        {
            var s = e.Data + Environment.NewLine + label1.Text;
            if (s.Length > 1000) s = s.Substring(0, 1000);
            label1.Text = s;
            label1.Refresh();
        }
 
        #region UI
 
 
        private void btnFindFolder_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.SelectedPath = (string.IsNullOrEmpty(txtFolder.Text)) ?
                txtFolder.Text : Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
            var result = folderBrowserDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                txtFolder.Text = folderBrowserDialog1.SelectedPath;
            }
        }
 
        private void txtFolder_Validating(object sender, CancelEventArgs e)
        {
            var error = string.Empty; //clears error provider
            var path = txtFolder.Text.Trim();
            if (string.IsNullOrEmpty(path))
            {
                error = "Folder must be entered";
                e.Cancel = true;
            }
            else
            {
                var di = new DirectoryInfo(path);
                if (!di.Exists)
                {
                    error = "Folder must exist";
                    e.Cancel = true;
                }
            }
            errorProvider1.SetError((Control)sender, error);
        }
 
        private void txtUser_Validating(object sender, CancelEventArgs e)
        {
            if (txtUser.Text.Trim() == string.Empty)
            {
                e.Cancel = true;
                return;
            }
        }
        #endregion
 
        #region Designer
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.IContainer components = null;
 
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }
 
        #region Windows Form Designer generated code
 
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.btnRun = new System.Windows.Forms.Button();
            this.label1 = new System.Windows.Forms.Label();
            this.chkReverse = new System.Windows.Forms.CheckBox();
            this.cmbPermission = new System.Windows.Forms.ComboBox();
            this.txtUser = new System.Windows.Forms.TextBox();
            this.txtFolder = new System.Windows.Forms.TextBox();
            this.btnFindFolder = new System.Windows.Forms.Button();
            this.folderBrowserDialog1 = new System.Windows.Forms.FolderBrowserDialog();
            this.errorProvider1 = new System.Windows.Forms.ErrorProvider(this.components);
            this.labIsAdministrator = new System.Windows.Forms.Label();
            this.radCheck = new System.Windows.Forms.RadioButton();
            this.radApply = new System.Windows.Forms.RadioButton();
            ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).BeginInit();
            this.SuspendLayout();
            //
            // btnRun
            //
            this.btnRun.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.btnRun.Location = new System.Drawing.Point(12, 105);
            this.btnRun.Name = "btnRun";
            this.btnRun.Size = new System.Drawing.Size(681, 23);
            this.btnRun.TabIndex = 0;
            this.btnRun.Text = "Run";
            this.btnRun.UseVisualStyleBackColor = true;
            this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
            //
            // label1
            //
            this.label1.AutoSize = true;
            this.label1.Location = new System.Drawing.Point(13, 131);
            this.label1.Name = "label1";
            this.label1.Size = new System.Drawing.Size(0, 13);
            this.label1.TabIndex = 2;
            //
            // chkReverse
            //
            this.chkReverse.AutoSize = true;
            this.chkReverse.Location = new System.Drawing.Point(309, 81);
            this.chkReverse.Name = "chkReverse";
            this.chkReverse.Size = new System.Drawing.Size(66, 17);
            this.chkReverse.TabIndex = 4;
            this.chkReverse.Text = "Reverse";
            this.chkReverse.UseVisualStyleBackColor = true;
            //
            // cmbPermission
            //
            this.cmbPermission.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
            this.cmbPermission.FormattingEnabled = true;
            this.cmbPermission.Items.AddRange(new object[] {
            "Read",
            "Modify",
            "FullControl"});
            this.cmbPermission.Location = new System.Drawing.Point(12, 26);
            this.cmbPermission.Name = "cmbPermission";
            this.cmbPermission.Size = new System.Drawing.Size(121, 21);
            this.cmbPermission.TabIndex = 0;
            //
            // txtUser
            //
            this.txtUser.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::FilePermissions.Properties.Settings.Default, "TargetUser", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
            this.errorProvider1.SetError(this.txtUser, "User must not be empty");
            this.txtUser.Location = new System.Drawing.Point(12, 79);
            this.txtUser.Name = "txtUser";
            this.txtUser.Size = new System.Drawing.Size(282, 20);
            this.txtUser.TabIndex = 3;
            this.txtUser.Text = global::FilePermissions.Properties.Settings.Default.TargetUser;
            this.txtUser.Validating += new System.ComponentModel.CancelEventHandler(this.txtUser_Validating);
            //
            // txtFolder
            //
            this.txtFolder.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
                        | System.Windows.Forms.AnchorStyles.Right)));
            this.txtFolder.DataBindings.Add(new System.Windows.Forms.Binding("Text", global::FilePermissions.Properties.Settings.Default, "TopFolder", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
            this.errorProvider1.SetError(this.txtFolder, "Invalid path");
            this.txtFolder.Location = new System.Drawing.Point(12, 53);
            this.txtFolder.Name = "txtFolder";
            this.txtFolder.Size = new System.Drawing.Size(636, 20);
            this.txtFolder.TabIndex = 1;
            this.txtFolder.Text = global::FilePermissions.Properties.Settings.Default.TopFolder;
            this.txtFolder.Validating += new System.ComponentModel.CancelEventHandler(this.txtFolder_Validating);
            //
            // btnFindFolder
            //
            this.btnFindFolder.Location = new System.Drawing.Point(664, 53);
            this.btnFindFolder.Name = "btnFindFolder";
            this.btnFindFolder.Size = new System.Drawing.Size(29, 20);
            this.btnFindFolder.TabIndex = 5;
            this.btnFindFolder.Text = "...";
            this.btnFindFolder.UseVisualStyleBackColor = true;
            this.btnFindFolder.Click += new System.EventHandler(this.btnFindFolder_Click);
            //
            // errorProvider1
            //
            this.errorProvider1.ContainerControl = this;
            //
            // labIsAdministrator
            //
            this.labIsAdministrator.AutoSize = true;
            this.labIsAdministrator.Location = new System.Drawing.Point(16, 7);
            this.labIsAdministrator.Name = "labIsAdministrator";
            this.labIsAdministrator.Size = new System.Drawing.Size(0, 13);
            this.labIsAdministrator.TabIndex = 6;
            //
            // radCheck
            //
            this.radCheck.AutoSize = true;
            this.radCheck.Checked = true;
            this.radCheck.Location = new System.Drawing.Point(152, 26);
            this.radCheck.Name = "radCheck";
            this.radCheck.Size = new System.Drawing.Size(113, 17);
            this.radCheck.TabIndex = 8;
            this.radCheck.TabStop = true;
            this.radCheck.Text = "Check permissions";
            this.radCheck.UseVisualStyleBackColor = true;
            //
            // radApply
            //
            this.radApply.AutoSize = true;
            this.radApply.Location = new System.Drawing.Point(271, 25);
            this.radApply.Name = "radApply";
            this.radApply.Size = new System.Drawing.Size(186, 17);
            this.radApply.TabIndex = 9;
            this.radApply.Text = "Apply permissions (requires Admin)";
            this.radApply.UseVisualStyleBackColor = true;
            //
            // AccessForm
            //
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.ClientSize = new System.Drawing.Size(714, 278);
            this.Controls.Add(this.radApply);
            this.Controls.Add(this.radCheck);
            this.Controls.Add(this.labIsAdministrator);
            this.Controls.Add(this.btnFindFolder);
            this.Controls.Add(this.chkReverse);
            this.Controls.Add(this.txtUser);
            this.Controls.Add(this.label1);
            this.Controls.Add(this.txtFolder);
            this.Controls.Add(this.btnRun);
            this.Controls.Add(this.cmbPermission);
            this.Name = "AccessForm";
            this.Text = "File Permissions";
            this.Load += new System.EventHandler(this.AccessForm_Load);
            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.AccessForm_FormClosing);
            ((System.ComponentModel.ISupportInitialize)(this.errorProvider1)).EndInit();
            this.ResumeLayout(false);
            this.PerformLayout();
 
        }
 
        #endregion
 
        private ComboBox cmbPermission;
        private Button btnRun;
        private CheckBox chkReverse;
        private Label label1;
        private TextBox txtFolder;
        private TextBox txtUser;
        private Button btnFindFolder;
        private FolderBrowserDialog folderBrowserDialog1;
        private ErrorProvider errorProvider1;
        private Label labIsAdministrator;
        private RadioButton radApply;
        private RadioButton radCheck;
        #endregion
    }
}