Przesłanianie HOMEDRIVE i HOMEPATH jako użytkownik systemu Windows 7

49

Mój pracodawca ma zasady grupy Active Directory, które ustawiają mój laptop HOMEDRIVE dla Windows 7 na „M:” (zmapowany dysk sieciowy), a mój HOMEPATH na „\”. Ponieważ mam uprawnienia tylko do odczytu dla katalogu głównego tego udostępnionego dysku, nie mogę tworzyć plików ani katalogów w moim katalogu domowym systemu Windows. Moje próby współpracy z działem IT zakończyły się niepowodzeniem.

Czy istnieje sposób, abym mógł globalnie zmienić te envary podczas uruchamiania lub logowania? Potrzebuję, aby wszystkie aplikacje używały wartości alternatywnych (takich jak „C:” i „\ Users \ moja nazwa”). Mam zainstalowane narzędzia (takie jak gvim i inne), które przechowują pliki preferencji w katalogu domowym użytkownika.

WAŻNE : Zmiana tych envarów w „Właściwości systemu> Zmienne środowiskowe” nie działa . Próbowałem ustawić je jako zmienne użytkownika i systemowe (w tym ponowne uruchomienie). Wpisanie SET HOMEw oknie DOS wyraźnie pokazuje, że moje ustawienia są ignorowane. Również użycie „Rozpocznij w” w skrócie Windows również nie rozwiąże tego, ponieważ potrzebuję takich rzeczy, jak elementy menu kontekstowego Eksploratora (takie jak „Edytuj za pomocą Vima”), aby działać poprawnie.

Mam uprawnienia administratora do tego firmowego laptopa, ale nie jestem guru Win7. Wcześniej skrypt rozruchowy rozwiązałby to za chwilę. Czy to w ogóle możliwe dzisiaj? Dzięki.

MykennaC
źródło
2
Twój dział IT ustalił te zasady nie bez powodu. Jeśli próbowałeś to z nimi wypracować, a oni odmówili ich zmiany, prawdopodobnie jest to dobry powód. Jeśli nadal będziesz ignorować ich rady i sprzeciwiać się temu, o co prosili, przygotuj się na postępowanie dyscyplinarne, jeśli zostaniesz przyłapany.
Joe Taylor,
28
Po ponad 30 latach w tej branży dowiedziałem się, że polityka IT dla przeciętnego użytkownika komputera jest często nieodpowiednia (a nawet przeszkadzająca) dla programistów i zaawansowanych użytkowników. Dział IT często musiał inaczej dostosowywać się do potrzeb programistów, a jeśli jest to dla nich kolejne takie doświadczenie edukacyjne, chętnie pomogę. Chciałbym usłyszeć ważny powód biznesowy, aby uczynić katalog domowy użytkownika bezużytecznym.
MykennaC,
2
Dlaczego nie rozwiązać problemu, pokazać, że jest on niewykonalny dla niektórych użytkowników i zaproponować oddzielny obiekt zasad grupy dla takich użytkowników. Poruszanie się w ten konstruktywny sposób jest znacznie bardziej prawdopodobne niż próba obejścia zasad domeny za pomocą hacków.
Joe Taylor,
6
W końcu do mnie wróciło. Nic nie zmienią. Tak, oficjalną polityką firmy jest zapewnienie katalogu domowego użytkownika, w którym nie wolno mi tworzyć plików. Aplikacje Windows, które próbują użyć domyślnego katalogu domowego użytkownika do takich rzeczy, jak pliki preferencji, zawiodą. Czy nie ma tu żadnego czarodzieja, który mógłby mi to obejść?
MykennaC
3
tak @ D0rf, powinien przewrócić i po prostu wziąć. Jeśli IT uniemożliwia Ci pracę, musisz walczyć i podnosić zamieszanie, dopóki się nie zmieni. Jeśli jesteś pasywnym programistą, zasługujesz na swoje życie w strasznej firmie, która nie zapewnia narzędzi potrzebnych do pracy.
Scott

Odpowiedzi:

38

Poniżej kilka opracowanych przeze mnie hacków. Nie są eleganckie, ale mogą działać w środowisku korporacyjnym.

Tylko HOMEDRIVE

Wygląda na to, że wiele aplikacji używa tylko HOMEDRIVE / HOMEPATH. W takim przypadku możesz utworzyć skrypt startowy, który odwzorowuje literę dysku podstawowego na ścieżkę lokalnego użytkownika za pomocą ścieżki administratora dysku UNC:

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

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

