การเอาชนะ HOMEDRIVE และ HOMEPATH ในฐานะผู้ใช้ Windows 7


49

นายจ้างของฉันมีนโยบายกลุ่ม Active Directory ซึ่งกำหนดให้ Windows 7 laptop HOMEDRIVE เป็น "M:" (ไดรฟ์เครือข่ายที่แมป) และ HOMEPATH ของฉันเป็น "\" เนื่องจากฉันมีสิทธิ์แบบอ่านอย่างเดียวสำหรับรูทของไดรฟ์ที่ใช้ร่วมกันนั้นฉันจึงไม่สามารถสร้างไฟล์หรือไดเรกทอรีในโฮมไดเร็กตอรี่ windows ของฉันได้ ความพยายามในการทำงานกับแผนกไอทีของฉันไม่ประสบความสำเร็จ

มีวิธีที่ฉันจะเปลี่ยน envars เหล่านี้ทั่วโลกในเวลาบูตหรือเข้าสู่ระบบ? ฉันต้องการให้ทุกแอปพลิเคชันใช้ค่าทางเลือก (เช่น "C:" และ "\ Users \ myname") ฉันมียูทิลิตี้ที่ติดตั้งบางตัว (เช่น gvim และอื่น ๆ ) ที่เก็บไฟล์การกำหนดค่าตามความชอบในไดเรกทอรีบ้านของผู้ใช้

สำคัญ : การเปลี่ยน envars เหล่านี้ภายใต้ "ตัวแปรที่ System Properties> สิ่งแวดล้อม" ไม่ทำงาน ฉันได้ลองตั้งค่าเหล่านี้เป็นทั้งตัวแปรผู้ใช้และระบบ (รวมถึงการรีบูต) การพิมพ์SET HOMEในหน้าต่าง DOS แสดงให้เห็นชัดเจนว่าการตั้งค่าของฉันถูกละเว้น นอกจากนี้การใช้ "เริ่มต้น" ในทางลัดของ Windows จะไม่แก้ปัญหานี้ด้วยเนื่องจากฉันต้องการสิ่งต่าง ๆ เช่นรายการเมนูบริบทของ Explorer (เช่น "แก้ไขด้วย Vim") เพื่อให้ทำงานได้อย่างถูกต้อง

ฉันมีสิทธิ์ผู้ดูแลระบบบนแล็ปท็อปของ บริษัท นี้ แต่ฉันไม่ใช่คุรุ Win7 ย้อนกลับไปในวันนี้สคริปต์การบูตจะสามารถแก้ไขได้ภายในหนึ่งนาที วันนี้เป็นไปได้ไหม ขอบคุณ


2
แผนกไอทีของคุณได้กำหนดนโยบายเหล่านี้ด้วยเหตุผล หากคุณพยายามที่จะทำงานกับพวกเขาและพวกเขาปฏิเสธที่จะเปลี่ยนมันอาจมีเหตุผลที่ดี หากคุณยังคงเพิกเฉยต่อคำแนะนำของพวกเขาและต่อต้านสิ่งที่พวกเขาขอให้เตรียมการลงโทษทางวินัยหากคุณถูกจับ
Joe Taylor

28
หลังจากกว่า 30 ปีในอุตสาหกรรมนี้ฉันได้เรียนรู้ว่านโยบายไอทีสำหรับผู้ใช้พีซีโดยเฉลี่ยมักไม่เพียงพอ (หรือขัดขวางได้) สำหรับนักพัฒนาและผู้ใช้ที่มีอำนาจ บ่อยครั้งที่มันต้องมีการรองรับความต้องการของนักพัฒนาที่แตกต่างกันและถ้านี่เป็นอีกประสบการณ์การเรียนรู้สำหรับพวกเขาที่นี่ฉันก็ยินดีที่จะช่วย ฉันชอบที่จะได้ยินเหตุผลทางธุรกิจที่ถูกต้องในการสร้างไดเรกทอรีบ้านของผู้ใช้ไม่ได้
MykennaC

