以Windows 7用户的身份覆盖HOMEDRIVE和HOMEPATH


49

我的雇主有一个Active Directory组策略,该策略将Windows 7便携式计算机HOMEDRIVE设置为“ M:”(映射的网络驱动器),而HOMEPATH设置为“ \”。由于我对该共享驱动器的根目录具有只读权限,因此无法在Windows主目录中创建文件或目录。我与IT部门合作的尝试均未成功。

有没有一种方式,全球在启动或登录时间改变这些envars?我需要所有应用程序使用备用值(例如“ C:”和“ \ Users \ myname”)。我安装了一些实用程序(如gvim等),这些实用程序将首选项文件存储在用户的主目录中。

重要信息:在“系统属性>环境变量”下更改这些envar 无效。我尝试将它们设置为用户变量和系统变量(包括重新启动)。SET HOME在DOS窗口中键入将清楚显示我的设置被忽略。此外,“在开始”使用Windows快捷方式也没有解决这个问题,因为我需要一个像资源管理器右键菜单项的东西(如“用Vim编辑”)正常工作。

我确实对该公司的笔记本电脑具有管理员权限,但我不是Win7专家。过去,引导脚本将在一分钟内解决此问题。今天有可能吗?谢谢。


2
您的IT部门设置这些策略是有原因的。如果您尝试与他们合作,但他们拒绝更改,则可能有充分的理由。如果您随后继续忽略他们的建议,并且与他们的要求背道而驰,如果您被抓到,则应采取纪律处分。
乔·泰勒

28
在这个行业工作了30多年之后,我了解到,普通PC用户的IT策略对于开发人员和高级用户通常是不够的(甚至是阻碍性的)。IT部门通常不得不以不同的方式满足开发人员的需求,如果这是他们这里的另一种学习经验,那么我很乐意提供帮助。我很想听听导致用户主目录无法使用的有效商业原因。
MykennaC 2011年

2
为什么不消除问题,表明它不适用于某些用户,并为此类用户提出单独的GPO。与尝试绕过黑客绕过域策略相比,以这种建设性的方式行之有效的可能性更大。
Joe Taylor

6
IT终于回到我身边。他们不会改变任何东西。是的,公司的官方政策是提供一个用户主目录,不允许我在该目录中创建文件。尝试将默认用户主目录用于首选项文件之类的Windows应用程序将失败。这里没有向导可以为我提供一些解决方法吗?
MykennaC 2011年

3
是的@ D0rf,他应该翻身并拿下它。如果IT使您无法完成工作,则需要为之奋斗并大惊小怪,直到它被更改为止。如果您是被动的开发人员,那么您应该在一家糟糕的公司中度过一生,而这家糟糕的公司没有为您提供工作所需的工具。
斯科特,

Answers:


38

以下是我开发的一些技巧。它们并不优雅,但可能在您的公司环境中起作用。

仅限HOMEDRIVE

似乎许多应用程序仅使用HOMEDRIVE / HOMEPATH。在这种情况下,您可以创建一个启动脚本,该脚本通过UNC驱动器管理路径将基本驱动器号重新映射到您的本地用户路径:

set HOME
HOMEDRIVE=G:
HOMEPATH=\
HOMESHARE=\\Server\Users\username

net use g: /delete
net use g: \\localhost\C$\Users\username

HOMEDRIVE本地默认

如果根本不需要按名称访问“服务器”,则可能导致组策略设置失败并退回到本地计算机。最简单的方法是将条目添加到C:\ Windows \ System32 \ drivers \ etc \ hosts,例如:

127.0.0.1   Server

重新启动后,您应该会看到类似以下内容的信息:

set HOME
HOMEDRIVE=C:
HOMEPATH=\Users\username

带有混合本地/远程UNC路径的HOMEDRIVE / SHARE

如果您想通过名称访问某些UNC路径的“服务器”,但要用本地路径覆盖其他服务器,则我开发了以下可憎的方法。注意:与“服务器”的直接服务器连接仍将解析到本地计算机。仅当“服务器”仅是文件服务器时,才建议使用此解决方案:

  1. 修改C:\ Windows \ System32 \ drivers \ etc \ hosts以将“服务器”重定向到本地计算机:

    127.0.0.1   Server
    
  2. 将以下多字符串注册表值添加到HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0,以允许将凭据传递到本地UNC路径:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\
    BackConnectionHostNames = Server
    
  3. 创建一个虚拟目录作为服务器的根目录:

    set DUMMY_LOC=C:\Server_Dummy
    
    mkdir %DUMMY_LOC%
    cd /D %DUMMY_LOC%
    
  4. 对于要定向到真实服务器的每个UNC路径:

    rem Alternatively you can use an IP below, but it is more likely to break if DNS changes
    set SERVER_FQDN=Server.network.blah.com
    
    rem Take a look at what's available...
    net view \\%SERVER_FQDN%\
    
    mklink /D Remote_Example \\%SERVER_FQDN%\Remote_Example
    net share Remote_Example=%DUMMY_LOC%\Remote_Example /grant:everyone,FULL
    
  5. 对于要在本地定义的每个UNC共享(例如“用户”):

    rem The link isn't really necessary for the share, I just find it easier to manage when all of these hacks are in the same directory
    
    mklink /D Users C:\Users
    net share Users=%DUMMY_LOC%\Users /grant:everyone,FULL
    
  6. 重启

对于此示例,这将允许解析以下UNC路径:

\\Server\Remote_Example => \\Server.network.blah.com\Remote_Example
\\Server\Users          => C:\Users

此路径解析应在驱动器映射之前进行。只要与映射关联的UNC路径有效(本地或远程),驱动器号就应按预期运行。

例如,在我的设置中,域强制以下变量:

