Почему я получаю e_accessdened при чтении общественных ярлыков через Shell32?

StackOverflow https://stackoverflow.com/questions/2934420

  •  05-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь прочитать цели всех ярлыков настольных компьютеров в приложении C # 4. Ярлыки на рабочем столе Windows могут получить больше, что одно местоположение, в зависимости от того, создан ли ярлык для всех пользователей или только текущего пользователя. В этом конкретном случае я пытаюсь прочитать ярлык от общедоступного рабочего стола, например, от C: пользователей 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;

Последняя строка бросает систему .UnauthorizedAccessException, указывая на то, что не разрешено читать содержимое ярлыка. Я попробовал на ярлыках на частном рабочем столе пользователя (C: Users username Desktop), и это работает нормально.

Итак, мои вопросы:

(1) Почему мое приложение не допускается / чтение / ярлык от кода, когда я могу четко прочитать содержимое в качестве пользователя?

(2) Есть ли способ обойти это? Может быть, используя специальный файл манифеста для приложения?

И, кстати, моя ОС - это Windows 7, 64-битная.

всего хорошего

-час-

Это было полезно?

Решение

Да, вы не можете получить доступ к файлу .lnk в этой папке по умолчанию. Вы создаете COM-объект, который позволяет модифицировать свойства .lnk. И это требует учетной записи уровня администратора с выключенным UAC.

Да, вы можете исправить это с манифестом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top