3

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

4

6 回答 6

3

Microsoft 没有描述 lnk 文件格式的官方文档,但有一些文档描述了该格式。这是其中之一:快捷方式文件格式 (.lnk)

至于 API,您可以使用IShellLink 接口

于 2010-08-09T15:09:00.387 回答
2

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

https://github.com/EricZimmerman/Lnk

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

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

于 2016-02-12T21:50:55.123 回答
1

只需在JAFAT Archive of Forensics Analysis Tools 项目中使用 lnk 文件解析器。

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

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

于 2013-11-08T08:40:28.023 回答
0

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

下面的代码片段,例如在 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 交互的语言。

这个简单的教程可能会派上用场,因为它列出并举例说明了文件的一些最有趣的属性,而.lnk不是最重要的:TargetPath. 那些是:

  • WindowStyle,
  • Hotkey,
  • IconLocation,
  • Description,
  • WorkingDirectory
于 2011-11-20T02:42:22.100 回答
0

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

但这真的令人惊讶吗?

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

于 2011-06-10T10:49:11.957 回答
0

这是一些使用 Shell32 API 的 C# 代码,来自我在https://github.com/jmaton/ClearRecentLinks的“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... 
                    }
                }
            }
于 2021-07-23T19:08:38.860 回答