可以通过Windows登录脚本设置系统环境变量吗?

时间:2009-02-25 23:02:50

标签: scripting login batch-file windows-installer automated-deploy

我有一个MSI打包的应用程序,它通过组策略对象(GPO)从Windows 2003域服务器部署到网络中的所有XP客户端计算机。

此应用程序为其配置读取两个环境变量(要与之通信的服务器IP),似乎我们还希望通过GPO样式设置或登录脚本将此配置推送到所有桌面。

在桌面网络中设置环境变量的最佳方法是什么?

3 个答案:

答案 0 :(得分:14)

我的研究表明有四种方法可以做到这一点。我从Microsoft Logon Script documentation pages and fanned out from there开始。

登录脚本批处理文件

Windows Server 2000,2003,2008

登录批处理文件(.BAT)脚本只是CMD窗口的临时实例,一旦登录窗口关闭,其中设置的环境变量就会消失。

set MYVAR=MyValue

由于上述原因无效。

所以,或者,我可以尝试通过直接写入注册表来设置变量,就像系统环境变量一样:

reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v MYVAR /t REG_EXPAND_SZ /d MyValue

或像这样的用户环境变量:

reg add HKCU\Environment /v MYVAR /t REG_EXPAND_SZ /d MyValue 

这里的缺点是变量虽然写入了注册表,但在下次登录之前我才能看到它。在用户重新登录之前,新的CMD窗口不显示它们的痕迹。


登录脚本WSH VBS文件

Windows Server 2000,2003,2008

使用Visual Basic脚本(VBS)登录脚本,您可以使用更具编程性的方法来访问环境变量。这看起来像我最可行的方法。 This example would append to the end of PATH

Set WSHShell = WScript.CreateObject("WScript.Shell")
Set WshEnv = WshShell.Environment("SYSTEM")
WshEnv("Path") = WshEnv("Path") & ";M:\DB\whatever\"

这个例子只是设置变量。

Set WSHShell = WScript.CreateObject("WScript.Shell")
Set WshEnv = WshShell.Environment("SYSTEM")
WshEnv("MYVAR") = "MyNewValue"

此方法产生可通过CMD窗口立即获得的变量。不需要像批处理文件注册表那样重新启动。


ADM文件

Windows Server 2000,2003,2008

ADM文件是一种向组策略编辑器公开设置的自定义功能的方法。在域控制器上安装和显示它们似乎很棘手,所以我跳过了这个选项。

Microsoft Support TechNet Reference on ADM File Locations.
Another article about ADM files and using them to set Registry settings.
Tom's Hardware on ADM Files.

---- set.adm ---- 
CLASS MACHINE 
CATEGORY "Environment" 
POLICY "Self dfined variables" 
KEYNAME "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" 
PART "Set MyVar1 =" EDITTEXT 
DEFAULT "MyValue1" 
VALUENAME MyVar1 ; EXPANDABLETEXT 
; add expandabletext if it can contain Variables itself 
END PART 
END POLICY 
END CATEGORY 
---- set.adm ----


组策略首选项(GPP)

Windows Server 2008

Windows Server 2008 h as a new feature调用了Environment Extensions for the Group Policy Preferences。它允许您方便地设置否则需要复杂的批处理脚本。公开的新项目包括注册表值,环境变量等。 A quick how-to guide is available here

我无法使用此选项,因为我的客户端没有Windows Server 2008。


摘要

请根据您作为Windows管理员的经验告诉我哪些最有效,以及为什么。我只是一名桌面开发人员,需要管理员的洞察力。

答案 1 :(得分:2)

为什么不能将此配置嵌入到MSI的Property表中(使用转换后构建)然后从那里读取?这将更有意义...启动Orca,添加几个属性,保存转换并通过GPO部署并应用转换。

编辑:只需重新阅读此问题...然后将设置部署到注册表并从那里读取应用程序,而不是设置环境变量。从管理员的角度来看,为一个应用程序设置全局环境变量是没有意义的。

答案 2 :(得分:2)

您始终可以通过登录脚本设置环境变量。当然!

我们就是这样做的:

不要使用“set”,因为它不会被接管到用户环境中。使用“set”设置的变量在登录脚本运行时才有效。

使用“setx”。

因此,要在用户环境中设置变量

setx MYSPECIALVAR THIS_IS_THE_VALUE

setx Softwaresource  \\\this\is\the\value\of\the\variable

(注意:=没有set MYSPECIALVAR=THIS_IS_THE_VALUE符号

}

如果用户在PC上拥有管理权限,您还可以使用

在global-system-envrionment中设置变量
setx MYSPECIALVAR THIS_IS_THE_VALUE /m

(这就是我们在具有安装脚本和管理权限的PC中部署变量的方式)