C# 展开Process.Start命令的环境变量,使用为子进程特制的环境

C# 展开Process.Start命令的环境变量,使用为子进程特制的环境,c#,environment-variables,exec,spawn,C#,Environment Variables,Exec,Spawn,将使用进程的环境块展开变量 Process.Start接受一个ProcessStartInfo,它具有一个配置新进程的环境块的 如何使用为子进程而不是属于父进程的环境块来扩展命令(可执行文件名和参数列表)?因为它是进程范围的资源,并且会干扰其他线程中可能发生的并发环境访问 是我重新创建ExpandEnvironmentVariables控制盘或通过cmd/c传递命令的唯一选项(这意味着对引用的参数进行额外的转义)我也看不到任何其他选项。在我看来,重新设计ExpandEnvironmentVari

将使用进程的环境块展开变量

Process.Start
接受一个
ProcessStartInfo
,它具有一个配置新进程的环境块的

如何使用为子进程而不是属于父进程的环境块来扩展命令(可执行文件名和参数列表)?因为它是进程范围的资源,并且会干扰其他线程中可能发生的并发环境访问


是我重新创建
ExpandEnvironmentVariables
控制盘或通过
cmd/c
传递命令的唯一选项(这意味着对引用的参数进行额外的转义)

我也看不到任何其他选项。在我看来,重新设计
ExpandEnvironmentVariables
控制盘,使用一个接受
EnvironmentVariables
参数的重载将是最容易实现的结果。我看了一下,实施起来并不可怕。大多数复杂性在于使用适当的权限从Win32 API中查找环境变量,这不适用于重载。主要是确保遵循他们的贪婪匹配算法。@PatrickRoberts:不幸的是,引用实现相当短,因为它将所有繁重的工作委托给内核32.dll中的
ExpandEnvironmentStrings
API函数。该函数不仅要查找环境变量,还要识别输入字符串中的替换代码(同时要注意引用,这是迄今为止最困难的部分)并执行替换。字符串外的循环捕获变量名称实际上并不一定是正确的,因为误报会使安全检查过于严格,而不是一个漏洞。@Partick但是,.NET引用实现中确实存在严重的TOCTOU漏洞,可能导致未经授权的信息泄露。。。注释表明程序员认为“在调用这个函数时可能会改变某些环境变量”,但是没有考虑“在调用这个函数时可能创建一些环境变量”。或它对“代码>环境PurmithAccess的准确性的影响”。第一个循环将返回变量列表,作为
ViscanRead
,但是如果在第532行的调用之前创建了
MIGHTBECREATED
,而不是返回
%mightBecreatedBehingWhatiwannasTeal%
,通过安全检查,最终结果是
ShinNewsViscanReadSuperSecret
。哎呀!