在Windows中永久更改环境变量

21

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

图片描述

图片描述

图片描述

这将把主目录更改为C:

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

图片描述

它仍然是H:,使用系统重启后,Windows设置中的环境变量也将返回到H:/

我还尝试了以下更改:

图片描述

它似乎有效,但是如果我打开一个新的cmd,则会恢复到H:/

现在我正在尝试这样做,以便OpenSSH能够将C识别为我的主目录,而不是网络驱动器H:,强制OpenSSH除非我通过VPN连接到了大学网络,否则无法工作。

我应该怎么做才能永久地设置并让OpenSSH知道这个更改?


如果环境变量正在还原,则很可能涉及组策略。您是机器的管理员吗?该机器是否加入了域? - Harry Johnston
一个选项是编写一个批处理文件,更改环境变量,然后启动OpenSSH。 - Harry Johnston
OpenSSH的确切版本是什么?我的意思是,如果你是从cygwin运行它,你可以尝试https://dev59.com/CHI_5IYBdhLWcg3wK_3E中的`/etc/passwd`修复方法。 - azhrei
@azhrei 如果我可以永久更改环境变量,那对我来说大部分情况下都能起作用。 - Fantastic Mr Fox
7个回答

12

在任何地方都没有提到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 对于一个离题问题的恰当回答,聪明。 :-) 当然,原帖作者并没有说他是否拥有管理员权限,甚至没有说明它是本地账户还是AD账户,但你的猜测是合理的。 - Harry Johnston
我在一个未加入域的Windows 7计算机上使用了这个脚本,对本地的“用户和组”进行了脚本更新,而不是远程LDAP或AD。OP似乎具有管理员权限,因为他可以更新环境变量,只是无法使它们保持不变。 - joocer
事实上,如果你仔细看,你会发现他正在更新用户环境变量,这并不需要管理员特权。 - Harry Johnston

7
听起来像是域上的AD配置正在覆盖用户定义的变量。我看到你的截图显示你已连接到eait.org.edu.au域,这将是你问题的根源。在此提供一些我在其他地方发现的细节,可能对你有所帮助:
HOMEDRIVE、HOMEPATH和HOMESHARE是通过Active Directory设置和更新的。即使在账户上没有设置家庭驱动器,HOMEDRIVE和HOMEPATH也会被设置;但是它们将被AD中设置的任何用户账户属性覆盖。
另请参阅以下KB文章:
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,就会始终正确设置主目录驱动器。


2
更改这些环境变量的值不被“支持”,至少它不会按照您的预期工作,因为Windows会将它们改回原来的值。
根据这篇Microsoft知识库文章(KB841343),如果您需要更改这些设置,应该使用策略。该文章还包含如何执行此操作的链接(但就我个人而言,我从未尝试过)。请注意,该文章最初是针对Windows 2000编写的,但我强烈怀疑它仍然适用于当前的Windows版本。

它并没有真正解释如何永久更改变量,它只是提到了组权限的事情,但没有实际的说明,有没有进一步解释的机会? - Fantastic Mr Fox
抱歉,不是很确定 - 就像我说的,我从未尝试过。这个链接可能会或可能不会有所帮助:http://support.microsoft.com/kb/816313。 - Christian.K

0
在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不会将其更改回来? - Fantastic Mr Fox
一定有个bug。我已经使用SETX和ADSI来编辑HOMEDRIVE并重新启动了我的电脑,但是我得到了以下结果:ADSI识别了自己的更新,而SETX显示在系统属性屏幕上(如果您使用/M,则会显示在底部,没有/M则在顶部),但是命令行仍然显示C:。现在,根据您查看的内容,我有四个不同的主目录。 - joocer
我的问题还是你的问题?你是说你用SETX永久设置成功了,因为我好像没能做到。 - Fantastic Mr Fox
Windows出现了一个错误,它显示了一个与该值的任何来源都不匹配的值。注册表与我使用SETX键入的内容相匹配,但与我在命令行上看到的不同。 - joocer
@Ben:编写批处理文件可以消除永久更改变量的需要,前提是(如您的问题所示)重要的只是OpenSSH看到的内容。 - Harry Johnston

0

我曾经遇到过类似的问题,HOMEDRIVE变量被设置为U:,而这是一个我们不再使用的驱动器。这只是针对一个特定的用户。我进入AD中该用户的个人资料,并点击属性编辑器选项卡。那里有一个名为HOMEDRIVE的属性,我将其从U:更改为C: - 当用户再次登录时,它被正确地设置了。我还在此处更新了HomeDirectory属性。


-1

这个问题一直让我很沮丧,试图找到解决方案,但我已经找到了我认为是最终答案,并在以下位置发布:

https://dev59.com/4Kzla4cB1Zd3GeqPBsBy#60235759

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


-3

在Windows 8上:

  1. 按下“Windows键”。
  2. 输入“系统环境变量”。
  3. 允许“高级系统设置”进行更改。
  4. 选择“高级”选项卡。
  5. 点击“环境变量...”。
  6. 从“用户变量”中的“Path”中双击。
  7. 在新路径后面添加要分号分隔的新路径变量。

    例如:C:\Program Files\;C:\Python27\


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接