Como obtenho o ftype & assoc para corresponder ao Windows Explorer?

19

Eu mudei a associação para usar ao lançar um arquivo .py , via Windows Explorer:

  1. Ferramentas - > Pastas - > Tipos de arquivos.
  2. Em seguida, navegue até .py .
  3. Altere a associação para o Wordpad.

Agora, quando eu digito o nome de um arquivo py na linha de comando, o Wordpad o abre.

Mas assoc e ftype na linha de comando ainda retornam o seguinte:

C:\> assoc .py
.py = Python.File

C:\> ftype Python.File
Python.File = "C:\Program\Python27\python.exe" "%1" %*

Por que a associação está funcionando, mas assoc e ftype não estão cientes disso?

Eu reiniciei o prompt.

Mais informações do meu registro:

HKEY_CLASSES_ROOT\.py
= Python.File

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\Application
= wordpad.exe

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\OpenWithProgids\Python.File
= 

HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.py\(Standard)
= Python.File

Mais registro:

HKEY_CLASSES_ROOT\Applications\python.exe\shell\open\command\(Standard)
= "C:\Program\Python27\python.exe" "%1" %*'

Suponho que isso é o que está aparecendo em ftype Python.File . Mas isso não parece se acostumar.

(Estou fazendo isso para testes, para que eu possa escolher minha versão padrão do Python com facilidade).

    
por Gauthier 28.10.2010 / 16:31

6 respostas

8

Dependendo de como você chama um arquivo dependerá de qual verbo é usado. O verbo que você usa determina o que o Windows fará com ele. Os verbos padrão são Abrir, Editar, Imprimir, Reproduzir e Visualizar. No entanto, é possível criar seus próprios verbos . O verbo mais comumente adicionado é a família Open With (incluindo OpenWithProgIDs), que adicionam esse pequeno submenu de contexto em "Abrir com" para fornecer possíveis alternativas. Se você instalar o Paint.NET, por exemplo, e clicar com o botão direito do mouse em um arquivo .jpg, verá que a entrada Abrir com se expande para um submenu que lista Paint.NET, Paint e o que a Microsoft chamar de visualizador de imagem para sua versão. do Windows.

Além disso, o que o Unsigned Code Labs disse é muito importante. Quando você estiver depurando as classes, será necessário consultar HKLM\Software\Classes\ e HKCU\Software\Classes . HKCR é muito útil para consultar o sistema, mas não é tão bom para descobrir por que ele está se comportando mal.

Eu fiz um pequeno teste no meu sistema Windows 7 com procmon.exe , e os comandos assoc e ftype parecem tentar escrever diretamente em HKCR , e o sistema aparentemente interpreta isso como escrevendo para HKLM . Minha conta atual é um membro do grupo de administradores, mas o UAC está ativado. Eu tive acesso negado quando tentei assoc .mytest=MyTest.File .

Estranhamente, se eu criar uma associação clicando com o botão direito do mouse em um arquivo chamado test.mytest e associá-lo ao Bloco de Notas, nem assoc nem ftype verá essa associação. A associação está definitivamente em HKCU e HKCR . Eu não tentei reiniciar, no entanto.

    
por 15.05.2011 / 02:06
4

eu não sei como você pode fazer a correspondência entre o registro e o que aparece em ftype e assoc. Para mim e como eu vejo para você também o comando ftype e assoc são inúteis. O que eu faço para alterar o programa padrão para uma determinada extensão de forma programática (em comparação com a maneira padrão e mais simples usando o explorer) é modificar essa chave do registro

HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TheExtensionYouWantToModify\UserChoice\ProgID

Por exemplo, se eu quiser abrir meus mp3s com o mplayer eu coloco

HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.mp3\UserChoice\ProgID 

o valor de "mplayerc.mp3"

Quais são as complicações de se fazer isso: primeiro você precisa saber ProgIDs validos (use ftype), e segundo você precisa acessar o acesso a essa colméia. O Windows automaticamente coloca uma ACL de negação para a chave UserChoice, portanto, você precisa encontrar uma maneira de remover essa regra de negação para obter o acesso de gravação. Eu uso o programa subinacl, que você pode baixar aqui link para modificar as permissões. Além disso, você pode usar o programa de terceiros SetACL. Eu recomendo o primeiro porque a sintaxe é muito mais simples.

    
por 15.05.2011 / 04:48
3

Explorer (o shell do Windows) sempre dá preferência ao aplicativo especificado na chave do fornecedor, que é especificado no valor padrão da extensão. (No seu caso .py é a extensão, Python.File é a chave do fornecedor.)

ftype e assoc podem ler seus valores de outras áreas, não sei ao certo. É assim que o Explorer faz isso.

EDIT: Esta página pode ser de interesse para você: MSDN - Arquivo Tipos

Especialmente isso:

The HKEY_CLASSES_ROOT subtree is a view formed by merging HKEY_CURRENT_USER\Software\Classes and HKEY_LOCAL_MACHINE\Software\Classes.

Talvez seja aqui que as diferentes partes do Windows entrem em conflito, se houver uma associação "padrão" em HKEY_LOCAL_MACHINE, que está sendo substituída pela que você definiu na sua conta (que seria então armazenada em HKEY_CURRENT_USER).

    
por 28.03.2011 / 01:42
1

A confusão aqui é entre o que é usado para abrir um arquivo e o que é usado para executar um arquivo. A chave do registro

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.py\Application
\.py\Application

é o que informa ao windows como abrir o arquivo. Clicar duas vezes no arquivo abrirá o arquivo com este aplicativo.

Como o arquivo não é executável, a linha de comando supõe que você deseja abrir o arquivo com o aplicativo padrão, como se tivesse clicado duas vezes.

