Getfiles() UnAuthorizedAccessAcception в WIN7

Проблемы

  1. UnAuthorizedAccessException: при рекурсивном поиске в каталоге, таком как C:\
    "Доступ к пути "c:\Documents and Settings\" запрещен". Происходит даже при обновлении привилегий UAC и доступе группы администраторов.

Испробованные методы

  1. Попробуйте и поймайте: используйте любой из этих методов (Exception, UnAuthorizedAccessException, Blank Catch, продолжить)

Вопросы

  1. Как вы обрабатываете такое исключение и продолжаете выполнять свою программу в обычном режиме? Это должно работать как на учетных записях без прав администратора, так и на учетных записях администратора.

Пример кода

using System;
using System.IO;

namespace filecheck
{
    class Program
    {
        static void Main(string[] args)
        {
            int i = 0;
            int html = 0;
            try
            {
                string[] filePaths = Directory.GetFiles(@"c:\", "*.html", SearchOption.AllDirectories);

                foreach (string files in filePaths)
                {
                    if (Convert.ToBoolean(files.IndexOf("html")))
                    {
                        html++;
                    }
                    Console.WriteLine(files);
                    i++;

                }
                Console.Write("# Files found: {0} Html: {1)", i, html);
            }
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine("The process failed: {0}", e.ToString());
            }
            catch (Exception e)
            {
                Console.WriteLine("The process failed: {0}", e.ToString());

            }

        }
    }
}

person Nightforce2    schedule 27.01.2011    source источник
comment
Насколько я знаю, программный доступ к документам и настройкам запрещен. Даже не как суперадмин   -  person Theun Arbeider    schedule 27.01.2011
comment
@Theun: Кто такой суперадмин?   -  person Cody Gray    schedule 27.01.2011
comment
@Theun: я предполагаю, что вы говорите о скрытой учетной записи администратора (встроенной). Я этого не пробовал, но это должно дать вам неограниченный доступ к системе. Мне это не нужно. Просто ищу способ обойти блокировку моего поиска из-за этой надоедливой ерунды с неавторизованным доступом.   -  person Nightforce2    schedule 28.01.2011


Ответы (2)


К сожалению, единственный способ справиться с этим - выполнить рекурсию вручную. Даже в собственном примере кода Microsoft делает это таким образом, просто чтобы избежать сбоя всего поиска, потому что один или несколько каталогов недоступны.

Другими словами, используйте SearchOption.AllDirectories только тогда, когда вы ищете ограниченное подмножество каталогов, в которых вы уверены, что не будет каталогов, к которым у вас не будет доступа.

person Hans Olsson    schedule 27.01.2011
comment
Даже там подход не работает в C:\ он вообще ничего не возвращает. Если я изменю пример поиска в каталоге на что-то вроде c:\user\‹user›\Desktop, он также найдет все, что я запрошу. Как узнать, какие каталоги пропускать? Нужно ли проверять атрибуты безопасности папки и пропускать их, если текущая роль пользователя не имеет прав? Должно быть возможное решение для этого. Они говорят, что вы можете обрабатывать исключения и двигаться дальше, но это просто полностью останавливает вашу программу от запуска, это меня сбило с толку. - person Nightforce2; 28.01.2011
comment
@Nightforce2: В Windows 7 (и, возможно, в Vista тоже) корень системного диска (обычно C:\) по умолчанию защищен от записи, но, поскольку ваш код только читает, я думал, что из-за этого он не выйдет из строя. поэтому я не уверен, почему у вас возникла эта проблема. Если бы у вашей учетной записи не было прав на чтение в корень системного диска, я бы подумал, что она не сможет запустить Windows... - person Hans Olsson; 28.01.2011
comment
Я предполагаю, что это из-за UAC. Это вызывает больше проблем, чем решений. - person Nightforce2; 04.02.2011

Чтобы ваша программа работала как с администраторами, так и с пользователями, не являющимися администраторами, вам нужно либо олицетворять пользователя, либо пересобирать приложение для «Запуск от имени администратора» каждый раз, когда оно выполняется или используется любым пользователем. Чтобы создать такое приложение, вам нужно добавить файл app.manifest в свой проект и раскомментировать следующую строку настроек в app.manifest.

<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />

Подробнее читайте здесь: http://midnightprogrammer.net/post/How-To-Build-UAC-Compatible-Application-In-NET.aspx

person Prashant    schedule 27.01.2011
comment
Это неприменимо, так как я нахожусь в роли администратора и использую UAC для обновленных привилегий. Таким образом, вы видите, что установка этого параметра только заставляет UAC выдавать мне запрос на подтверждение эскалации пользователя при запуске моей программы. - person Nightforce2; 28.01.2011