Create a File Attributes Changer / Locker in a C# Windows Application

I made this project because my friends wanted creepy software like this one. In this project I have created not a file locker but a user friendly file attributes changer. I have used two cmd commands.

Command 1 : To hide or unhide

ATTRIB [+A | -A ] [+S | -S] [+H | -H] [[drive:] [path] filename] [/S [/D]]

+ Sets an attribute.
- Clears an attribute.
R Read-only file attribute.
A Archive file attribute.
S System file attribute.
H Hidden file attribute.
/S Processes files in all directories in the specified path.
/D Process folders as well.

Command 2 : To change the security access

ICACLS (don't know the full-form)

Code icacls "path/file.ext" /t /deny or grant username : (f)
/T Traverse all subfolders to match files/directories

(f) full control
/deny the user particular rights

Name = demo
Password = pass

Always run as administrator and it always will be.

Caution Warning

  1. I cannot guarantee a robust application but I have tried and tested it many time in Windows 7.
  2. Recovery key is the file version 51350.73.4970.938 with dash 51350-73-4970-938
  3. Last but not the least I cannot be held responsible for any loss of data/monetary.
  4. The best way is for you try it first on a demo file.
  5. If you trust it then try it on main stuff.
  6. I trust your intellectual capabilities and because of that you can overcome any problem.

Troubleshooting

  1. If anything went wrong run these code in run window
  2. Including double quotes and *.* for all file and folder
  3. Attrib /s /d -h -s "C:/path/*.*"
  4. icacls "C:/path/*.*" /t /grant everyone:f
  5. Access denied means you don't have rights to change the attributes; first unblock it.
  6. Drawbacks are that you can enter only one file name in the file name box.

Example : my.mp3 (correct)
Example : my.mp3,you.mp3,all.docx (wrong) 

Read The Read me file properly


Ok that was the basic info needed to start. We will require three forms.

Application flow diagram

Login->username & pass or recovery->Main page->if recovery was used->recovery window.

Image1.gif

Main page

browsertextbox = readonly
filenametxtbox = nochanges
richtextbox=readonly
filebrowersdialog
statustrip=nochanges
4 buttons = nochanges
 

Code()

using System.IO;
namespace
 Locker
{
    public partial class mainpg : Form
    {
        public mainpg()
        {
            InitializeComponent();
        }

        //some variable we will need path and file  
        string path, file;
        
// the variable which will tell that the recovery is used      
        Login l1 = new Login(); 
 

        //the imp method which will do all the work

        //parameter command and diretor (used for directory list just to diffrentiate the commands)

        //1 for directory list and 0 for other methods

        public void cmdproc(string cmd, int dir)
        {

            //which process tho start with which command

            Process.Start("CMD.exe", cmd);
 

            //just to hide the black window and get any errors from the cmd.exe       

            Process proc = new Process();
            ProcessStartInfo info = new ProcessStartInfo();
            info.RedirectStandardOutput = true;
            info.CreateNoWindow = true;
            info.UseShellExecute = false;
            info.FileName = "cmd.exe";
            info.Arguments = cmd;
            proc.StartInfo = info;

            //now the process starts
            proc.Start();
            
//dir is used to diffrentiate the message which is going to be displayed
            if (dir == 1)
            {
                
//this will read the output from start to end
                string res = proc.StandardOutput.ReadToEnd();
                richTextBox1.Text = res;
            }
            
//any other case
            else if (dir == 0)
            {
                
//this will read only the first line of the output
                
//basically display any error or info of procesing
                string result = proc.StandardOutput.ReadLine();
                
//if the output contains an error or info
                if (result != null)
                {
                    
//if the string the word denied than the string also contain trouble shooting it
                    if (result.Contains("denied"))
                    {
                        result += " First Unblock It";
                    }
                    
//finally display it
                    too1.Text = result;
                }
                
//if there is no error then simply show done
                
else
                {
                    too1.Text = "Done";
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
//browse
            if (flbrowse.ShowDialog() == DialogResult.OK)
            {
                
//assign the path
                path = flbrowse.SelectedPath;
                pat.Text = path;
                
//create comand to display the file in the path
                
//simple dir command of cmd
                
// /c dir "C:/bla/bla/bla" /a /b"
                
// /a will display all the hidden files
                
// /b display only the name
                
// 1 will change the outputshowed
                cmdproc("/c dir " + "\"" + path + "\"" + " /a /b", 1);
            }
        } 
 

        private void button2_Click(object sender, EventArgs e)
        {
            
//if all the inputs are provided
            if (valid() == true)
            {
                
//attrib command to change the visibilty of the file


               
// /c will tell the cmd to exit as soon as the command is exicuted
                
// -s remove system file property
                
// -h remove the hidden attribute
                
// /s /d will include all the file and folder if *.* is selected

                cmdproc("/c attrib /s /d -s -h \"" + path + "\\" + file + "\"", 0);
            }
        } 
 

        private void button3_Click(object sender, EventArgs e)
        {
            
//if all the inputs are provided
            if (valid() == true)
            {
                
//attrib command to change the visibilty of the file
                
// /c will tell the cmd to exit as soon as the command is exicuted
                
// +s add system file property
                
// +h add the hidden attribute
                
// /s /d will include all the file and folder if *.* is selected
                cmdproc("/c attrib /s /d +s +h \"" + path + "\\" + file + "\"", 0);
            }
        } 
 

        private void button4_Click(object sender, EventArgs e)
        {
            
//if all the inputs are provided
            if (valid() == true)
            {
                
//icacls command to change the security of the file
                
// /t means all the file and folder inside the folder
                
// /deny everyone:(f) deny everyone (f) fullcontrol of the file
                cmdproc("/c icacls \"" + path + "\\" + file + "\"" + " /t /deny everyone:(f)", 0);
            }
        } 
 

        private void button5_Click(object sender, EventArgs e)
        {
            
//if all the inputs are provided
            if (valid() == true)
            {
                
//icacls command to change the security of the file
                
// /t means all the file and folder inside the folder
                
// /grant everyone:(f) grant everyone (f) fullcontrol of the file
                cmdproc("/c icacls \"" + path + "\\" + file + "\"" + " /t /grant everyone:(f)", 0);
            }
        }

        public bool valid()
        {
            
//clear any error
            errors.Clear();
            bool valid = false;
            
//path and file name is provided or not
            if (flbrowse.SelectedPath != "" && filena.Text != "")
            {
                valid = true;
                file = filena.Text;
            }
            
//re assigning the values of file
            if (filena.Text == "")
            {
                errors.SetError(filena, "Provide Input");
                file = "";
            }
            
//re assigning the values of path
            if (flbrowse.SelectedPath == "")
           {
                errors.SetError(pat, "Provide Input");
                path = "";
            }
            return valid;
        } 
 

        private void toolStripStatusLabel1_Click(object sender, EventArgs e)

        {
            
//show recovery window when pass and nam is clicked
            Recovery r1 = new Recovery();
            r1.ShowDialog();
        } 
 

        private void Form1_Load(object sender, EventArgs e)
        {
            l1.ShowDialog();
            
//check if recovery was used
            
//than the show name and pass should be visible           
            if (l1.rec == 1)
            {
                namnpass.Visible = true;
            }
        }

        private void pasteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
//userfriendly ness copy n paste
            richTextBox1.Copy();

            //clear the field before pasting
            
//limitation only one name at a time
            filena.Text = "";
            filena.Paste();
       }
}
 

Login (optional)

Image2.gif

namespace Locker
{
    public partial class Login : Form
    {
        public Login()
        {
            InitializeComponent();
        }
        
//number of retries
        int count = 0;
        public int rec;
        
// mainpg f1 = new mainpg(); 
 

        private void button1_Click(object sender, EventArgs e)
        {
            logic();
        }

        //user name and password validator method

        public void logic()
        {
            
//if valid is true
            if (valid())
            {
                
//maximum retry is 6
                if (count < 6)
                {
                    
//username and password checking
                    if (textBox1.Text == "demo" && textBox2.Text == "pass")
                    {
                        this.Hide();
                        
//this.Close();
                    }
                    
//if the recovery key is not empty
                    else if (textBox3.Text != "")
                    {
                        
//checks the key
                        if (textBox3.Text == "51350-73-4970-938")
                        {
                            
//rec variable is 1 because this is tell the app that the recovery is used
                            rec = 1;
                            
//trying to store the value of rec in other form which will really use it
                            
//hide this form and show the main form
                            
//f1.Show();
                            this.Hide();
                            
//this.Close();
                        }
                        
else
                        {
                            
//error if the key does not match
                            errorProvider1.Clear();
                            errorProvider1.SetError(textBox3, "Input in this format 00000-00-0000-000");
                            MessageBox.Show("Attempts Left " + (6 - count), "Access Denied", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                        }
                    }

                    else
 

                    {
                        
//message if the name and pass does not match
                        MessageBox.Show("Attempts Left " + (6 - count), "Access Denied", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    } 
                }

                else
                {
                    
//if the retry is over
                    MessageBox.Show("This Was Your Last Attempt Bye Bye""Access Denied", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                    Application.Exit();

                }
                
//increment retry
                count++;
            }
        }
        
//checks if any required field is empty??
        public bool valid()
        {
            errorProvider1.Clear();
            bool val = true;
            if (textBox1.Text == "")
            {
                errorProvider1.SetError(textBox1, "Provide Input");
                val = false;
            }
            if (textBox2.Text == "")
            {

                errorProvider1.SetError(textBox2, "Provide Input");

                val = false;
            }
            if (textBox3.Text != "")
            {

                val = true;
            }
            return val; 
        }
        
//just to avoid use of mouse enter key to login
        private void Login_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                logic();
            }
        }

        private void Login_FormClosed(object sender, FormClosedEventArgs e)
        {
            Application.Exit();

        }
    }
}

Recovery (optional)

Image3.gif

Timer=1000 interval

A Dialogue box of the main page is available when the user has entered the recovery key during login.

A valid recovery key will show the name and password.

Code()

namespace Locker
{
    public partial class Recovery : Form
    {
        public Recovery()
        {
            InitializeComponent();
        }
        int i = 1;
        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox3.Text == "51350-73-4970-938")
            {
                label1.Visible = label2.Visible = true;
                timer1.Enabled = true
            }
            
else
            {
                MessageBox.Show("Key Does not Match");
            } 
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            i++;
            if (i == 10)

            {
                textBox3.Text = "";
                label1.Visible = label2.Visible = false;
            }
        }
    }
}