Substituindo HOMEDRIVE e HOMEPATH como um usuário do Windows 7

45

Meu empregador tem uma política de grupo do Active Directory que define meu HOMEDRIVE do Windows 7 para "M:" (uma unidade de rede mapeada) e meu HOMEPATH para "\". Como tenho permissões somente leitura para a raiz dessa unidade compartilhada, não consigo criar arquivos ou diretórios no diretório inicial do Windows. Minhas tentativas de trabalhar com o departamento de TI não tiveram sucesso.

Existe uma maneira de me alterar globalmente esses envars na inicialização ou no tempo de login? Eu preciso de aplicativos all para usar valores alternativos (como "C:" e "\ Users \ myname"). Tenho alguns utilitários instalados (como o gvim e outros) que armazenam arquivos de preferências no diretório inicial do usuário.

IMPORTANTE : Alterar estes envars em "Propriedades do sistema > Variáveis de ambiente" não funciona . Eu tentei defini-las como variáveis de usuário e de sistema (incluindo uma reinicialização). Digitar SET HOME em uma janela do DOS mostra claramente que minhas configurações são ignoradas. Além disso, usando "Iniciar em" em um atalho do Windows também não resolver isso, pois preciso de coisas como itens de menu de contexto do Explorer (como "Editar com Vim") para operar corretamente.

Eu tenho direitos de administrador neste laptop da empresa, mas não sou um guru do Win7. De volta ao dia, um script de inicialização teria resolvido isso em um minuto. É mesmo possível hoje? Obrigado.

    
por MykennaC 09.03.2011 / 23:57

6 respostas

36

Abaixo estão alguns hacks que eu desenvolvi. Eles não são elegantes, mas podem ser funcionais em seu ambiente corporativo.

HOMEDRIVE Apenas

Parece que muitos aplicativos usam apenas HOMEDRIVE / HOMEPATH. Nesse caso, você pode criar um script de inicialização que remapeie a letra da unidade base para o caminho do usuário local por meio do caminho de administração da unidade UNC:

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

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

HOMEDRIVE Padrão local

Se você não precisar acessar "Servidor" pelo nome, poderá fazer com que a configuração da política de grupo falhe e retorne à sua máquina local. A maneira mais fácil de fazer isso é adicionar uma entrada ao C: \ Windows \ System32 \ drivers \ etc \ hosts como:

127.0.0.1   Server

Após a reinicialização, você verá algo como:

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

HOMEDRIVE / SHARE com Caminhos UNC Híbridos Locais / Remotos

Se você quiser acessar "Servidor" por nome para alguns caminhos UNC, mas substituir outros por caminhos locais, desenvolvi a seguinte abominação. Nota: as conexões diretas do servidor para "Servidor" ainda serão resolvidas para sua máquina local. Eu recomendo esta solução somente se "Servidor" for apenas um servidor de arquivos:

  1. Modifique C: \ Windows \ System32 \ drivers \ etc \ hosts para redirecionar "Servidor" para sua máquina local:

    127.0.0.1   Server
    
  2. Adicione o seguinte valor de registro Multi-String a HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0 para permitir que as credenciais sejam passadas para o caminho UNC local:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\
    BackConnectionHostNames = Server
    
  3. Crie um diretório fictício que servirá como a raiz do servidor:

    set DUMMY_LOC=C:\Server_Dummy
    
    mkdir %DUMMY_LOC%
    cd /D %DUMMY_LOC%
    
  4. Para cada caminho UNC que você deseja direcionar ao servidor real:

    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. Para cada compartilhamento UNC que você deseja definir localmente (como Usuários):

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

Para o exemplo, isso permitiria que os seguintes caminhos UNC fossem resolvidos:

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

Esta resolução de caminho deve ocorrer antes dos mapeamentos de unidade. Desde que os caminhos UNC associados aos mapeamentos sejam válidos (sejam locais ou remotos), as letras de unidade devem se comportar conforme o esperado.

Por exemplo, na minha configuração, as seguintes variáveis são forçadas pelo domínio:

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

Mas devido aos meus mapeamentos, o resultado é:

G: => \Server\Users\username => C:\Users\username
    
por 05.10.2012 / 17:34
3

A melhor solução que encontrei foi definir variáveis durante o login e antes de userinit.exe .

Isso é o que eu fiz. Primeiro criou um arquivo de lote em C:\Windows\System32\userinit.cmd contendo

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

e, em seguida, alterou o valor de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit para C:\Windows\System32\userinit.cmd no registro.

Mais informações em: link

    
por 04.08.2016 / 07:05
1

Eu usei SETX em um script de inicialização e isso funcionou para mim. Veja minha resposta .

    
por 15.11.2012 / 07:24
0

Acho que esses caminhos são automaticamente definidos para o local em que seu perfil de usuário está. A unidade inicial a que você está se referindo é o local em que seus dados do ntuser.dat e do aplicativo e outras pastas de perfil do usuário estão, correto? De volta ao NT3.x, o "perfil de usuário" era apenas o registro do usuário com configurações e você poderia definir um caminho de início separado para cada usuário. Eles se uniram no NT4 como um perfil de usuário com um desktop, meus documentos, menu de início, etc.

As localizações de todos os perfis são armazenadas em chaves de registro em

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

Você encontrará alguns valores para os perfis e subchaves especiais: um para cada perfil ativo no sistema. Eles são configurados pelo SID da conta do usuário a que pertencem. A maneira mais fácil de encontrar o seu seria percorrer cada um deles procurando o caminho certo (sob o valor ProfileImagePath ). Você deve poder apenas alterar esse valor para qualquer caminho que desejar; Ele entrará em vigor na próxima vez que você fizer logon. Certifique-se de copiar seus arquivos para o novo caminho primeiro.

Se você tiver que mover o perfil da conta em que está logado (ou seja, logado como MikeC e você está tentando copiar o perfil para MikeC) o arquivo ntuser.dat (a seção de registro contendo HKEY_CURRENT_USER ) será ser bloqueado pelo kernel. Ainda é possível copiar a ramificação: vá para regedit, clique com o botão direito do mouse em HKEY_CURRENT_USER , selecione exportar, altere o tipo para os arquivos da seção de registro e salve como ntuser.dat em sua nova localização.

Na minha experiência, se o winlogon tiver um problema ao carregar um perfil porque algo está configurado errado, ele criará uma nova cópia do perfil padrão ou fornecerá uma cópia temporária a ser usada para essa sessão, e você ainda estará capaz de fazer login. No entanto, eu recomendo que você tenha um login admin diferente para usar no sistema caso algo dê errado.

    
por 17.08.2011 / 08:19
0

Eu estou postando isso no caso de alguém chegar a essa pergunta via google. Em vez de mudar meu diretório pessoal e deixar os caras do IS com raiva de mim, eu configurei e executei meu desenvolvimento em uma máquina virtual. A Microsoft oferece o Widows XP no modo virtual. link

    
por 03.04.2013 / 23:28
0

Uma alternativa um pouco mais fácil seria executar o script abaixo (env-reset.vbs) como uma tarefa agendada no logon, desbloqueio e talvez a cada poucos minutos também.

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
    
por 24.09.2014 / 17:42