2
สาเหตุที่ไม่ละทิ้งปัญหาแสดงว่าไม่สามารถใช้งานได้สำหรับผู้ใช้บางรายและเสนอ GPO แยกต่างหากสำหรับผู้ใช้ดังกล่าว การย้ายด้วยวิธีที่สร้างสรรค์นี้มีแนวโน้มที่จะทำงานได้ดีกว่าการพยายามหลีกเลี่ยงนโยบายโดเมนด้วยแฮ็ก
Joe Taylor

6
ในที่สุดก็กลับมาหาฉัน พวกเขาจะไม่เปลี่ยนแปลงอะไรเลย ใช่นโยบายของ บริษัท อย่างเป็นทางการคือการให้ไดเรกทอรีบ้านของผู้ใช้ที่ฉันไม่ได้รับอนุญาตให้สร้างไฟล์ แอปพลิเคชัน Windows ที่พยายามใช้โฮมไดเรกทอรีผู้ใช้เริ่มต้นสำหรับสิ่งต่าง ๆ เช่นไฟล์การกำหนดค่าตามความชอบจะล้มเหลว ไม่มีตัวช่วยสร้างที่นี่ที่สามารถเสนอวิธีแก้ปัญหาให้ฉันได้ไหม?
MykennaC

3
ใช่ @ D0rf เขาควรเกลือกกลั้วและรับไป หากฝ่ายไอทีทำให้งานของคุณเป็นไปไม่ได้คุณจะต้องต่อสู้และเอะอะจนเกิดความเปลี่ยนแปลง หากคุณเป็นนักพัฒนาที่มีความอดทนคุณจะได้รับสิ่งดีๆมากมายในชีวิตที่ บริษัท ที่น่ากลัวซึ่งไม่ได้มอบเครื่องมือที่คุณต้องการสำหรับงานของคุณ
สกอตต์

คำตอบ:


38

ด้านล่างนี้เป็นแฮ็กที่ฉันพัฒนาขึ้นมา มันไม่ได้สวยงาม แต่อาจใช้งานได้ในสภาพแวดล้อมขององค์กรของคุณ

บ้านเกิดเท่านั้น

ดูเหมือนว่าแอปพลิเคชันจำนวนมากจะใช้ HOMEDRIVE / HOMEPATH เท่านั้น ในกรณีดังกล่าวคุณสามารถสร้างสคริปต์เริ่มต้นที่แมปอักษรไดรฟ์พื้นฐานไปยังเส้นทางผู้ใช้ภายในเครื่องของคุณผ่านเส้นทางผู้ดูแลระบบไดรฟ์ UNC:

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

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

HOMEDRIVE Local Default

หากคุณไม่จำเป็นต้องเข้าถึง "เซิร์ฟเวอร์" ตามชื่อคุณสามารถทำให้การตั้งค่านโยบายกลุ่มล้มเหลวและถอยกลับไปที่เครื่องของคุณ วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการเพิ่มรายการไปยังC: \ Windows \ System32 \ drivers \ etc \ hostsเช่น:

127.0.0.1   Server

หลังจากรีบูตเครื่องคุณควรเห็นสิ่งต่อไปนี้:

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

HOMEDRIVE / แบ่งปันกับเส้นทาง UNC ไฮบริด / ระยะไกล

หากคุณต้องการเข้าถึง "เซิร์ฟเวอร์" ตามชื่อสำหรับเส้นทาง UNC บางส่วน แต่แทนที่เส้นทางอื่นด้วยเส้นทางในพื้นที่ฉันได้พัฒนาสิ่งที่น่ารังเกียจต่อไปนี้ หมายเหตุ: การเชื่อมต่อเซิร์ฟเวอร์โดยตรงกับ "เซิร์ฟเวอร์" จะยังคงแก้ไขไปยังเครื่องท้องถิ่นของคุณ ฉันแนะนำวิธีแก้ปัญหานี้เฉพาะเมื่อ "เซิร์ฟเวอร์" เป็นไฟล์เซิร์ฟเวอร์เท่านั้น:

  1. ปรับเปลี่ยนC: \ Windows \ System32 \ drivers \ etc \ hostsเพื่อเปลี่ยน "เซิร์ฟเวอร์" ไปยังเครื่องท้องถิ่นของคุณ:

    127.0.0.1   Server
    
  2. เพิ่มค่ารีจิสทรีMulti-Stringต่อไปนี้ลงใน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. Reboot

