0

I'm trying to write something like Total-Commander in C#. I have got problem - when I try to get info about folders like C:/, G:/ or, for example C:/ProgramData there is an exception System.UnauthorizedAccessException. I have already set an Admins permissions in manifest, but it is doesn't help.

Can anybody tell me if this is real to get access to this folders or no ? To make this question more clear left code and screenshot below. Screenshot: enter image description here

Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Security.Principal;
using System.Diagnostics;
using System.Reflection;
using System.Windows;


namespace Lab01
{
    
    
    public partial class Form1 : Form
    {

        
        public Form1()
        {
            InitializeComponent();
            PopulateTreeView();

            
        }

        private bool IsRunAsAdministrator()
        {
            var wi = WindowsIdentity.GetCurrent();
            var wp = new WindowsPrincipal(wi);

            return wp.IsInRole(WindowsBuiltInRole.Administrator);
        }
        

        private void PopulateTreeView()
        {
            TreeNode rootNode;

            DirectoryInfo info = new DirectoryInfo(@"c:\ProgramData");
            if (info.Exists)
            {
                rootNode = new TreeNode(info.Name);
                rootNode.Tag = info;
                if (IsRunAsAdministrator())
                {
                    var processInfo = new ProcessStartInfo(Assembly.GetExecutingAssembly().CodeBase);

                    // The following properties run the new process as administrator
                    processInfo.UseShellExecute = true;
                    processInfo.Verb = "runas";

                    // Start the new process
                    /*  try
                      {
                          GetDirectories(info.GetDirectories(), rootNode);
                      }
                      catch (Exception)
                      {
                          // The user did not allow the application to run as administrator
                          MessageBox.Show("Sorry, this application must be run as Administrator.");
                          Environment.Exit(0);
                      }
                      Environment.Exit(0);
                      // Shut down the current process*/
                    GetDirectories(info.GetDirectories(), rootNode);

                }
                MessageBox.Show("Uknown Error");
                Environment.Exit(0);

            }
        }

        private void GetDirectories(DirectoryInfo[] subDirs,
            TreeNode nodeToAddTo)
        {

            TreeNode aNode;
            DirectoryInfo[] subSubDirs;
            foreach (DirectoryInfo subDir in subDirs)
            {
                aNode = new TreeNode(subDir.Name, 0, 0);
                aNode.Tag = subDir;
                aNode.ImageKey = "folder";
                
                subSubDirs = subDir.GetDirectories();
                if (subSubDirs.Length != 0)
                {
                    GetDirectories(subSubDirs, aNode);
                }
                nodeToAddTo.Nodes.Add(aNode);
            }
        }

        private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            TreeNode newSelected = e.Node;
            listView1.Items.Clear();
            DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
            ListViewItem.ListViewSubItem[] subItems;
            ListViewItem item = null;

            foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories())
            {
                item = new ListViewItem(dir.Name, 0);
                subItems = new ListViewItem.ListViewSubItem[]
                {new ListViewItem.ListViewSubItem(item, "Directory"), new ListViewItem.ListViewSubItem(item, dir.LastAccessTime.ToShortDateString())};
                item.SubItems.AddRange(subItems);
                listView1.Items.Add(item);
            }
            foreach (FileInfo file in nodeDirInfo.GetFiles())
            {
                item = new ListViewItem(file.Name, 1);
                subItems = new ListViewItem.ListViewSubItem[]
                    { new ListViewItem.ListViewSubItem(item, "File"),
             new ListViewItem.ListViewSubItem(item,
                file.LastAccessTime.ToShortDateString())};

                item.SubItems.AddRange(subItems);
                listView1.Items.Add(item);
            }

            listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
        }
          

    }
}

Thank you in advance

1 Answers1

0

Please review the solutions provided as part of the following question. You can adopt some of the mentioned strategies:

Access to the path 'C:\ProgramData\Application Data' is denied