为什么我在通过 Shell32 读取公共快捷方式时会得到 E_ACCESSDENIED?

cor*_*rax 6 .net c# windows 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;
Run Code Online (Sandbox Code Playgroud)

最后一行抛出 System.UnauthorizedAccessException,表示不允许读取快捷方式文件的内容。我已尝试在用户的私人桌面 (c:\Users\username\Desktop) 上使用快捷方式文件,效果很好。

所以,我的问题是:

(1) 为什么我的应用程序不允许 /read/ 代码中的快捷方式,当我作为用户可以清楚地阅读内容时?

(2) 有没有办法解决这个问题?也许为应用程序使用特殊的清单文件?

而且,顺便说一下,我的操作系统是 Windows 7,64 位。

好好的

-H-

Han*_*ant 5

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

是的,您可以使用 manifest解决这个问题。

  • 您正在使用一个已有 15 年历史的 COM 接口,它在设想 UAC 之前就发明了*很久*。它没有“EnableChangingProperties”属性,当设置为 False 时将允许对 .lnk 文件进行只读访问。Explorer 中的属性表处理程序使用其他东西。不确定是什么,但我怀疑它是否可以编写脚本。shell 接口太旧,无法从 .NET 轻松使用,只有 C/C++ 程序可以。 (2认同)