Eu tenho aprendido sobre links NTFS ( 1 , 2 ) e brincando com eles no meu computador. É um mundo estranho de pseudônimos para nomes de arquivos e nomes de pastas, e ainda não sei por que os tenho, mas o que é certo é que tenho muitos deles.
Os links NTFS são hard links ou pontos de nova análise e os pontos de nova análise são pontos de junção ou links simbólicos.
Para me familiarizar com eles, tenho tentado gerar uma lista completa de todos os links NTFS em meu computador.
Este é um computador de duas unidades com o sistema operacional em C: e dados em D:. O sistema operacional é o Windows 10 Pro 64 v 1903 (estou relatando aqui os resultados registrados antes da atualização para v 1909). O PowerShell é o padrão do Windows v 5.1.
A seguir, os termos "diretório" e "pasta" são sinônimos.
Todos os links
PowerShell aparentemente tem, desde v 5.0, duas propriedades não documentadas de cmdlets "item": LinkType
e target
( 1 , 2 , 3 , 4 ). LinkType
tem os valores "Junction", "SymbolicLink" e "HardLink". Portanto, isso deve ser capaz de listar todos os links NTFS no meu computador. No entanto, não funciona de forma confiável. Em particular, falha em certos objetos na pasta "Usuários" . Por exemplo, no PowerShell:
PS C:\WINDOWS\system32> echo ("1. " + ("C:\Documents and Settings" | get-item -force).LinkType)
echo ("2. " + ("C:\Program Files\Microsoft Office\root\Client\AppvIsvSubsystems32.dll" | get-item -force).LinkType)
echo ("3. " + ("C:\Program Files\NVIDIA Corporation\NvTelemetry\plugins\NvTelemetry" | get-item -force).LinkType)
echo ("4. " + ("C:\ProgramData\Desktop" | get-item -force).LinkType)
echo ("5. " + ("C:\Users\All Users" | get-item -force).LinkType)
echo ("6. " + ("C:\Users\Default User" | get-item -force).LinkType)
1.
2. SymbolicLink
3. Junction
4.
5.
6.
Os resultados correspondentes dir /aL
no prompt de comando do Windows (veja a seguir abaixo) são:
1. JUNCTION
2. SYMLINK
3. JUNCTION
4. JUNCTION
5. SYMLINKD
6. JUNCTION
Portanto, parece que, pelo menos para o PowerShell 5.1, LinkType
não é confiável.
Pontos de nova análise
No cmdlet do PowerShell get-ChildItem
, o parâmetro attribute
tem a propriedade ReparsePoint
. Isso deve permitir a identificação de pontos de nova análise, mas não distingue entre pontos de junção e links simbólicos, portanto não é tão útil quanto dir /aL
, discutido a seguir.
O comando Windows (Prompt de Comando, não PowerShell) dir /aL /s X:\
lista todos os pontos de nova análise no diretório X. Executando como administrador, não encontrou nenhum na unidade de dados e 574 na unidade do sistema, principalmente nas pastas "Arquivos de Programas" (não "Arquivos de Programas (x86)") e "Users", e também alguns em "Program Data" e um em "Windows".
Na saída desse dir
comando, os alvos são indicados entre colchetes após os nomes dos objetos e a coluna que geralmente tem o tamanho do arquivo ou " <DIR>
" agora tem cinco valores diferentes: 0 (que é presumivelmente um tamanho de arquivo), o usual <DIR>
, e os três novos valores: <JUNCTION>
, <SYMLINK>
, <SYMLINKD>
. No meu computador, apenas no drive do sistema, esses valores ocorreram com a seguinte frequência e características do link e objetos de destino:
Count Type/Size Link object Target object
11 <JUNCTION> Folder with root Folder with root
36 Folder not found Folder with root
9 Folder not found Folder w/o root
7 Folder not found Folder not found
10 <SYMLINK> dll file dll file
1 <SYMLINKD> Folder w/o root Folder w/o root
488 <DIR> Folder with root None
12 0 exe file None
----
574 Total
Nessa tabela, os tipos de objeto têm os seguintes significados: (Nesta lista de itens, dir
significa executar dir
o objeto no Prompt de Comando (não no PowerShell) como administrador sem parâmetros (especificamente, sem o /aL
parâmetro).)
- Pasta com raiz:
dir
produz uma listagem que se parece com uma listagem de diretório normal, começando com<DIR> .
para representar o próprio objeto (diretório).- Exemplo (objeto de destino):
dir "C:\Users\Public\Documents"
- Exemplo (objeto de destino):
- Pasta sem raiz:
dir
produz uma listagem de um ou mais objetos que não começam com nenhum deles<DIR> .
ou com o nome do próprio objeto.- Exemplo (objeto de destino):
dir "C:\Users\Public\Desktop"
- Exemplo (objeto de destino):
- Pasta não encontrada:
dir
retorna "Arquivo não encontrado" e o nome do objeto não se parece com um nome de arquivo com extensão. (No PowerShell,dir
resulta em "Acesso a... negado.")- Exemplo (objeto de link):
dir "C:\Documents and Settings"
- Exemplo (objeto de link):
- Arquivo:
dir
produz uma listagem de um item, que é o nome do próprio objeto.- Exemplo (objeto de link):
dir "C:\Program Files\Microsoft Office\root\Office16\C2R64.dll"
- Exemplo (objeto de link):
Obviamente, <JUNCTION>
indica um ponto de junção, enquanto <SYMLINK>
e <SYMLINKD>
indica links simbólicos para arquivos e pastas. Mas tenho dúvidas sobre outras informações aqui:
- Quais são os 500 objetos que
dir /aL
dizem ser pontos de nova análise, mas são marcados como<DIR>
ou com tamanho de arquivo zero e sem alvos? Os<DIR>
objetos são pontos de junção ou links simbólicos ou algo mais? Os arquivos de tamanho zero são links simbólicos ou algo mais? Se são links, para o que são links? - Quais são as listagens de diretório que não começam com
<DIR> .
("Pasta sem raiz")? Eu nunca vi isso antes. - Por que alguns pontos de junção e seus alvos são encontrados por
dir
(sem/aL
), enquanto outros não?
Links físicos
Não parece ser uma maneira fácil e nativa de obter uma lista de links físicos. Aqui estão seis respostas do Stack Exchange que encontrei até agora sobre o assunto:
- Descubra se um arquivo é um link simbólico no PowerShell .
- A resposta de Anton Krouglov tem o comando PS para obter links usando
LinkType
, o que pode funcionar para links físicos. - Resposta por "b_ball" tem script PS para hard links usando
FSutil
.
- A resposta de Anton Krouglov tem o comando PS para obter links usando
- Como visualizar todos os links simbólicos, pontos de junção, links físicos em uma pasta usando o diretório?
- A resposta de "Jimadine" tem um script em lote para obter links físicos usando
FSutil
, mas não consegui fazê-lo funcionar. - A resposta de Anton Krouglov repete coisas sobre
LinkType
sua resposta à outra pergunta acima.
- A resposta de "Jimadine" tem um script em lote para obter links físicos usando
- Como faço para visualizar os links físicos de um arquivo no Windows?
- Respostas de "antonio" e "Massimo" sugerem SysInternals'
FindLinks
.
- Respostas de "antonio" e "Massimo" sugerem SysInternals'
Ainda não terminei de testar todos os métodos. Alguma sugestão para seguir esta linha de investigação de forma eficaz para obter uma lista correta de todos os links físicos?
Resumo
- Re todos os links : Algum comentário sobre minha descoberta que
LinkType
não seja confiável para relatar todos os links NTFS corretamente? - Ponto de nova análise : Alguma resposta para as três perguntas indicadas no final dessa seção?
- Re hard links : Alguma sugestão para obter uma boa listagem?
- Qualquer outra sabedoria ou insights para compartilhar sobre este estranho mundo de pseudônimos do sistema de arquivos?
Duvido que os hard links apareçam como um LinkType distinto depois de criados, porque a maneira como eles funcionam é ter vários nomes (entradas de diretório) apontando para o mesmo objeto de arquivo da mesma maneira que o nome original.
A única maneira de determinar se um arquivo possui hardlinks é verificar sua "contagem de links", como no
fsutil
script que você encontrou. Da mesma forma no Linux, POSIX stat() tem o atributo 'nlink' informando o número de links que um arquivo possui (esse é o número que aparece emls -l
).No entanto, há muito pouco no NTFS – e nada na maioria dos sistemas de arquivos Unix – que permitiria distinguir um hardlink do original. Você só pode dizer que dois arquivos estão vinculados porque eles apontam para o mesmo 'inode' (bem, o equivalente NTFS de), mas você não saberá qual link foi adicionado posteriormente: é simplesmente um arquivo com dois nomes.
Nem todos os pontos de nova análise são links. Eles podem ter várias tags neles, e seu objetivo geral é apenas redirecionar a pesquisa de arquivo para algum driver.
Por exemplo, o Windows permite que unidades/volumes sejam montados em uma pasta vazia (estilo Unix) em vez de fornecer a eles uma "letra de unidade". Ao contrário dos pontos de montagem do Unix que são transitórios, no entanto, os pontos de montagem do Windows são persistentes no sistema de arquivos - eles são um tipo de ponto de nova análise que armazena o ID do volume montado.
Outro uso muito comum de pontos de nova análise é implementar arquivos "nuvem" ou "somente online", como no OneDrive e no Dropbox (ambos os implementam de maneira muito diferente também) - eles aparecem como arquivos regulares que apenas acionam um download online uma vez aberto .
Se você estiver usando o Microsoft Office instalado de uma certa maneira (não tenho certeza, mas acho que é o Office 365 instalado por meio do ClickOnce), ele parece usar outro tipo de pontos de nova análise, que novamente não são junções nem links simbólicos. Use
fsutil reparsepoint query
para ver se você pode encontrar algo interessante.Infelizmente, "Arquivo não encontrado" é como o CMD também relata erros causados devido a restrições de segurança - isso não significa que ele recuperou com sucesso uma lista vazia.
"Documentos e configurações" é um ponto de junção padrão, apenas possui uma ACL (consulte Recursos
icacls
) que nega explicitamente a listagem de seu conteúdo. Havia uma postagem antiga no blogs.msdn.com dizendo que isso foi feito para evitar que certos programas que ignoram links verificassem os mesmos diretórios de perfil de usuário duas vezes.