【发布时间】:2010-08-06 16:57:25
【问题描述】:
一些框架和语言似乎有 lnk 文件解析器(C#、Java、Python,当然还有无数其他),以获取它们的目标、属性等。我想知道读取 lnk 文件的一般方法是什么,如果我想用另一种没有所述功能的语言解析 lnk。是否有用于此的 Windows API?
【问题讨论】:
标签: language-agnostic shortcut lnk
一些框架和语言似乎有 lnk 文件解析器(C#、Java、Python,当然还有无数其他),以获取它们的目标、属性等。我想知道读取 lnk 文件的一般方法是什么,如果我想用另一种没有所述功能的语言解析 lnk。是否有用于此的 Windows API?
【问题讨论】:
标签: language-agnostic shortcut lnk
Microsoft 没有官方文档描述 lnk 文件格式,但有一些文档对格式进行了描述。这是其中之一:Shortcut File Format (.lnk)
API你可以使用IShellLink Interface
【讨论】:
这是一篇旧文章,但这是我的 C# 实现,用于处理整个规范的 lnk 处理
https://github.com/EricZimmerman/Lnk
更多信息和命令行工具在这里
http://binaryforay.blogspot.com/2016/02/introducing-lecmd.html
【讨论】:
只需在 J.A.F.A.T. 使用 lnk 文件解析器。取证分析工具项目的存档。
请参阅http://jafat.sourceforge.net 上的 lnk-parse-1.0.pl
似乎没有没有依赖关系。语法简单,链接文件成为标准输出中的简单文本,可在 Linux 上使用。
【讨论】:
@Giorgi:实际上,有官方的 lnk 文件规范,至少它是这样声明的: http://msdn.microsoft.com/en-us/library/dd871305%28PROT.10%29.aspx 但是,由于某种原因,该链接似乎已失效,并且在下载整个(45Megs)文档包(Application_Services_and_NET_Framework.zip)后,它似乎不包含文件 MS-SHLLINK.pdf。
但这真的令人惊讶吗?
一旦你获得了文件格式,编写代码来阅读它应该不会太难。
【讨论】:
使用 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【讨论】:
这里有一些使用 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...
}
}
}
【讨论】: