在 Windows 中永久更改环境变量

Posted

技术标签:

【中文标题】在 Windows 中永久更改环境变量【英文标题】:Permanently Change Environment Variables in Windows 【发布时间】:2012-08-09 07:33:26 【问题描述】:

我找到了一种更改用户默认主目录的方法,但我遇到了麻烦。

这样做会将主驱动器更改为 C:

但是当我检查环境变量时:

还是H:,系统重启后windows设置里的环境变量也会回到H:/

我也试过这样改:

这似乎可行,但如果我打开一个新的 cmd,它将恢复为 H:/

现在我正在尝试这样做,以便 OpenSSH 将 C 识别为我的主目录,而不是 H:,这是一个网络驱动器,迫使 OpenSSH 无法工作,除非我通过 *** 连接到我的大学网络。

在 OpenSSH 的眼中,我可以做些什么来永久设置它?

【问题讨论】:

如果环境变量正在恢复,很可能涉及到组策略。你是机器的管理员吗?机器是否加入了域? 一种选择是编写一个更改环境变量的批处理文件,然后启动 OpenSSH。 OpenSSH 到底是什么版本?我的意思是,如果你是从 cygwin 运行它,你可以尝试 ***.com/questions/1494658/… 中的 /etc/passwd 修复?? @azhrei 好吧,如果我可以永久更改环境变量,它将对我有用。 【参考方案1】:

我遇到了类似的问题,HOMEDRIVE 变量设置为 U: 这是我们不再使用的驱动器。这仅适用于一个特定用户。我在 AD 中访问了该用户的个人资料并单击了属性编辑器选项卡。 HOMEDRIVE 有一个属性,我将其从 U: 更改为 C: - 当用户再次登录时,它设置正确。我还在这里更新了 HomeDirectory 属性。

【讨论】:

【参考方案2】:

这个问题一直让我在寻找解决方案时感到非常沮丧,但我找到了我认为是明确的答案并将其发布在:

https://***.com/a/60235759/12903197

您需要运行“net user USERNAME /homedir:PATH”,其中 USERNAME 是您尝试更改的用户的名称,PATH 是所需主文件夹的驱动器号和完整路径,该主文件夹必须已经存在。

【讨论】:

【参考方案3】:

在 Windows 8 上:

    点击“Windows 键”。 输入“系统环境变量”。 允许“高级系统设置”进行更改。 选择“高级”标签。 单击“环境变量...”。 双击“XXXXXXXXX 的用户变量”中的“路径”

    在变量末尾添加您想要用分号分隔的新路径。

    例如C:\Program Files\;C:\Python27\ 共享编辑删除(1)标志

【讨论】:

【参考方案4】:

听起来域上的 AD 配置文件正在覆盖用户定义的变量。我看到您的屏幕截图显示您已连接到 eait.org.edu.au 域。那将是您问题的根源。只是在这里包含一些我在其他地方发现的细节,这可能对您有所帮助:

HOMEDRIVE、HOMEPATH 和 HOMESHARE 是通过 Active Directory 设置和更新的。 HOMEDRIVE 和 HOMEPATH 即使没有在帐户上设置主驱动器也已设置;但是它们将被 AD 中设置的任何用户帐户属性覆盖。

另请参阅这些知识库文章:

http://support.microsoft.com/kb/841343
http://support.microsoft.com/kb/237566
http://support.microsoft.com/kb/101507 

在旁注中以另一种方式解决该问题:

-我过去创建了一个 Windows 命令行 shell 可执行文件的新实例,它自动运行自定义脚本,因此每次启动 shell 时,环境变量都可以被覆盖。

-为此,您可以将发布的用于更改环境变量的代码放入批处理脚本中,存储在您喜欢的任何位置,然后通过转到属性编辑用于启动 shell 的快捷方式 > 然后更改目标框:%SystemRoot%\system32\cmd.exe /K "C:\Documents and Settings\Administrator\My Documents\customshellscript.cmd" (显然/K后面的部分路径是你自定义脚本的位置)

这样,如果您仍然在控制台上使用 openSSH,它将始终正确设置 homedrive。

【讨论】:

【参考方案5】:

它没有提到 HOMEDRIVE 值和 HOMEDIRECTORY 值之间的依赖关系,发生的事情(我认为)是它未能将主目录映射到 HOMEDRIVE,因此默认返回到安全值(C :)

我编写了一个脚本来更新本地 AD,将 [] 中的值替换为您的值。复制并粘贴到 .vbs 文件中,然后双击运行它。

Set objUser = GetObject("WinNT://[COMPUTERNAME]/[USERNAME],user")
objUser.homeDirDrive = "H:"
objUser.HomeDirectory = "[URNPATH]"
objUser.SetInfo

例如

Set objUser = GetObject("WinNT://UQBDART-2328/BEN,user")
objUser.homeDirDrive = "H:"
objUser.HomeDirectory = "\\SERVER\SHARE"
objUser.SetInfo

运行它,重新启动并测试。它对我有用。

【讨论】:

+1 获得题外话的答案,聪明。 :-) 当然,OP没有说他是否具有管理员权限,甚至是本地帐户还是AD帐户,但是您的猜测是合理的。 我在一个非域的 Windows 7 机器上使用了这个脚本,脚本更新到本地“用户和组”而不是远程 LDAP 或 AD。 OP 似乎具有管理员权限,因为他可以更新环境变量,但他无法让它们坚持下去。 其实如果你仔细看你会发现他正在更新用户环境变量,这不需要管理员权限。【参考方案6】:

在 DOS 时代,环境变量是程序段的一部分,这意味着您基本上可以获得一个本地快照库,该快照库仅限于该程序的范围。

我猜 Windows 并没有改变这一点,并且 CMD 窗口可用的环境变量只有该窗口的范围和它产生的任何其他窗口。这个小实验支持这一点:

在 CMD 窗口类型中

set homedrive=h:\

然后通过键入来测试它是否已更新

set h

来自同一个窗口类型

start cmd

在这个新的窗口类型中

set h

完成此操作后,我得到 HOMEDRIVE=H:\

如果我只是从开始菜单打开一个新的 CMD 窗口并执行相同的 SET H 我得到 HOMEDRIVE=C:\

我对 OpenSSH 一无所知,但我怀疑 START CMD 获得了更新的 HOMEDRIVE 环境变量,如果你编写一个批处理来更新环境变量,然后执行 OpenSSH 就可以了。

【讨论】:

这是一个很好的答案,但它并不是我所希望的,编写批处理文件不会解决永久更改变量的问题。你如何去改变它,这样windows就不会把它改回来? 某处一定有错误。我使用 SETX 和 ADSI 来编辑 HOMEDRIVE 并重新启动我的 PC 我得到以下信息: ADSI 识别出它自己的更新,并且 SETX 显示在系统属性屏幕上(如果您使用 /M,它会在底部,没有 /M 在top) 但命令行仍然显示 C:。我现在有四种不同的家庭驱动器,具体取决于您所看到的。 我的一个错误或你的一个错误,你是说你用 SETX 永久设置它,因为我似乎做不到。 Windows 的错误,它显示的值与该值的任何来源都不匹配。注册表与我使用 SETX 键入的内容相匹配,但与我在命令行上看到的内容不同。 @Ben:编写批处理文件无需永久更改变量,前提是(正如您的问题所暗示的)所有重要的是 OpenSSH 所看到的。【参考方案7】:

“不支持”更改这些环境变量的值,至少它不会像您预期的那样工作,因为 Windows 会将它们更改回来。

根据这个Microsoft knowledge base article (KB841343),如果您需要更改这些设置,您应该使用策略。这篇文章还包含如何做到这一点的链接(但就个人而言,我从未尝试过)。请注意,这篇文章最初是为 Windows 2000 编写的,但我强烈怀疑它仍然适用于当前的 Windows 版本。

【讨论】:

它并没有真正解释如何永久更改变量,它说的是关于组权限的内容但没有实际说明,是否有机会进一步解释? 对不起,不是真的 - 正如我所说的,我从未尝试过。 This 可能有帮助,也可能没有帮助。

以上是关于在 Windows 中永久更改环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 中使用 shell 脚本永久设置环境变量

如何永久设置Windows环境变量?

dos命令临时和永久设置环境变量方法

是否可以从 Python 永久设置环境变量?

DOS永久设置系统环境变量-WMIC

Windows系统命令行设置环境变量