UnauthorizedAccessException в моем собственном каталоге
-
12-09-2019 - |
Вопрос
Я пытаюсь перебирать элементы в меню «Пуск», но продолжаю получать исключение UnauthorizedAccessException.Я владелец каталога, а мой пользователь — администратор.
Вот мой метод (он находится в проекте dll):
// root = C:\Users\Fernando\AppData\Roaming\Microsoft\Windows\Start Menu
private void walkDirectoryTree(DirectoryInfo root) {
try {
FileInfo[] files = root.GetFiles("*.*");
foreach (FileInfo file in files) {
records.Add(new Record {Path = file.FullName});
}
DirectoryInfo[] subDirectories = root.GetDirectories();
foreach (DirectoryInfo subDirectory in subDirectories) {
walkDirectoryTree(subDirectory);
}
} catch (UnauthorizedAccessException e) {
// do some logging stuff
throw; //for debugging
}
}
Код терпит неудачу, когда он начинает перебирать подкаталоги.Что еще мне следует сделать?Я уже пытался создать файл манифеста, но это не сработало.Еще момент (если это актуально):Я просто запускаю несколько модульных тестов с помощью Visual Studio (которая выполняется от имени администратора).
Решение
Судя по вашему описанию, похоже, что существует каталог, к которому ваш пользователь не имеет доступа при работе с включенным UAC.В вашем коде нет ничего плохого, и поведение в этой ситуации задумано.В своем коде вы ничего не можете сделать, чтобы обойти тот факт, что ваша учетная запись не имеет доступа к этим каталогам в контексте, в котором она работает в данный момент.
Вам нужно будет создать учетную запись для каталога, к которому у вас нет доступа.Лучший способ, вероятно, — добавить несколько методов расширения.Например
public static FileInfo[] GetFilesSafe(this DirectoryRoot root, string path) {
try {
return root.GetFiles(path);
} catch ( UnauthorizedAccessException ) {
return new FileInfo[0];
}
}