使用 powershell 在 Windows 中获取进程的私有环境变量

使用 powershell 在 Windows 中获取进程的私有环境变量

我的数据库上运行着一个进程 (testxx)。每次用户连接数据库时,该进程都会为其启动单独的会话。所有进程都包含一个具有不同值的私有环境变量 (Client-Nr)。我想使用特定的私有环境变量来调用特定的进程。我使用了以下命令:

假设有 5 个“testxx”进程。我想调用私有环境变量“Client-Nr”中值为“Client-Two”的进程。

因此我使用以下代码:

get-process -name "testxx" | where-object {$env:Client-Nr -eq "client-Two"}

它没有调用我需要的进程。我使用以下命令检查 PowerShell 是否识别私有环境变量:

(get-process -Name "testxx").StartInfo.EnvironmentVariables

PowerShell 无法识别此私有环境变量。但是,如果我打开“Process Hacker”,选择特定的“testxx”进程,我会看到私有环境变量“client-Nr”具有该特定的“Client-nr”值。我如何通过 PowerShell 调用这种私有环境变量?

答案1

这比你想象的要复杂得多,因为这些信息只能在内核中找到。详尽的文档GetEnvironmentStrings 仅适用于调用进程。

如果你想跨进程,你必须编写一个使用 NtQueryInformationProcess 函数ReadProcessMemory 函数 在进程内存中搜索该数据。

您可以在 CodeProject 演示程序中找到一些所需的代码 使用 NtQueryInformationProcess 获取进程信息

作为替代方案,你可以创建一个 DLL 并执行 DLL 注入 将其注入到进程的内存空间中。

正如我所说,这很复杂。

答案2

这很混乱,但使用 Python 并不复杂psutil.Process.environ()库函数

在一个终端

$ $ENV:test = 'abc'
$ $PID
108444

在另一个:

$ python -c 'import psutil; print(psutil.Process(pid=108444).environ()["TEST"])'
abc

(请注意,在 Windows 中变量名称是大写的。)


文档说:

注意:这可能无法反映流程开始后所做的更改。

但它似乎在 Windows 10 上实时更新。

相关内容