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