当通过Shell32读取公共快捷方式时,为什么会出现E_ACCESSDENIED错误?

7
我在一款C# 4应用程序中尝试读取所有桌面快捷方式的目标。Windows桌面上的快捷方式可以来自多个位置,具体取决于快捷方式是为所有用户还是仅为当前用户创建的。在这种特定情况下,我正在尝试从公共桌面读取快捷方式,例如从C:\Users\Public\Desktop\shortcut.lnk。
代码如下(path是包含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位。

保重

-h-

1个回答

6

是的,默认情况下您无法访问该文件夹中的.lnk文件。您正在创建一个COM对象,允许您修改.lnk属性。这需要一个关闭UAC的管理员级别帐户。

是的,您可以使用清单来解决这个问题。


太好了,这个方法可行,非常感谢 - 不过我不确定在实际尝试修改之前抛出异常的逻辑是否正确。特别是因为我可以通过Windows UI轻松地读取值而不需要获取提升权限。 - corvuscorax
2
您正在使用一个15年前发明的COM接口,早在UAC构想之前。它没有“EnableChangingProperties”属性,当设置为False时,将允许只读访问.lnk文件。资源管理器中的属性表处理程序使用其他内容。不确定是什么,但我怀疑它是可编写脚本的。Shell接口太旧了,无法轻松地从.NET中使用,只有C/C++程序可以。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接