读取lnk文件的一般方法

3

许多框架和编程语言似乎都有lnk文件解析器(C#,Java,Python等等),用于获取它们的目标、属性等信息。如果我想在没有此类功能的其他语言中解析lnk文件,我希望知道读取lnk文件的一般方法是什么。是否有Windows API可用于此?

6个回答

3

很抱歉让您等待了这么久才得到奖励。这是我第一次提出悬赏问题,我以为接受后奖励会自动发放。这是您的奖励! - MPelletier
1
微软官方PDF文件为http://msdn.microsoft.com/en-us/library/dd871305.aspx。(另外,您提供的链接已经失效) - ninMonkey

2

我认为在第一个项目页面中添加一些描述和示例代码会很好。 - NoOne

2

只需要在 J.A.F.A.T. 鉴证分析工具项目 中使用 lnk 文件解析器。

请查看 http://jafat.sourceforge.net 上的 lnk-parse-1.0.pl。

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


1

@Giorgi:实际上,确实有一个官方的lnk文件规范,至少据说是这样的。 然而,由于某些原因,链接似乎已经失效,在下载整个(45 MB)文档包(Application_Services_and_NET_Framework.zip)后,发现它并不包括文件MS-SHLLINK.pdf

但这真的令人惊讶吗?

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


6
我非常喜欢“第4节:安全”。 - ZJR

0

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

例如,以下代码片段可以在PHP上完成此操作:(使用COM对象的PHP 5)

<?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

0

这里是一些使用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... 
                    }
                }
            }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接