【问题标题】:General approach to reading lnk files读取 lnk 文件的一般方法
【发布时间】:2010-08-06 16:57:25
【问题描述】:

一些框架和语言似乎有 lnk 文件解析器(C#、Java、Python,当然还有无数其他),以获取它们的目标、属性等。我想知道读取 lnk 文件的一般方法是什么,如果我想用另一种没有所述功能的语言解析 lnk。是否有用于此的 Windows API?

【问题讨论】:

    标签: language-agnostic shortcut lnk


    【解决方案1】:

    Microsoft 没有官方文档描述 lnk 文件格式,但有一些文档对格式进行了描述。这是其中之一:Shortcut File Format (.lnk)

    API你可以使用IShellLink Interface

    【讨论】:

    • 很抱歉让您等了这么久才收到赏金。这是我的第一个赏金问题,我认为奖励是自动接受的。这是你的奖励!
    • 微软官方PDF是msdn.microsoft.com/en-us/library/dd871305.aspx。 (加上您的链接现在已损坏)
    【解决方案2】:

    这是一篇旧文章,但这是我的 C# 实现,用于处理整个规范的 lnk 处理

    https://github.com/EricZimmerman/Lnk

    更多信息和命令行工具在这里

    http://binaryforay.blogspot.com/2016/02/introducing-lecmd.html

    【讨论】:

    • 我认为在第一个项目页面中添加一些描述和示例代码会很好。
    【解决方案3】:

    只需在 J.A.F.A.T. 使用 lnk 文件解析器。取证分析工具项目的存档

    请参阅http://jafat.sourceforge.net 上的 lnk-parse-1.0.pl

    似乎没有没有依赖关系。语法简单,链接文件成为标准输出中的简单文本,可在 Linux 上使用。

    【讨论】:

      【解决方案4】:

      @Giorgi:实际上,官方的 lnk 文件规范,至少它是这样声明的: http://msdn.microsoft.com/en-us/library/dd871305%28PROT.10%29.aspx 但是,由于某种原因,该链接似乎已失效,并且在下载整个(45Megs)文档包(Application_Services_and_NET_Framework.zip)后,它似乎不包含文件 MS-SHLLINK.pdf。

      但这真的令人惊讶吗?

      一旦你获得了文件格式,编写代码来阅读它应该不会太难。

      【讨论】:

      【解决方案5】:

      使用 WSH 相关组件 似乎是在 XP 后的 Windows 系统上以大多数语言读取 .lnk 文件的最方便的选择。您只需要访问 COM 环境并实例化WScript.Shell 组件。 (请记住,在 win 中,对 Shell 的引用通常是指 explorer.exe

      以下sn-p,例如在 PHP 上做事:(PHP 5,使用 COM 对象)

      <?php
      $wsh=new COM('WScript.Shell'); // the wsh object
      
      // please note $wsh->CreateShortcut method actually
      // DOES THE READING, if the file already exists. 
      $lnk=$wsh->CreateShortcut('./Shortcut.lnk');
      echo $lnk->TargetPath,"\n";
      

      另外一个,相反,在 VBScript 上做同样的事情:

      set sh = WScript.CreateObject("WScript.Shell")
      set lnk = sh.CreateShortcut("./Shortcut.lnk")
      MsgBox lnk.TargetPath
      

      该领域的大多数示例用 VB/VBS 编写,但它们可以很好地翻译以某种形式支持 COM 和 WSH 交互的所有语言。

      This simple tutorial 可能会派上用场,因为它列出并举例说明了.lnk 文件的一些最有趣的属性,而不是最重要的:TargetPath。它们是:

      • WindowStyle,
      • Hotkey,
      • IconLocation,
      • Description,
      • WorkingDirectory

      【讨论】:

        【解决方案6】:

        这里有一些使用 Shell32 API 的 C# 代码,来自我的“ClearRecentLinks”项目https://github.com/jmaton/ClearRecentLinks

        要使用它,您的 C# 项目必须引用 c:\windows\system32\shell32.dll

                    string linksPath = "c:\some\folder";
                    Type shell32Type = Type.GetTypeFromProgID("Shell.Application");
                    Object shell = Activator.CreateInstance(shell32Type);
                    Shell32.Folder s32Folder = (Shell32.Folder)shell32Type.InvokeMember("NameSpace", System.Reflection.BindingFlags.InvokeMethod, null, shell, new object[] { linksPath });
                    foreach (Shell32.FolderItem2 item in s32Folder.Items())
                    {
                        if (item.IsLink)
                        {
                            var link = (Shell32.ShellLinkObject)item.GetLink;
                            if (link != null && !String.IsNullOrEmpty(link.Target.Path))
                            {
                                string linkTarget = link.Target.Path.ToLower();
                                // do something... 
                            }
                        }
                    }
        

        【讨论】:

          猜你喜欢
          • 2010-09-28
          • 1970-01-01
          • 1970-01-01
          • 2010-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多