【问题标题】:Why do i get E_ACCESSDENIED when reading public shortcuts through Shell32?为什么我在通过 Shell32 读取公共快捷方式时得到 E_ACCESSDENIED?
【发布时间】:2011-02-25 10:32:30
【问题描述】:

我正在尝试读取 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) 当我作为用户可以清楚地读取内容时,为什么我的应用程序不允许 /read/ 从代码中读取快捷方式?

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

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

好好的

-h-

【问题讨论】:

    标签: c# .net windows shell32


    【解决方案1】:

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

    是的,你可以解决这个问题with a manifest

    【讨论】:

    • 太好了,这很有效,非常感谢 - 但是我不确定在实际尝试修改某些内容之前是否看到抛出异常的逻辑。特别是因为我可以通过 Windows UI 轻松读取值,而不会收到提升提示。
    • 您正在使用一个 15 年前的 COM 接口,该接口是在 UAC 被设想之前 long 发明的。它没有“EnableChangingProperties”属性,当设置为 False 时将允许对 .lnk 文件进行只读访问。 Explorer 中的属性表处理程序使用了其他东西。不确定是什么,但我怀疑它是可编写脚本的。 Shell 接口太旧,无法从 .NET 轻松使用,只有 C/C++ 程序可以。
    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    相关资源
    最近更新 更多