HOMEDRIVE Lokalne domyślne

Jeśli nie potrzebujesz w ogóle uzyskiwać dostępu do „Serwer”, możesz spowodować, że ustawienie zasad grupy nie powiedzie się i wróci na komputer lokalny. Najłatwiej to zrobić, dodając wpis do C: \ Windows \ System32 \ drivers \ etc \ hosts, takich jak:

127.0.0.1   Server

Po ponownym uruchomieniu powinieneś zobaczyć coś takiego:

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

HOMEDRIVE / SHARE z hybrydowymi lokalnymi / zdalnymi ścieżkami UNC

Jeśli chcesz uzyskać dostęp do „Serwera” według nazwy dla niektórych ścieżek UNC, ale zastępujesz inne ścieżkami lokalnymi, opracowałem następującą obrzydliwość. Uwaga: bezpośrednie połączenia serwera z „Serwerem” nadal będą rozpoznawane na twoim komputerze lokalnym. Polecam to rozwiązanie tylko wtedy, gdy „Serwer” to tylko serwer plików:

  1. Zmodyfikuj C: \ Windows \ System32 \ drivers \ etc \ hosts, aby przekierować „Serwer” na komputer lokalny:

    127.0.0.1   Server
    
  2. Dodaj następującą wartość rejestru Multi-String do HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0, aby umożliwić przekazywanie poświadczeń do lokalnej ścieżki UNC:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\
    BackConnectionHostNames = Server
    
  3. Utwórz katalog zastępczy, który będzie służył jako katalog główny serwera:

    set DUMMY_LOC=C:\Server_Dummy
    
    mkdir %DUMMY_LOC%
    cd /D %DUMMY_LOC%
    
  4. Dla każdej ścieżki UNC, którą chcesz skierować do prawdziwego serwera:

    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. Dla każdego udziału UNC, który chcesz zdefiniować lokalnie (takiego jak Użytkownicy):

    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. Restart

Na przykład pozwoliłoby to na rozwiązanie następujących ścieżek UNC:

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

Ta rozdzielczość ścieżki powinna wystąpić przed mapowaniem dysku. Dopóki ścieżki UNC powiązane z odwzorowaniami są prawidłowe (lokalne lub zdalne), litery dysków powinny zachowywać się zgodnie z oczekiwaniami.

Na przykład w moim ustawieniu domena wymusza następujące zmienne:

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

Ale z powodu moich mapowań wynik jest następujący:

G: => \\Server\Users\username => C:\Users\username
Terrance
źródło
Te sugestie wydają się być pomocne, JEŚLI pracowałem w wierszu poleceń. Aby wpłynąć na aplikację (np. Gvim) prawdopodobnie musiałbym utworzyć opakowanie. Iteracja po wszystkich aplikacjach, których dotyczy problem, to dużo pracy, nie wspominając o zmianie skojarzeń plików itp. Ponowne mapowanie dysku M: podczas rozruchu jest dobrą sugestią, ale jak to zrobić globalnie po uruchomieniu systemu Windows (aby wpłynąć na wszystkie aplikacje / powłoki)? Mam nadzieję, że te sugestie pomogą innym, ale nie sądzę, aby rozwiązały mój OP
MykennaC
3
Od dawna nie potrzebowałem tych metod, ale pamiętam, że opracowałem je specjalnie dla gvim, który moim zdaniem używa HOMEDRIVE i HOMEPATH. Te metody nie wymagają wykonywania z wiersza poleceń; wpłynie to na wszystkie aplikacje korzystające ze zmiennych lub litery dysku. Metoda nr 2 i nr 3 są „trwałe” i muszą zostać wykonane tylko raz, aby zmiany zostały utrzymane. Metoda nr 1 może być automatycznie wykonana przy uruchomieniu poprzez umieszczenie skrótu w C: \ Users \ <You> \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup lub skonfigurowanie zadania w Harmonogramie zadań. Mam nadzieję, że to pomoże!
Terrance
@terrance Ahhh, piękno dobrze spreparowanych obrzydliwości. LMAO. Dziękuję za informacje tutaj - a jest ich mnóstwo ...
David I. McIntosh
3

Najlepszym rozwiązaniem, jakie znalazłem, było ustawienie zmiennych podczas logowania i wcześniej userinit.exe.

