Como tornar o mapeamento SUBST persistente nas reinicializações?

177

O Windows (XP ou posterior) possui uma maneira integrada de criar mapeamentos de unidade persistentes, como os criados pelo SUBST? Encontrei uma ferramenta de terceiros psubst . Existe uma maneira de fazer isso sem ferramentas de terceiros?

rick
fonte
É possível, porque psubsté apenas um arquivo .bat que acompanha o registro. Consulte a resposta da @ davr abaixo para obter detalhes.
Scott Stafford
Nota do artigo da Wikipedia na resposta aceita: " A partir do Windows Vista, os arquivos excluídos são imediatamente excluídos permanentemente e não são movidos para a" Lixeira ". Antes do Windows Vista (no Windows XP, por exemplo), os arquivos eram substituídos" discos "foram movidos para a Lixeira quando excluídos. "
JMD 27/01
1
@ IvoFlipse, essa é uma boa suposição em geral, mas, neste caso, está errada. A 'ferramenta de terceiros' é um arquivo em lotes de 150 linhas que fornece um bom cli para modificar um registro e limpar a entrada para atender às substexigentes regras de barra final, mas é apenas um invólucro bonito . Você pode fazer isso sem um programa, e o README para psubstexplica como. Ou, veja a resposta de davr abaixo, onde ele cita o psubst README.
Alexanderbird #
Eu adicionei uma resposta que corrige o problema da lixeira
Tony Pulokas

Respostas:

153

Bem, a Wikipedia menciona :

C:\>SUBST /?
Associates a path with a drive letter.

SUBST [drive1: [drive2:]path]
SUBST drive1: /D

  drive1:        Specifies a virtual drive to which you want to assign a path.
  [drive2:]path  Specifies a physical drive and path you want to assign to
                 a virtual drive.
  /D             Deletes a substituted (virtual) drive.

Type SUBST with no parameters to display a list of current virtual drives.

Assim, você pode associar caminhos às letras de unidade usando subst. O software Persistent SUBST command (psubst) parece ser bastante útil e fornece uma solução para executá-lo desde a inicialização:

https://code.google.com/p/psubst/#Inconstancy

Inconstância

No entanto, a reinicialização de um sistema destrói um disco virtual. O que fazer? Um disco pode ser criado após a inicialização. Mas o que fazer quando um disco é necessário nas etapas iniciais de uma inicialização? Por exemplo, para executar serviços? Há um recurso do sistema para iniciar um disco virtual a partir do registro do sistema:

REGEDIT4 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices] 
"Z:"="\\??\\C:\\Documents and Settings\\All Users\\Shared Documents"

Basta criar um arquivo de texto com a extensão .REGe executá-lo. Na próxima inicialização de um sistema, o disco virtual existirá no logon. Ele precisa definir um nome de disco e caminho. Observe que cada barra invertida no caminho é duplicada.

No Windows, você pode executar o editor de registro da seguinte maneira:

  1. Iniciar »Executar ... (ou pressione Win+ R)
  2. Tipo: regedit
  3. No Windows Vista e superior, o UAC será exibido, clique em "Sim" .
Ivo Flipse
fonte
6
É bom saber, mesmo que eu não use substmais. Mas nos tempos em que eu costumava, simplesmente havia um arquivo em lotes na minha pasta de inicialização que fazia essas coisas.
Joey
2
Isso é incrível. (Requer uma reinicialização, FYI.) Nossa árvore de origem precisa iniciar a partir de uma letra de unidade específica para que todos os nossos PDBs sempre se alinhem em computadores diferentes. Essa configuração de registro resolve um aborrecimento que tive durante anos com um disco secundário não estar lá com runas, o que é um grande aborrecimento se você precisar (raramente) executar o Visual Studio em uma conta de administrador.
Brian Reiter
3
Joey: Essa solução parece não funcionar no Windows 7. Ao executar um aplicativo com privilégios administrativos, a unidade substituída não fica visível para o aplicativo.
Dave Jarvis
31
Obrigado pela solução. Para sua informação, se você digitar a variável no RegEdit interativamente, não duplique as barras invertidas. Ou seja, crie uma nova variável de string denominada "Z:" (sem as aspas) e defina o valor para a string mostrada acima, exceto com barras invertidas únicas.
Crispy
3
@ Devil'sAdvocate, \??é um diretório virtual no namespace do gerenciador de objetos do NT. Primeiro, ele verifica os 'dispositivos' da sessão de logon do DOS (na verdade, os dispositivos do DOS são links simbólicos para os dispositivos NT, geralmente localizados em \Device) e depois os \Global??dispositivos do DOS. No WinObj, você encontrará os dispositivos de sessão de logon \Sessions\0\DosDevices\[logon ID]. Observe que todos os dispositivos da sessão de logon são rastreados na sessão 0 (serviços) para cada ID de logon do LSA. Eles não estão correlacionados com as sessões da área de trabalho. É por isso que se você mapear uma unidade como um administrador limitado, ela não existe quando elevada; é um logon diferente.
Eryk Sun
76

