能否从内存恢复正在运行的已删除PowerShell脚本
从运行中PowerShell进程内存恢复已删除脚本的方法
好消息——因为你的两个脚本目前仍在运行,这是关键转机:进程内存里大概率还保留着脚本的完整内容,下面是几种实操性强的方法,按难度从易到难排序:
方法1:用PowerShell自带调试命令(无额外工具)
这是最省心的方法,不需要下载任何工具,用PowerShell本身就能搞定:
- 先找到目标进程的PID(进程ID):
- 打开任务管理器,找到对应的
powershell.exe进程(可以通过内存占用、启动时间判断哪个是运行脚本的进程); - 或者在新的PowerShell窗口运行
Get-Process powershell,输出里的Id列就是PID。
- 打开任务管理器,找到对应的
- 以管理员身份打开一个新的PowerShell窗口,附加到目标进程并暂停它:
Debug-Process -Id <你的目标PID> -Break - 查看当前进程的运行空间:
通常脚本运行在Get-RunspaceId为1的运行空间里,你可以通过Name或State字段确认。 - 切换到目标运行空间:
Enter-Runspace -Id <运行空间ID> - 现在就能访问脚本的内容了:
- 如果脚本是通过文件执行的,试试
$MyInvocation.MyCommand.Definition,虽然文件被删了,但内存里可能还存着脚本的文本内容; - 如果脚本里定义了函数,直接输入函数名(比如
Get-MyCustomFunction)就能查看函数体; - 也可以用
Get-ChildItem function:列出所有函数,逐个找回你的代码。
- 如果脚本是通过文件执行的,试试
- 完成后,退出运行空间并让原进程继续运行:
Exit-Runspace Debug-Process -Id <你的目标PID> -Continue
方法2:用进程内存转储工具(适合复杂脚本)
如果自带命令没找到完整内容,可以用微软官方的Sysinternals工具procdump来生成进程内存快照:
- 下载
procdump(微软官网可直接获取,无需安装),放到任意目录。 - 以管理员身份打开命令提示符,运行以下命令生成完整内存转储:
这个命令会生成一个包含进程所有内存内容的dump文件。procdump -ma <你的目标PID> script_dump.dmp - 用WinDbg或Visual Studio打开这个dump文件,通过搜索关键词(比如你记得的脚本里的变量名、函数名)找到脚本内容,复制出来即可。
方法3:调用Windows API读取进程内存(进阶玩法)
如果你有一定编程基础,可以用PowerShell直接调用Windows API读取进程内存,但步骤相对复杂:
- 核心思路是打开目标进程的内存句柄,遍历内存区域,搜索文本内容。以下是简化示例(需管理员权限):
这种方法适合需要精准定位内存内容的场景,建议先尝试前两种方法。$targetPid = <你的目标PID> $process = Get-Process -Id $targetPid # 调用OpenProcess获取进程句柄 $openProcess = Add-Type -MemberDefinition @" [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId); "@ -Name "Win32OpenProcess" -Namespace Win32Functions -PassThru $handle = $openProcess::OpenProcess(0x1F0FFF, $false, $targetPid) # 后续需要遍历内存区域、读取内容并搜索关键词,这部分需要更多内存知识
关键注意事项
- 绝对不要关闭运行中的PowerShell进程!一旦进程退出,内存里的内容会被系统立即释放,再也找不回来。
- 操作过程中尽量避免在系统上做大量写入操作(比如安装软件、下载文件),防止内存被新的数据覆盖。
- 如果脚本包含敏感信息,处理dump文件时要注意安全,不要随意分享。
内容的提问来源于stack exchange,提问作者MichaelH
相关产品推荐
相关产品推荐