set HOME
HOMEDRIVE=G:
HOMEPATH=\
HOMESHARE=\\Server\Users\username

但是由于我的映射,结果是:

G: => \\Server\Users\username => C:\Users\username

如果我在命令行中工作,这些建议似乎可能会有所帮助。为了影响一个应用程序(如gvim),我可能需要创建一个包装器。遍历所有受影响的应用程序似乎需要大量工作,更不用说更改文件关联等了。在启动时重新映射我的M:驱动器是一个很好的建议,但是如何在Windows启动时全局进行此操作(以便影响所有应用/外壳)?我希望这些建议对其他人有帮助,但我认为它们不能解决我的操作问题
MykennaC 2014年

3
我已经有一段时间不需要这些方法了,但是我记得专门为gvim开发了它们,我相信它们是使用HOMEDRIVE和HOMEPATH的。这些方法不需要您从命令行执行。使用变量或驱动器号的所有应用程序都将受到影响。方法#2和#3是“永久”的,只需执行一次即可使更改生效。通过在C:\ Users \ <You> \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup中放置快捷方式,或在Task Scheduler中设置任务,可以在启动时自动执行方法#1。我希望这有帮助!
Terrance

@terrance Ahhh,精心制作的可憎之美。LMAO。感谢您在此处提供的信息-这里有大量信息……
David I. McIntosh

3

我发现的最佳解决方案是在登录期间和之前设置变量userinit.exe

这就是我所做的。首先,在创建一个批处理文件C:\Windows\System32\userinit.cmd包含

@ECHO OFF
SET HOMEDRIVE=C:
SET HOMEPATH=\Users\%USERNAME%
SET HOMESHARE=\\localhost\C$\Users\%USERNAME%
@START C:\Windows\system32\userinit.exe

然后改变的值HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit,以C:\Windows\System32\userinit.cmd在注册表中。

有关更多信息,访问:https : //technet.microsoft.com/zh-cn/library/cc939862.aspx


在Win7中工作,但不在Win10中工作。
蚂蚁


0

我认为这些路径会自动设置为您的用户个人资料所在的位置。您所指的主驱动器是ntuser.dat和应用程序数据以及其他用户配置文件文件夹所在的位置,对吗?回到NT3.x,“用户配置文件”只是带有设置的用户注册表配置单元,您可以为每个用户设置单独的主目录。它们在NT4中作为用户配置文件与桌面,我的文档,开始菜单等统一在一起。

所有配置文件的位置都存储在注册表项下

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList

您会找到一些特殊配置文件和子项的值:一个用于系统上每个活动配置文件的值。它们由所属用户帐户的SID设置。找到您最简单的方法是滚动浏览每个查找正确的路径(在ProfileImagePath值下方)。您应该能够将该值更改为所需的任何路径。它将在您下次登录时生效。确保首先将文件复制到新路径。

如果必须将配置文件从您登录时使用的帐户中移出(即,以MikeC登录并尝试复制MikeC的配置文件),则ntuser.dat文件(包含的注册表配置单元HKEY_CURRENT_USER)将被内核锁定。您仍然可以复制配置单元:进入regedit,右键单击HKEY_CURRENT_USER,选择export,将类型更改为注册表配置单元文件,然后在新位置另存为ntuser.dat。

以我的经验,如果由于设置错误而导致winlogon在加载配置文件时遇到问题,它将根据默认配置文件创建新副本,或者为您提供用于该会话的临时副本,您仍然可以登录in。但是,我建议您在系统上使用其他管理员登录名,以防出现问题。


好吧,我的ProfileList中唯一看起来相关的项目是ProfileImagePath,它显示为C:\ Users \ mcepek。这与SET USERPROFILE向我显示的内容匹配,但这不是我的关注重点。我需要影响HOMEPATH和HOMEDRIVE。只是为了好玩,我在注册表中搜索了值或数据设置为“ M:”的项目(仅匹配整个字符串=已选中),并且仅提出了Computer / HKEY_USERS / xxxx / Volatile Environment / HOMEDRIVE。将其更改为C:在我当前的登录会话中似乎没有任何影响。重新启动后,该值恢复为M :(不足为奇)。
MykennaC 2012年


0

一个更简单的替代方法是在登录时将以下脚本(env-reset.vbs)作为计划任务运行,解锁并可能每隔几分钟运行一次。

Set shell = WScript.CreateObject("WScript.Shell")  
Set venv = shell.Environment("Volatile")  

scriptingHost = LCase(Right(Wscript.FullName,Len("cscript.exe")))
interactive = Wscript.Interactive And (scriptingHost = "cscript.exe")

If interactive Then 
  Wscript.Echo "WSCRIPT"
  Wscript.Echo "  ScriptingHost = " & scriptingHost
  Wscript.Echo "  FullName = " & Wscript.FullName
  Wscript.Echo "  ScriptFullName = " & Wscript.ScriptFullName
End If  

If interactive Then Call showVolatile()

homedrive = Left(venv("USERPROFILE"),2)
homepath = Mid(venv("USERPROFILE"),3)
If interactive Then 
  Wscript.Echo "COMPUTED"
  Wscript.Echo "  homedrive = " & homedrive
  Wscript.Echo "  homepath = " & homepath
End If  
venv("HOMEDRIVE") = homedrive
venv("HOMEPATH")  = homepath

If interactive Then Call showVolatile()

Wscript.Quit(0)

Sub showVolatile()
  Wscript.Echo "VOLATILE"
  Wscript.Echo "  USERPROFILE = " & venv("USERPROFILE")  
  Wscript.Echo "  HOMEDRIVE = " & venv("HOMEDRIVE")  
  Wscript.Echo "  HOMEPATH = " & venv("HOMEPATH")  
  Wscript.Echo "  HOMESHARE = " & venv("HOMESHARE")  
End Sub
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.