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

50

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

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

IMPORTANTE : A alteração desses ambientes em "Propriedades do sistema> Variáveis ​​de ambiente" não funciona . Tentei defini-las como variáveis ​​de usuário e de sistema (incluindo uma reinicialização). Digitar SET HOMEem uma janela do DOS mostra claramente que minhas configurações são ignoradas. Além disso, o uso de "Iniciar em" em um atalho do Windows também não resolverá isso, pois preciso que itens como o menu de contexto do Explorer (como "Editar com o Vim") funcionem corretamente.

Eu tenho direitos de administrador neste laptop da empresa, mas não sou um guru do Win7. Voltar no dia, um script de inicialização teria resolvido isso em um minuto. Ainda é possível hoje? Obrigado.

MykennaC
fonte
2
Seu departamento de TI definiu essas políticas por um motivo. Se você tentou resolver o problema com eles e eles se recusaram a alterá-lo, provavelmente existe um bom motivo. Se você continuar ignorando os conselhos deles e for contra o que eles pediram, prepare uma ação disciplinar se você for pego.
Joe Taylor
29
Depois de mais de 30 anos nesse setor, aprendi que a política de TI para o usuário médio de PC geralmente é inadequada (ou mesmo obstrutiva) para desenvolvedores e usuários avançados. Muitas vezes, a TI precisou acomodar as necessidades dos desenvolvedores de maneira diferente, e se essa é outra experiência de aprendizado para eles aqui, fico feliz em ajudar. Gostaria de ouvir um motivo comercial válido para tornar o diretório pessoal de um usuário inutilizável.
MykennaC
2
O motivo pelo qual não resolver o problema, mostra que ele é impraticável para determinados usuários e propõe um GPO separado para esses usuários. Mover dessa maneira construtiva tem muito mais probabilidade de funcionar do que tentar ignorar as políticas de domínio com hacks.
Joe Taylor
6
Finalmente voltou para mim. Eles não vão mudar nada. Sim, a política oficial da empresa é fornecer um diretório inicial do usuário onde eu não tenha permissão para criar arquivos. Aplicativos do Windows que tentam usar o diretório inicial do usuário padrão para coisas como arquivos de preferência falharão. Não existe um assistente aqui que possa me oferecer alguma solução alternativa para isso?
MykennaC
3
sim @ D0rf, ele deve rolar e pegar. Se a TI impossibilitar o seu trabalho, você precisará lutar e fazer barulho até que ele seja alterado. Se você é um desenvolvedor passivo, merece muito na vida de uma empresa terrível que não fornece as ferramentas necessárias para o seu trabalho.
Scott

Respostas:

38

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

Apenas HOMEDRIVE

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

Padrão local do HOMEDRIVE

Se você não precisar acessar "Servidor" pelo nome, poderá causar falha na configuração da diretiva de grupo e retornar à sua máquina local. A maneira mais fácil de fazer isso é adicionar uma entrada em 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 locais / remotos híbridos

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

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

    127.0.0.1   Server
    
  2. Adicione o seguinte valor do Registro de seqüência múltipla a HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0 para permitir que 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 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 para o 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. Reiniciar

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

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

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

