当前位置:  开发笔记 > 编程语言 > 正文

从Windows服务访问环境变量

如何解决《从Windows服务访问环境变量》经验,为你挑选了3个好方法。

我试图用C#编写Windows服务.我需要找到某个文件的路径,该文件存储在环境变量中.在常规的C#控制台应用程序中,我可以通过以下行实现:

string t = System.Environment.GetEnvironmentVariable("TIP_HOME");

如果我把它写到控制台,我发现它是成功的.

现在,如果我在Windows服务中尝试相同的代码,则该字符串t为空.

知道为什么吗?



1> 小智..:

我不知道这是否有用,但我发现对于每个服务,都可以选择将环境变量直接添加到服务中.

它是通过注册表完成的.

说服务的关键是......

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时,你可以保持目标和唯一.

问候,

理查德.



2> Scott Saad..:

你的问题似乎就像我们经历的那样,并且可以非常难以弄清楚发生了什么.

发生的情况是添加/删除/更改环境变量时,服务环境在"重新启动"之前无法识别.这是因为这些环境变量存储在注册表中,并且此注册表系统启动时由服务环境读取一次.

这意味着为了使服务能够获取环境变量的变化,需要进行系统重启.

在此查看Microsoft KB.


但请注意,这仅适用于在本地系统帐户下运行的服务.对于在指定用户帐户下运行的服务,他们*将在重新启动后从注册表中获取环境更改.

3> EBGreen..:

该服务可能在不同的帐户下运行,并且没有获得相同的环境变量.

推荐阅读
手机用户2402851155
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有