我试图用C#编写Windows服务.我需要找到某个文件的路径,该文件存储在环境变量中.在常规的C#控制台应用程序中,我可以通过以下行实现:
string t = System.Environment.GetEnvironmentVariable("TIP_HOME");
如果我把它写到控制台,我发现它是成功的.
现在,如果我在Windows服务中尝试相同的代码,则该字符串t
为空.
知道为什么吗?
我不知道这是否有用,但我发现对于每个服务,都可以选择将环境变量直接添加到服务中.
它是通过注册表完成的.
说服务的关键是......
HKLM \系统\ CurrentControlSet \服务\ YourService
创建一个名为Environment的REG_MULTI_SZ.
现在你可以添加像......这样的条目
Var1=Value1 Var2=Value2
这些将可用于服务代码.
如果您使用Windows资源工具包将脚本作为服务安装(instsrv.exe和srvany.exe),那么,您可以选择为服务设置环境变量,但很可能是错误的,因为这些将是srvany.exe.
相反,你使用密钥......
HKLM \系统\ CurrentControlSet \服务\ YourService \参数
并创建一个名为AppEnvironment的REG_MULTI_SZ
以相同的方式设置条目.
现在你的脚本服务有它自己的环境变量.
我在PHP + WinCache中使用这些技术,允许我为每个服务设置唯一的APP_POOL_ID,允许WinCache为所有"线程"共享中央缓存(基于APP_POOL_ID)(使用WShell启动非阻塞子线程) "并且仍然与启动器共享相同的WinCache,允许简单的进程间通信.
无论如何.我希望这有点帮助.
我认为,总的来说,你没有在全球环境中添加不必要的env_vars.当你有超过1时,你可以保持目标和唯一.
问候,
理查德.
你的问题似乎就像我们经历的那样,并且可以非常难以弄清楚发生了什么.
发生的情况是添加/删除/更改环境变量时,服务环境在"重新启动"之前无法识别.这是因为这些环境变量存储在注册表中,并且此注册表仅在系统启动时由服务环境读取一次.
这意味着为了使服务能够获取环境变量的变化,需要进行系统重启.
在此查看Microsoft KB.
该服务可能在不同的帐户下运行,并且没有获得相同的环境变量.