Oto co zrobiłem. Najpierw utworzono plik wsadowy C:\Windows\System32\userinit.cmdzawierający

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

a następnie zmieniono wartość HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinitna C:\Windows\System32\userinit.cmdw rejestrze.

Więcej informacji na: https://technet.microsoft.com/en-us/library/cc939862.aspx

Ali Malekpour
źródło
Pracował w Win7, ale nie w Win10.
Mrówki
1

Użyłem SETXw skrypcie startowym i to działało dla mnie. Zobacz moją odpowiedź .

Mark Mikofski
źródło
0

Myślę, że te ścieżki są automatycznie ustawiane w miejscu, w którym znajduje się Twój profil użytkownika. Dysk domowy, o którym mówisz, to miejsce, w którym znajdują się twoje dane ntuser.dat i aplikacji oraz inne foldery profilu użytkownika, prawda? W wersji NT3.x „profil użytkownika” był tylko gałęzią rejestru użytkowników z ustawieniami i dla każdego użytkownika można było ustawić osobną ścieżkę główną. Zostały one ujednolicone w NT4 jako profil użytkownika z pulpitem, moimi dokumentami, menu Start itp.

Lokalizacje wszystkich profili są przechowywane w kluczach rejestru pod

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

Znajdziesz kilka wartości dla profili specjalnych i podkluczy: po jednej dla każdego aktywnego profilu w systemie. Są one konfigurowane przez SID konta użytkownika, do którego należą. Najłatwiejszym sposobem na znalezienie twojego byłoby przewinięcie każdego z nich w poszukiwaniu właściwej ścieżki (pod ProfileImagePathwartością). Powinieneś być w stanie zmienić tę wartość na dowolną ścieżkę; wejdzie w życie przy następnym logowaniu. Najpierw skopiuj pliki do nowej ścieżki.

Jeśli musisz przenieść profil z konta, na którym jesteś zalogowany (tj. Zalogowany jako MikeC i próbujesz skopiować profil dla MikeC), plik ntuser.dat (zawierający gałąź rejestru HKEY_CURRENT_USER) zostanie zablokowany przez jądro. Nadal możesz skopiować ul: przejdź do regedit, kliknij prawym przyciskiem myszy HKEY_CURRENT_USER, wybierz eksport, zmień typ na rejestruj pliki gałęzi i zapisz jako ntuser.dat w nowej lokalizacji.

Z mojego doświadczenia wynika, że ​​jeśli winlogon ma problem z ładowaniem profilu, ponieważ coś jest źle skonfigurowane, albo utworzy nową kopię z profilu domyślnego, albo da tymczasową kopię do użycia dla tej sesji i nadal będziesz mógł się zalogować w. Jednak polecam, abyś miał inny login administratora do użycia w systemie na wypadek, gdyby coś poszło nie tak.

Chris Smith
źródło
Cóż, jedynym elementem w mojej ProfileList, który wydaje się odpowiedni, jest ProfileImagePath, który pokazuje się jako C: \ Users \ mcepek. To pasuje do tego, co pokazuje SET USERPROFILE, ale nie na tym się skupiam. Muszę wpłynąć na HOMEPATH i HOMEDRIVE. Dla zabawy przeszukałem mój rejestr w poszukiwaniu elementów o wartościach lub danych ustawionych na „M:” (dopasuj tylko cały ciąg = zaznaczone) i wymyśliłem tylko Komputer / HKEY_USERS / xxxx / Volatile Environment / HOMEDRIVE. Zmiana na C: nie wydawała się mieć żadnego wpływu na moją bieżącą sesję logowania. Po ponownym uruchomieniu wartość powróciła do M: (nie jest to niespodzianką).
MykennaC
0

Zamieszczam to na wypadek, gdyby ktokolwiek zadał to pytanie za pośrednictwem Google. Zamiast zmieniać mój katalog domowy i denerwować mnie facetami z IS, skonfigurowałem i uruchomiłem programowanie na maszynie wirtualnej. Microsoft oferuje Widows XP w trybie wirtualnym. http://www.microsoft.com/windows/virtual-pc/download.aspx

Christine Gregory Nicholls
źródło
0

Nieco łatwiejszą alternatywą byłoby uruchomienie poniższego skryptu (env-reset.vbs) jako zaplanowanego zadania podczas logowania, odblokowywania, a może także co kilka minut.

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
camilohe
źródło