Reproduzindo o exe bloqueado opção “desbloquear” nas propriedades de arquivo no Windows 2003
-
02-07-2019 - |
Pergunta
Quando eu baixar meu programa do meu site para meus windows 2003 máquina, ele tem um bloco nele e você tem que clicar sobre o exe, então propriedades, em seguida, selecione o botão "Desbloquear".
Eu gostaria de adicionar a detecção em meu instalador para quando o arquivo está bloqueado e, portanto, não tem permissões suficientes.
Mas eu não posso eaisly reproduzir recebendo minha exe neste estado onde ele precisa ser desbloqueado.
Como posso obter o desbloqueio para aparecer no meu exe para que eu possa testar esta funcionalidade?
Solução
Isso é feito usando fluxos de arquivo NTFS. Há um fluxo chamado "Zone.Identifier" adicionados a arquivos baixados. Quando IE7 faz o download de determinados tipos de arquivo que o fluxo contém:
[ZoneTransfer]
ZoneId=3
A maneira mais simples para defini-la é criar um arquivo de texto com esses conteúdos na mesma, e usar mais para adicioná-lo à corrente alternada.
Zone.Identifier.txt:
[ZoneTransfer]
ZoneId=3
Comando:
more Zone.Identifier.txt > file.exe:Zone.Identifier
Então, o caminho para você verificar que seria para tentar abrir o fluxo Zone.Identifier e olhar para Identificação_da_Zona = 3, ou simplesmente assumir que se o fluxo existe em tudo que o usuário receberá esse aviso.
Também é importante notar que isso não tem nada a ver com permissões. Administradores ver o mesmo aviso; tem a ver inteiramente com a origem eo tipo de arquivo. todo o fluxo vai embora quando os usuários desmarque a caixa "Sempre perguntar antes de abrir este arquivo" e clique em Executar.
Outras dicas
Há uma API suportada para este, documentado no MSDN. Pesquisar no MSDN para "persistente objeto Zona Identifier". Basicamente você CoCreateInstance
com CLSID_PersistentZoneIdentifier
e solicitar uma interface IPersistFile
. Você, então, chamar IPersistFile::Load
com o nome do arquivo em questão. Em seguida, QI para uma interface IZoneIdentifier
e uso IZoneIdentifier::GetId
obter a zona do arquivo. Se não houvesse a "marca da web", você deve obter URLZONE_LOCAL_MACHINE
. O Identificação_da_Zona de 3 mencionado na outra resposta é URLZONE_INTERNET
. (A enumeração é chamado URLZONE
e também está documentado no MSDN, ou ver sdk\inc\urlmon.h
.) Você pode remover ou mudar a "marca da web", chamando IZoneIdentifier::Remove
ou IZoneIdentifier::SetId
e IPersistFile::Save
então chamada. Há mais detalhes sobre tudo isso no MSDN. Boa sorte!
Obrigado por isso me ajudou muito.
Você pode tornar o processo ainda mais fácil se você criar um arquivo de lote com o conteúdo.
echo [ZoneTransfer] > Zone.Identifier
echo ZoneId=3 >> Zone.Identifier
more Zone.Identifier > %1:Zone.Identifier
Isto irá gerar o Zone.Identifier para você e marcar o arquivo em conformidade.
Para executá-lo basta fornecer o nome do arquivo, por exemplo, se o arquivo é chamado mark.bat
mark.bat myfile.txt