Symlink para uma unidade inexistente no Windows

1

Quando tento criar uma junção de diretório para uma unidade do Windows que ainda não existe, recebo a seguinte mensagem:

C:\>mklink H H:\ /J
Local volumes are required to complete the operation.

Eu quero ter um diretório no Windows que conecte cada letra de unidade a uma letra correspondente nesse diretório. Quero compartilhar mídia de qualquer dispositivo externo por meio de um aplicativo sem precisar alterar as configurações quando aparecerem "novas" letras de unidade.

Parece que os links simbólicos podem apontar para alvos inexistentes, porque o sistema operacional não verifica se o destino existe, mas eles não podem vincular a unidades inexistentes. Existe alguma solução conhecida para configurar essa junção de diretório?

Uma solução é criar um link simbólico de diretório (usando o sinalizador / D em vez do sinalizador / J), mas não é isso que estou procurando, quero uma junção de diretório.

    
por Simon Streicher 07.12.2014 / 18:44

1 resposta

1

Somente as junções são possíveis para isso. Use SUBST para enganar o sistema operacional.
É bastante importante usar uma pasta pai com /deny Everyone:(S,RD) para impedir que o SO rastreie o loop infinito enquanto faz a manutenção. Como Pesquisa, indexador de pesquisa, Antivírus, Histórico de arquivos, quem sabe o que mais.

detalhes e script abaixo

Eu vejo que você entendeu a maioria dos itens a seguir, então vamos resumir para os outros.

Symlinks
Diretório Sym-links e junções são coisas muito diferentes.
A principal diferença que deve lhe interessar é que você não pode acessar links sym no computador remoto com links para os caminhos locais desse computador remoto. Sym-link para F: \ no computador remoto tentará abrir o F: \ do PC local. Sym-link é como um arquivo de link que contém informações sobre o caminho do objeto real. Você pode link sym para qualquer que seja, mesmo caminhos relativos.
Você pode criar um diretório sym-link para uma unidade inexistente, mas isso não irá ajudá-lo sobre a LAN

Junction é uma coisa NTFS. Mas enquanto um Junction deve estar em NTFS, ele pode apontar para uma pasta em outro FS. Ele "redireciona" o acesso à pasta com junção. Você pode acessar junções em máquinas remotas apontando para pastas remotas.
Cuidado com as permissões. tanto do Diretório de destino quanto do Junction. (icacls com / L)

Para arquivos , existem links simbólicos de arquivos e hardlinks . Não há hardlinks para o Directory, mas o Junction é bem próximo disso. Hardlinks são vários registros de arquivos apontando para a mesma posição em uma unidade. Por esse motivo, não é possível estabelecer hardlink nas unidades.

Nota: as junções não devem ser criadas para vincular locais dinâmicos. Está funcionando bem, mesmo que um FS diferente esteja montado como a mesma letra, mas não é uma maneira suportada. Você deve criar um compartilhamento para cada unidade. Mas isso criaria uma confusão nos locais de rede e não haveria como controlar o acesso usando permissões.

Este é um recorte do meu script de personalização. É portátil, coloque-o em um arquivo bat e rode como Admin.

  • cria o compartilhamento Drives, com Junction apontando para drives de letras de todo o alfabeto. Os drives de compartilhamento estarão acessíveis por qualquer usuário autenticado. (não Convidado e Usuário sem senha) Os usuários terão o mesmo acesso como se estivessem logados localmente, mas o UAC não virá para dar acesso elevado nem mesmo para os administradores.
  • cria um compartilhamento do Download-Private para os downloads do usuário atual - basta remover a seção se você não quiser
  • As pastas dessas duas ações são colocadas em "% PUBLIC% \ compartilhamentos privados", por exemplo, "c: \ Users \ Public \ Private compartilhamentos" Esta pasta será diretamente inacessível para evitar serviços em segundo plano para acabar em um loop. Você ainda pode acessar pastas dentro dela diretamente, escrevendo o caminho completo na barra de endereços ou criando um atalho do Windows para ele
  • para ajustar as permissões para a pasta inteira editar "Compartilhamentos privados", mas para ajustar para determinadas letras de unidade, você deve usar icacls com o parâmetro / L
echo. & echo === "Private shares"

echo *** Creating Folders
rem --- Private shares - inheriting Authenticated Users access from Public folder
if not exist "%PUBLIC%\Private shares" mkdir "%PUBLIC%\Private shares"
rem - remove DENY temporarily
icacls "%PUBLIC%\Private shares" /remove:d Everyone 2>nul
if not exist "%PUBLIC%\Private shares\Drives" mkdir "%PUBLIC%\Private shares\Drives"

echo *** Creating Downloads-Private share
echo *   Creating link
mklink /J "%PUBLIC%\Private shares\Downloads-%USERNAME%" "%USERPROFILE%\Downloads"
echo *   Creating shares
net share Downloads-Private /delete 2>nul
net share Downloads-Private="%PUBLIC%\Private shares\Downloads-%USERNAME%" /unlimited /remark:"Only for authenticated users" /grant:everyone,FULL

echo *** Creating Drives share
echo *   Creating link
for %%a in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
    subst %%a: \
    mklink /J "%PUBLIC%\Private shares\Drives\%%a" %%a:\
    subst %%a: /d
)

echo *   Creating shares
net share Drives /delete 2>nul
rem - /grant:everyone,FULL --- No worry, this is on Microsoft's recommendation. Grant full access to shares and handle access through permissions. It's more portable, safer and simpler.
net share Drives="%PUBLIC%\Private shares\Drives" /unlimited /remark:"Only for authenticated users" /grant:everyone,FULL

echo *** Changing "Private share" permissions
rem - this is the same way as Windows is handling legacy folders inside Users directory
rem   this must be done, or many services will keep crawling though an endless path loop
icacls "%PUBLIC%\Private shares" /deny Everyone:(S,RD)

Se você precisar para remover a pasta que é criada usando esse script, será necessário desbloqueá-lo usando Properties-Permission ou por este comando executado como Admin: icacls "%PUBLIC%\Private shares" /remove:d Everyone
Não mantenha essa pasta desbloqueada, exclua-a logo após ou bloqueie novamente usando icacls "%PUBLIC%\Private shares" /deny Everyone:(S,RD)

    
por 04.06.2016 / 12:25