Instalá-lo em HKEY_CURRENT_USERtem o benefício de ter configurações diferentes para cada usuário. Prefiro manter a configuração do espaço do usuário, desde que um serviço do sistema não dependa do dispositivo.

REGEDIT4
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
"F Drive"="subst F: D:\\mount\\db"
"G Drive"="subst G: D:\\mount\\log"

Fonte: http://networkadminkb.com/KB/a446/how-to-use-drive-letters-mount-points-the-same-disk-drive.aspx

166_MMX
fonte
7
+1 Para mostrar como fazer vários mapeamentos em um arquivo reg. :-)
megaflop 15/05
4
+1 para facilitar isso e também explicar o porquê HKEY_CURRENT_USER. :)
CAD bloke
1
+1 para mostrar uma maneira muito elegante de fazer isso automagicamente sem um lote na pasta de inicialização
dkellner
3
Também pode fazer isso a partir da linha de comando (desde XP / Windows Server 2000): reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "F Drive" /d "subst F: D:\x\db" NB \ só precisa escapar aqui se é o último caractere do comando subst, por exemplo, quando o alvo é o diretório raiz: "subst F: D:\\"; um único \ não seria interpretado como escapar da "segui-lo.
stevek_mcc
45

Há uma resposta na página que você vinculou. Você não precisa da ferramenta de terceiros, pode fazê-lo com uma simples entrada de registro, conforme detalhado nessa página.

Crie um arquivo de texto chamado 'mapdrive.reg' com este conteúdo:

REGEDIT4 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices] 
"Z:"="\\??\\C:\\Documents and Settings\\All Users\\Shared Documents" 

Em seguida, basta clicar duas vezes nele para configurar, sem a necessidade de ferramentas de terceiros.

davr
fonte
8
a vantagem para a chave reg contra o arquivo de lote é que ele define a unidade subst antes de qualquer outra inicialização comandos prazo, no caso de alguns daqueles precisam da subst conduzir à função
davr
6
@ Ivo: Eu diria que é um medo saudável do desconhecido;)
Isxek
9
Se fizer isso no regedit, use barras invertidas únicas. por exemplo, \ ?? \ C: \ Some \ Directory
Droj,
27

Descobri isso porque estava procurando uma melhoria nos scripts de inicialização - eles funcionavam bem, mas às vezes eram executados depois que as pastas travavam na inicialização porque minha unidade ainda não estava mapeada.

Primeiro, editei o registro, mas não consegui fazê-lo funcionar. No entanto, me deparei com essa alternativa, que, embora não use subst, responde para mim a pergunta: "Como tornar o mapeamento SUBST persistente durante as reinicializações?" Não use subst ... (insira 'computerName' e 'pathName' apropriados):

net use u: "\\ nome_do_computador \ c $ \ nome_do_caminho" / persistente: sim

Eu adaptei isso da sugestão de Hank Arnold nesta discussão sobre o mapeamento de unidades locais . Eu achava que \\ myComputerName \ c poderia funcionar, mas não sabia aplicar o $.

Antes de tentar o comando "net use", tente navegar para

\\ nome_do_computador \ c $
para certificar-se de que 'computerName' esteja correto.

sábio
fonte
2
Excelente solução, embora com dois problemas: 1) não é visível para o sistema de arquivos locais, 2) permissões ...
ashes999
6
se você usá- \\localhost\c$\path\to\thinglo, é portátil em máquinas (ou atualizações que alteram o nome do computador). Uma desvantagem do uso de uma unidade mapeada no Win7 + é que diferentes políticas de segurança se aplicam às unidades de rede que as locais, e alguns programas se recusam a executar uma unidade mapeada.
27513 Mattt wilkie
1
É visível para o sistema de arquivos e para o sistema de arquivos local - é marcado como uma unidade de rede, assim como algumas unidades são marcadas como unidades removíveis. Isso não faz com que essas unidades não façam parte ou não sejam visíveis para o sistema de arquivos local - elas as tornam unidades de rede / removíveis no sistema de arquivos local.
user165568
1
Nos testes que fiz para um problema de desempenho (alguns anos atrás), usar a unidade de rede montada (localmente) também é mais lento do que usar o sistema de arquivos (ou subst etc.) diretamente. Essa não é uma tremenda diferença para arquivos pequenos ou uso ocasional - não é como passar pela rede real para outro 'servidor' - mas é significativa.
HerbM
8

Solte um arquivo em lotes na pasta Inicialização, que executa todos os SUBSTs que você deseja fazer.

EBGreen
fonte
5

Como o PSubst original tem algumas limitações e parece ter sido concluído pelo autor, tive que codificar uma nova versão para minhas necessidades, corrigindo alguns problemas e adicionando funcionalidade e flexibilidade.

