Powershell:在 32 位模式下运行时缺少 DLL 文件

标签 powershell

为了让 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/

相关文章:

PowerShell 使用 switch 语句分割字符串循环,基于子字符串、标记值

powershell - 运行 New-AzureRmDataLakeAnalyticsCatalogCredential 后出现解密错误

xml - 使用 PowerShell 解析带有命名空间的 XML

iis - 无法删除文件,IIS锁定

powershell - 如何在 mcr.microsoft.com/powershell 镜像之外的 docker 容器中安装 powershell 模块?

windows - 用于删除注册表项的 PowerShell 脚本

路径中带有 Get-ChildItem 和通配符的 Powershell 奇怪行为

powershell - 从 WiX 安装程序运行 PowerShell 脚本

windows - 从文件中删除与模式匹配的所有行,但第一次出现的行除外

powershell - 在powershell脚本中消除数组中的重复项