ตัวอย่างเช่นสิ่งนี้จะช่วยให้เส้นทาง 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 เริ่มทำงาน ปพลิเคชัน / เปลือกหอย)? ฉันหวังว่าคำแนะนำเหล่านี้จะช่วยผู้อื่น แต่ฉันไม่คิดว่าพวกเขาจะแก้ไข OP ของฉัน
MykennaC

3
ฉันไม่ได้ต้องการวิธีการเหล่านี้ในขณะที่ แต่ฉันจำได้ว่าพวกเขาพัฒนาเฉพาะสำหรับ gvim ซึ่งฉันเชื่อว่าใช้ HOMEDRIVE และ HOMEPATH วิธีการเหล่านี้ไม่ต้องการให้คุณดำเนินการจากบรรทัดคำสั่ง แอปพลิเคชันใด ๆ ที่ใช้ตัวแปรหรืออักษรชื่อไดรฟ์จะได้รับผลกระทบทั้งหมด วิธีที่ # 2 และ # 3 เป็น "ถาวร" และจะต้องดำเนินการเพียงครั้งเดียวเพื่อให้การเปลี่ยนแปลงเปลี่ยนแปลง วิธีที่ # 1 สามารถดำเนินการโดยอัตโนมัติเมื่อเริ่มต้นด้วยการวางทางลัดใน Menu \ Programs \ Startup C: \ Users \ <You> \ AppData \ Roaming \ Microsoft \ Windows \ Start หรือตั้งค่างานใน Task Scheduler ฉันหวังว่านี่จะช่วยได้!
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/en-us/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เลือกส่งออกเปลี่ยนประเภทเป็นไฟล์ไฮฟ์ของรีจิสทรีและบันทึกเป็น ntuser.dat ที่ตำแหน่งใหม่ของคุณ

จากประสบการณ์ของฉันถ้า winlogon มีปัญหาในการโหลดโปรไฟล์เพราะมีบางอย่างผิดพลาดมันจะสร้างสำเนาใหม่จากโปรไฟล์เริ่มต้นหรือให้สำเนาชั่วคราวเพื่อใช้สำหรับเซสชันนั้นและคุณจะยังสามารถเข้าสู่ระบบได้ อย่างไรก็ตามฉันขอแนะนำให้คุณลงชื่อเข้าใช้งานแบบผู้ดูแลระบบคนอื่นเพื่อใช้กับระบบในกรณีที่มีสิ่งผิดปกติเกิดขึ้น


รายการเดียวใน ProfileList ของฉันที่มีความเกี่ยวข้องคือ ProfileImagePath ซึ่งแสดงเป็น C: \ Users \ mcepek ตรงกับสิ่งที่ SET USERPROFILE แสดงให้ฉันเห็น แต่นั่นไม่ใช่จุดเน้นของฉันที่นี่ ฉันต้องการส่งผลต่อ HOMEPATH และ HOMEDRIVE เพื่อความสนุกฉันค้นหารีจิสตรีด้วยรายการที่มีค่าหรือชุดข้อมูลเป็น "M:" (จับคู่ทั้งสตริงเท่านั้น = ตรวจสอบแล้ว) และมาพร้อมกับคอมพิวเตอร์ / HKEY_USERS / xxxx / สภาพแวดล้อมที่เปลี่ยนแปลงได้ / HOMEDRIVE เปลี่ยนเป็น C: ดูเหมือนจะไม่มีผลกระทบใด ๆ ในเซสชันการเข้าสู่ระบบปัจจุบันของฉัน หลังจากรีบูตค่ากลับเป็น M: (ไม่แปลกใจ)
MykennaC

0

ฉันกำลังโพสต์สิ่งนี้ในกรณีที่คนอื่นมาถึงคำถามนี้ผ่านทาง Google แทนที่จะเปลี่ยนโฮมไดเร็กตอรี่ของฉันและทำให้พวก IS เป็นบ้าฉัน, ฉันติดตั้งและเริ่มพัฒนาบนเครื่องเสมือน Microsoft เสนอ Widows XP ในโหมดเสมือน http://www.microsoft.com/windows/virtual-pc/download.aspx


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.