Verifique aqui o arquivo em lote do PSubst versão 3

https://github.com/cyberponk/psubst

Compatível com Windows 7, Windows 8, Windows 10, Windows Server 2012

Nota: Este trabalho não tem a intenção de desmerecer o autor original e só veio à existência por necessidade real, como segue:

  • Como administrador do newtork, tenho a necessidade constante de SUBSTs em unidades de rede e de mexer com diferentes usuários da rede.

  • Como nem todo mundo é especialista em Windows, achei que a elevação automática do administrador com o tratamento de erros ajudaria, com base nos comentários que li na Web.

  • Como algumas pessoas lutaram com a ordem dos argumentos, achei que seria melhor o script trabalhar com argumentos em qualquer ordem.

Não me lembro de todas as funcionalidades adicionadas, mas todas as inclusões foram feitas apenas por necessidade. Estou compartilhando o código para que outras pessoas não encontrem os problemas que tive. Por isso, não há outra intenção senão compartilhar e ajudar.

cyberponk
fonte
Por favor, dizendo "A", diga "B". Você acha que o psubst original tem muitos problemas - por favor, aponte-os se houver. Por outro lado, o psubst não é abandonado. Acabou de atingir o limite de seu desenvolvimento. A ferramenta original segue uma filosofia muito simples: faça algo e faça bem. Ele não está sobrecarregado com funcionalidades extras, como lidar com o UAC e criar código vbs adicional para fazer algo mais. Uma coisa pode ser feita sobre o código original - algumas alterações cosméticas para simplificar o código e melhorar a legibilidade.
jsxt
Editado, revise. UAC e vbs é para elevação automática de administrador. Eu discordo do comentário "limite de desenvolvimento", pois todas as alterações feitas foram para tornar o uso ainda mais simples e fácil depois que encontrei vários problemas usando o PSUBST. Não pretendo criticar o autor original, portanto não listarei problemas, mas criei soluções. Na verdade, propus adicionar minhas edições no ramo original do github, mas fui recusado, então tive que criar meu próprio ramo.
cyberponk
Obrigado pelo seu feedback rápido e detalhado. Provavelmente, preciso dar uma olhada no seu desenvolvimento mais de perto.
jsxt
Meu chapéu está com você; Passei meu tempo nas trincheiras de script em lote e sei como é doloroso. Esse código parece muito bom.
SilverbackNet
2

Estou expandindo a resposta do davr porque todos os arquivos excluídos da unidade mapeada são excluídos permanentemente em vez de ir para a Lixeira. Este arquivo REG é baseado nas informações compiladas neste artigo do TechNet , que descreve como habilitar a Lixeira. O exemplo mapeia a unidade Q virutal para a pasta "OneDrive - Teste" e ativa a Lixeira na unidade Q. Mude os caminhos e o nome para se adequar à sua situação.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices]
"Q:"="\\??\\C:\\Users\\Tony\\OneDrive - Test"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{9147E464-33A6-48E2-A3C9-361EFD417DEF}]
"RelativePath"="Q:\\"
"Category"=dword:00000004
"Name"="Q_Mapped_OneDrive"

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\KnownFolder\{9147E464-33A6-48E2-A3C9-361EFD417DEF}]
"MaxCapacity"=dword:0000c7eb
"NukeOnDelete"=dword:00000000

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{9147E464-33A6-48E2-A3C9-361EFD417DEF}]
"RelativePath"="Q:\\"
"Category"=dword:00000004
"Name"="Q_Mapped_OneDrive"

[HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\KnownFolder\{9147E464-33A6-48E2-A3C9-361EFD417DEF}]
"MaxCapacity"=dword:0000c7eb
"NukeOnDelete"=dword:00000000

Se você tiver apenas uma unidade mapeada, poderá usar o GUID {9147E464-33A6-48E2-A3C9-361EFD417DEF}. Se você tiver várias unidades mapeadas, cada uma deverá corresponder a um GUID do seu gerador GUID favorito.

Tony Pulokas
fonte
Algumas das minhas observações: se você apenas definir os valores em HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FolderDescriptions\{GUID}e reiniciar, os valores correspondentes em HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\KnownFolder\{GUID}serão gerados automaticamente pelo Windows. Nada apareceu para mim embaixo das Wow6432Nodechaves, mas a lixeira funcionou sem elas. Como estava no sistema Windows 7, não tenho certeza se ele se comporta de maneira diferente nas versões mais recentes.
Herohtar 10/09
1
Apenas para adicionar um pouco de dados, eu tenho um sistema Win 10 de 64 bits e testei o que aconteceu ao excluir de um aplicativo de 32 bits (FastStone Image Viewer) e descobri que a lixeira não funcionava para os 32 de 4 bits sem as chaves Wow6432Node.
Tony Pulokas 11/09