Почему я получаю E_ACCESSDENIED при чтении публичных ярлыков через Shell32?
Я пытаюсь прочитать цели всех ярлыков на рабочем столе в приложении C# 4. Ярлыки на рабочем столе Windows могут поступать из нескольких мест в зависимости от того, создан ли ярлык для всех пользователей или только для текущего пользователя. В этом конкретном случае я пытаюсь прочитать ярлык с общедоступного рабочего стола, например, из C:\Users\Public\Desktop\shortcut.lnk.
Код выглядит следующим образом (путь - это строка, содержащая путь к файлу lnk):
var shell = new Shell32.ShellClass();
var folder = shell.NameSpace(Path.GetDirectoryName(path));
var folderItem = folder.ParseName(Path.GetFileName(path));
if (folderItem != null)
{
var link = (Shell32.ShellLinkObject)folderItem.GetLink;
В последней строке выдается исключение System.UnauthorizedAccessException, указывающее, что запрещено читать содержимое файла ярлыка. Я пробовал ярлыки на личном рабочем столе пользователя (c:\Users\username\Desktop), и это прекрасно работает.
Итак, мои вопросы:
(1) почему моему приложению не разрешено / читать / ярлык из кода, когда я могу четко читать содержимое как пользователь?
(2) есть ли способ обойти это? Может быть, использовать специальный файл манифеста для приложения?
И, кстати, моя ОС - Windows 7, 64-битная.
всего хорошего
-час-
1 ответ
Да, вы не можете получить доступ к файлу.lnk в этой папке по умолчанию. Вы создаете COM-объект, который позволяет вам изменять свойства.lnk. И это требует учетной записи уровня администратора с отключенным UAC.
Да, вы можете исправить это с помощью манифеста.