为了让 DLL 文件在特定进程下运行,我使用了以下代码行:
$Modules += Get-Process -Id $ProcessId | Select-Object -ExpandProperty 模块
这行代码在 64 位模式下运行时运行良好。但是,当使用 32 位模式时,我注意到与 64 位模式相比,相同的进程返回的模块较少。
为什么会这样?由于我需要在 32 位模式下运行我的脚本,是否有任何其他方法来获取请求的 DLL 文件?
最佳答案
如问题评论中所述,32 位进程无法访问 64 位进程的模块,因此如果目标进程,您不能按原样使用来自 32 位 PowerShell 的命令是一个 64 位进程。
事实上,如果您尝试使用您的命令从 32 位 Windows PowerShell 实例访问 64 位 Windows PowerShell 实例,您会收到一条明确的错误消息,至少在带有 Windows PowerShell v5.1 的 Windows 10 上:
A 32 bit processes cannot access modules of a 64 bit process.
作为次优解决方法,您可以通过其 CLI (powershell.exe
) 从 32 位实例调用 64 位 Windows PowerShell:
$ps64 = "$($PSHOME -replace '\\SysWOW64\\', '\\SysNative\\')\powershell.exe"
& $ps64 -noprofile { (Get-Process -Id 1468 | Select-Object -ExpandProperty Modules) }
解决方法在两个方面不是最优的:
它涉及在新进程中创建新的 PowerShell 实例,速度很慢。
更重要的是,返回的对象只是直接调用将返回的
System.Diagnostics.ProcessModule
实例的近似值。具体来说,它们是
[pscustomobject]
实例 - 类型名称为Deserialized.System.Diagnostics.ProcessModule
以指示其来源 - 具有以下属性与原始对象相同的名称,具有它们值的静态副本(它们本身可能是这样的[pscustomobject]
实例;此外,这些实例缺少原始对象所具有的方法有。就是说,如果您只需要访问诸如
.ModuleName
或.FileName
之类的属性,您应该没有问题。
关于Powershell:在 32 位模式下运行时缺少 DLL 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58323476/