Alterar a associação de volta para C: \ Program \ Python27 \ python.exe ou editar a chave de registro para apontar para python deve retorná-la a como costumava ser, onde o Windows supõe que você deseja abrir o arquivo com o programa padrão , que é o python.exe, que então executa o programa.

    
por 28.02.2011 / 19:40
1

A sua maior pista sobre propósito e localização é no "tipo grande", ou seja, os nomes das respectivas colmeias: HKLM e HKCU

As associações de arquivos são definidas em ambas as seções e têm dois propósitos diferentes:

Como o nome indica, as entradas de registro do HKCU definem associações de arquivos para o CURRENT USER e substituem as configurações de tipo de arquivo correspondentes no HKLM.

O HKLM define associações de arquivos para a MÁQUINA LOCAL, ou seja, para TODOS OS USUÁRIOS da máquina (a menos que sejam substituídas pelas entradas HKCU). (Para Win98, o HKCR era apenas um atalho abreviado para HKLM \ Software \ Classes. Eles não eram separados ou diferentes. No entanto, isso mudou para o Win XP e não é mais verdadeiro. HKCR é agora uma seção virtual que é o resultado da mesclagem as chaves HKLM \ Software \ Classes \, HKCU \ Software \ Classes \ e HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts com as informações de HKCU tendo precedência.)

Este sistema de duas etapas facilita não apenas esquemas de associação de arquivos um-para-um, mas muitos-para-um e um-para-muitos. Por exemplo, todos os tipos de arquivos .htm, .html e .shtml podem ser definidos como ProgID = htmlfile, o que pode definir um único navegador. OTOH, as entradas podem conter subchaves OpenWithList ou OpenWithProgID com várias entradas para abrir um arquivo de uma lista de vários navegadores, editores ou outros aplicativos.

Ambos HKLM \ Software \ Classes \ e HKCU \ Software \ Classes operam da mesma maneira (um só tem precedência sobre o outro). Na forma mais simples, existe uma chave de registro para uma extensão de arquivo (por exemplo, HKCR.txt) cujo valor padrão é o ProgID correspondente (por exemplo, txtfile). Além de, ou em vez de, o valor padrão, pode haver nomes ProgID adicionais listados para a subchave "OpenWithProgID" (por exemplo, txtfile e htmlfile) e / ou nomes de aplicativos adicionais que aparecem como subchaves em "OpenWithList" (por exemplo, Notepad ++ .exe, Opera.exe, Firefox.exe).

Cada ProgID é definido em outra chave dentro do HKCR (por exemplo, HKCR \ txtfile). Essa chave contém subchaves para informar às janelas qual ícone usar e como abrir, imprimir, imprimir, etc. o arquivo associado (por exemplo, HKCR \ txtfile \ shell \ open \ command). Da mesma forma, cada nome de aplicativo é definido como uma subchave em HKCR \ Applications (por exemplo, HKEY_CLASSES_ROOT \ Applications \ Firefox.exe \ shell \ open \ command).

Além da chave HKCU \ Software \ Classes, as associações de arquivos da conta de usuário são encontradas na chave HKCU \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ FileExts. Essas entradas não são apenas para o Windows Explorer como foi sugerido, mas são uma fonte adicional de substituições de associação de arquivos de conta de usuário. As entradas são criadas pelas ferramentas de associação de arquivos no Explorer (Explorer \ Ferramentas \ Opções de Pasta \ Tipos de Arquivo) e contêm uma subchave OpenWithList e / ou uma OpenwithProgID para cada extensão de arquivo listada.

Para determinar uma associação de arquivos, o Windows analisa primeiro as entradas do HKCU para uma extensão de arquivo correspondente. Somente se um não for encontrado, as entradas do HKLM entrarão em jogo. (Nota: Eu não testei o que tem precedência - o HKCU \ Software \ Classes ou o HKCU \ MIcrosoft \ Windows \ CurrentVersion \ Explorer \ FileExts, mas suspeito que seria a chave FileExts). Da mesma forma, se um nome de aplicativo ou ProgID referenciado não for encontrado em HKCU, as entradas de HKLM serão pesquisadas. (Observe que \ Applications \ entries são apenas nomes arbitrários - mesmo que sejam tipicamente idênticos ao nome real do arquivo exe no disco.)

Portanto, para definir uma associação de arquivo para uma conta de usuário específica, crie entradas na seção HKCU. Para definir uma associação para todos os usuários, crie entradas na seção HKLM (HKCR) e exclua todas as referências na seção HKCU para esse tipo de arquivo. Obviamente, você precisa dos direitos de acesso apropriados às chaves do registro.

Eu não uso as ferramentas assoc e ftype, pois prefiro usar o RegEdit no modo interativo ou em lote, mas de outros comentários parece que eles só operam na seção HKLM e são inúteis para limpar / definir chaves HKCU. Reserve algum tempo e navegue pelas chaves acima mencionadas com RegEdit para ver mais exemplos.

    
por 20.09.2014 / 20:21
0

A Microsoft mudou como isso funciona a partir do Windows 8. Não é mais possível editar o registro para alterar isso. Para quote Microsoft :

In Pre-Win 8, apps could set the default handler for a file type/protocol by manipulating the registry, this means you could easily have a script or a group policy manipulating the registry. However In Win 8, the registry changes are verified by a hash (unique per user and app) that detects tampering by apps. In the absence of a valid hash, we ignore the default in the registry.

A maneira como a Microsoft espera que você mude isso agora é com um arquivo xml que é implementado através da Política de Grupo. Instruções aqui .

Felizmente, Christoph Kolbicz fez engenharia reversa do algoritmo de hash e criou uma ferramenta chamada SetUserFTA para definir a associação do tipo de arquivo. Infelizmente é de código fechado.

    
por 02.08.2018 / 10:56