Por exemplo, na minha instalaçã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
Terrance
fonte
Essas sugestões parecem que podem ajudar se eu estivesse trabalhando na linha de comando. Para afetar um aplicativo (como o gvim), eu provavelmente precisaria criar um wrapper. A iteração sobre todos os aplicativos afetados parece muito trabalhosa, sem mencionar a alteração de associações de arquivos etc. Remapear minha unidade M: no momento da inicialização é uma boa sugestão, mas como fazer isso globalmente quando o Windows iniciar (para afetar todos aplicativos / conchas)? Espero que essas sugestões irão ajudar os outros, mas eu não acho que eles resolver o meu OP
MykennaC
3
Não preciso desses métodos há algum tempo, mas lembro de desenvolvê-los especificamente para o gvim, que acredito estar usando o HOMEDRIVE e o HOMEPATH. Esses métodos não exigem que você execute a partir da linha de comando; todos os aplicativos que usam as variáveis ​​ou a letra da unidade serão todos afetados. Os métodos 2 e 3 são "permanentes" e precisam ser executados apenas uma vez para que as alterações sejam mantidas. O método 1 pode ser executado automaticamente na inicialização, colocando um atalho em C: \ Usuários \ <Você> \ AppData \ Roaming \ Microsoft \ Windows \ Menu Iniciar \ Programas \ Inicialização ou configurando uma tarefa no Agendador de Tarefas. Eu espero que isso ajude!
Terrance
@terrance Ahhh, a beleza de abominações bem feitas. RINDO MUITO. Obrigado pela informação aqui - e há toneladas aqui ...
David I. McIntosh
3

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

Foi o que eu fiz. Primeiro, criei um arquivo em lote C:\Windows\System32\userinit.cmdcontendo

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

e depois alterou o valor de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinitpara C:\Windows\System32\userinit.cmdno registro.

Mais informações em: https://technet.microsoft.com/en-us/library/cc939862.aspx

Ali Malekpour
fonte
Trabalhou no Win7, mas não no Win10.
Formigas
1

Eu usei SETXem um script de inicialização e que funcionou para mim. Veja minha resposta .

Mark Mikofski
fonte
0

Eu acho que esses caminhos são definidos automaticamente para o local onde está o seu perfil de usuário. A unidade inicial a que você está se referindo é o local onde estão os dados do ntuser.dat e dos aplicativos e outras pastas de perfil de usuário, correto? De volta ao NT3.x, o "perfil do usuário" era apenas a seção de registro do usuário com as configurações e você podia definir um caminho inicial separado para cada usuário. Aqueles se uniram no NT4 como um perfil de usuário com uma área de trabalho, meus documentos, menu Iniciar etc.

Os locais de todos os perfis são armazenados nas chaves do Registro em

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

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

Se você precisar mover o perfil da conta em que está logado (ou seja, logado como MikeC e estiver tentando copiar o perfil para MikeC), o arquivo ntuser.dat (a seção de registro que contém HKEY_CURRENT_USER) será bloqueado pelo kernel. Você ainda pode copiar a seção: entre no regedit, clique com o botão direito do mouse HKEY_CURRENT_USER, selecione exportar, altere o tipo para arquivos da seção de registro e salve como ntuser.dat em seu novo local.

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 para usar nessa sessão e você ainda poderá fazer logon No entanto, eu recomendaria que você tivesse um login de administrador diferente para usar no sistema, caso algo desse errado.

Chris Smith
fonte
Bem, o único item na minha ProfileList que parece relevante é ProfileImagePath, que é exibido como C: \ Users \ mcepek. Isso corresponde ao que SET USERPROFILE me mostra, mas esse não é o meu foco aqui. Eu preciso afetar o HOMEPATH e o HOMEDRIVE. Apenas por diversão, procurei no meu registro itens com valores ou dados definidos como "M:" (corresponder apenas a seqüência inteira = marcada) e criei apenas um computador / HKEY_USERS / xxxx / Volatile Environment / HOMEDRIVE. Mudá-lo para C: não pareceu afetar minha sessão de login atual. Após uma reinicialização, o valor voltou a M: (não é uma surpresa).
9139 MykennaC
0

Estou postando isso no caso de mais alguém chegar a essa pergunta via google. Em vez de alterar meu diretório pessoal e deixar os caras do IS furiosos comigo, configurei e executei meu desenvolvimento em uma máquina virtual. A Microsoft oferece o Windows XP no modo virtual. http://www.microsoft.com/windows/virtual-pc/download.aspx

Christine Gregory Nicholls
fonte
0

Uma alternativa um pouco mais fácil seria executar o script abaixo (env-reset.vbs) como uma tarefa agendada no logon, desbloquear 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
camilohe
fonte