Почему я получаю e_accessdened при чтении общественных ярлыков через Shell32?
Вопрос
Я пытаюсь прочитать цели всех ярлыков настольных компьютеров в приложении 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.
Да, вы можете исправить это с манифестом.