Общий подход к чтению файлов LNK
Некоторые фреймворки и языки, кажется, имеют парсеры файлов lnk (C#, Java, Python, конечно, бесчисленное множество других), чтобы добраться до их целей, свойств и т. Д. Я хотел бы знать, каков общий подход к чтению файлов lnk, если я хочу разобрать lnk на другом языке, который не имеет указанной функции. Есть ли для этого Windows API?
6 ответов
Существует не официальный документ от Microsoft, описывающий формат файла lnk, но есть некоторые документы, которые имеют описание формата. Вот один из них: Формат файла ярлыка (.lnk)
Что касается API, вы можете использовать интерфейс IShellLink
Это старый пост, но здесь моя реализация C# для обработки lnk, которая обрабатывает всю спецификацию
https://github.com/EricZimmerman/Lnk
больше информации и инструмент командной строки здесь
http://binaryforay.blogspot.com/2016/02/introducing-lecmd.html
Просто используйте анализатор файлов lnk в проекте JAFAT Archive of Forensics Analysis Tools.
См. Lnk-parse-1.0.pl на http://jafat.sourceforge.net/
Кажется, нет никакой зависимости. Синтаксис прост, и файл ссылок становится простым текстом в стандартном выводе и может использоваться в 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, кажется наиболее удобным вариантом для чтения. .lnk
файлы на большинстве языков в Windows XP. Вам просто нужен доступ к среде 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
вот код C # с использованием Shell32 API из моего проекта "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...
}
}
}