【发布时间】:2016-03-22 13:04:22
【问题描述】:
我在使用 ASP.NET Web 应用程序中运行的 Oracle 客户端时遇到了一些问题。经过一番检查,我发现问题可能是Environment.GetEnvironmentVariable("Path") 返回了错误的值。
如果我在控制台应用程序中调用该方法,它会返回正确的值。如果我在 ASP.NET Web 应用程序中调用它,它会返回另一个(错误)值,我无法在系统属性或 Windows 注册表中找到该值。
我的 ASP.NET 应用程序在本地 IIS 下运行,并且 AppPool 身份设置为我的用户(与运行控制台应用程序相同)。
为了确认我在两个应用程序上检查了以下属性并且值相同:
System.Security.Principal.WindowsIdentity.GetCurrent().NameEnvironment.UserName
我尝试查看GetEnvironmentVariable 的源代码,但它基本上包含了对Win32 方法GetEnvironmentVariable 的调用(该源代码“显然”不可用)。
我错过了什么?
经过一些检查,我注意到即使我在控制台应用程序中获得的值也与我在那里找到的不同:
那么 GetEnvironmentVariable 的“来源”是什么?
Microsoft says说进程环境变量是从父进程加载的,所以我检查了w3wp.exe进程层次结构。如下:
wininit.exe -> services.exe -> svchost.exe -> w3wp.exe
wininit、services 和 svchost 作为 SYSTEM 运行。
wininit 和服务路径环境变量包含我可以在系统属性(“系统环境变量”)中找到的值。 svchost 具有不同的值,因此(可能)我在控制台应用程序中获得的值与我在 ASP.NET Web 应用程序中获得的值之间存在差异的原因是svchost 编辑了这个值。
【问题讨论】:
-
我恳请您澄清您所说的“错误值”是什么意思。环境就是环境;也许它正在为您预测的用户/进程上下文返回环境。您能否详细说明为什么您认为这是“错误的”?
-
@DavidW 使用“错误”是指配置的值不同(来自系统属性),但是在最新更新之后,似乎即使我在控制台应用程序中获得的值也不同这些值