2014-11-26 4 views
0

Я создаю программу на C#, которая проверяет подписи для всех .exe-файлов и выполняет некоторые другие проверки. Запрос приложения для запуска в качестве администратора с UAC и проверяет его при запуске (мы уверены, что он работает с правами администратора).Программа, выполняемая как admin, не может получить доступ к некоторым путям

Однако, когда я рекурсивно проверяю некоторые пути, у меня есть папки, в которых у меня нет доступа. Например:

DirectoryInfo dir = new DirectoryInfo(System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData)); 
FileInfo[] files = dir.GetFiles("*.exe", SearchOption.AllDirectories); 

бросали:

System.UnauthorizedAccessException: Access to the path 'C:\ProgramData\Application Data' is denied. 
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 
    at System.IO.FileSystemEnumerableIterator`1.AddSearchableDirsToStack(SearchData localSearchData) 
    at System.IO.FileSystemEnumerableIterator`1.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.IO.DirectoryInfo.InternalGetFiles(String searchPattern, SearchOption searchOption) 
    at "the lines above" 

Есть ли способ получить доступ к этим пути? В случае, если это невозможно, способ GetFiles пропускает эти пути без остановки, также очень ценится.

+0

Не могли бы вы дать мне пример с одной папкой? Я хотел бы видеть разрешения этой папки. –

+0

'C: \ ProgramData \ Application Data', как в сообщении об исключении –

+0

Например, это« C: \ ProgramData \ Application Data ». ПК является стандартом Win 7 – lithiium

ответ

2

Просто потому, что вы являетесь администратором, это не значит, что вы можете получить доступ ко всему!
E.g. личная папка пользователей также недоступна для администратора «по умолчанию», но в качестве администратора вы можете «дать себе это право».

Таким образом, либо вы изменяете права на все такие папки, либо просто оставляете такие папки.

UPDATE:

В случае, если это не возможно, способ GetFiles пропускает эти пути без остановки также очень ценится.

Вы можете выбрать рекурсивный сканирование «в папке» (должно быть сделано так или иначе ИМО):

public void Scan(DirectoryInfo dir = null) 
{ 
    if (dir == null) 
    { 
     dir = new DirectoryInfo(System.Environment 
       .GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData)); 
    } 

    try 
    { 
     var dirs = dir.GetDirectories(); 
     foreach (var subDir in dirs) 
      Scan(subDir); 

     var files = dir.GetFiles("*.exe", SearchOption.TopDirectoryOnly); 
     foreach (var file in files) 
      // check file 
    } 
    catch(UnauthorizedAccessException) 
    { 
     // log error 
    } 
} 
+0

Это не личная папка ... Любой способ сделать это программно и вернуть его позже? – lithiium

+0

«личная папка» была всего лишь примером. Важным фактом является то, что очень легко не иметь доступа к папкам, даже если вы администратор. Просто откройте диалоговое окно свойств для такой папки и проверьте права группы «Администратор» на вкладке безопасности ... – ChrFin

+0

Извините, но это не решение, так как мне нужно запустить его для нескольких путей на нескольких ПК и должно быть сделано программно. Любой способ GetFiles пропустить эти пути? – lithiium

0

Вы пытались добавить разрешения на чтение/запись на файлы, которые вы пытаетесь получить доступ через командную строку ?

Если вы только требуете доступа к этому файлу временно, лучше удалить разрешения после того, как вы закончите чтение/запись, в противном случае я бы рассмотрел предоставление определенных прав пользователей вместо изменения разрешений в вашей файловой системе , В любом случае, это зависит от вашей цели.

http://support.microsoft.com/kb/308419

Смежные вопросы