You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何读取LNK快捷方式文件本身的字节数据而非其指向的目标?

问题根因

你创建的根本不是标准Windows LNK快捷方式文件。New-Item -ItemType SymbolicLink生成的是NTFS文件系统级符号链接,只是人为将后缀命名为.lnk。系统解析路径时会自动跟随这类符号链接指向目标文件,所以读取操作直接拿到了目标alg.exe的PE内容,和你预期的Shell快捷方式(二进制LNK格式)完全无关。
标准LNK文件是Windows Shell定义的二进制格式文件,固定魔数开头为0x4C(十进制76,对应ASCII字符L),不属于NTFS重解析点类的符号链接。

正确实现方法

1. 创建原生LNK快捷方式

通过WScript.Shell COM对象生成标准格式的LNK文件,不要用NTFS符号链接伪装:

$WshShell = New-Object -ComObject WScript.Shell
$lnkPath = Join-Path $env:USERPROFILE "Desktop\test.lnk"
# 先删除之前创建的假lnk符号链接
if (Test-Path $lnkPath) { Remove-Item $lnkPath -Force }
$Shortcut = $WshShell.CreateShortcut($lnkPath)
$Shortcut.TargetPath = "C:\Windows\System32\alg.exe"
$Shortcut.Save()

2. 读取LNK文件原始字节

优先使用.NET底层文件读取方法,彻底避免路径解析自动跟随重定向的问题,兼容所有PowerShell版本:

$lnkPath = Join-Path $env:USERPROFILE "Desktop\test.lnk"
$file_data = [System.IO.File]::ReadAllBytes($lnkPath)
$encoded = [System.Convert]::ToBase64String($file_data)
验证结果

执行后输出$encoded的开头内容,会得到预期的TAAAAAEUA,对应字节序列开头为76 0 0 0 1 20 2 0,完全匹配LNK文件的标准魔数。

补充:如果场景是需要读取后缀为.lnk的NTFS符号链接本身而非目标,直接使用上面的[System.IO.File]::ReadAllBytes()方法即可绕过PowerShell cmdlet对符号链接的自动跟随逻辑。

内容的提问来源于stack exchange,提问作者Utkonos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:57:26