Como assinar um arquivo em lotes (.bat) do Windows?

8

Estou executando o Windows 7 e quando tento executar um arquivo em lotes, ele diz: "O editor não pôde ser verificado. Tem certeza de que deseja executar este software?"

Portanto, quando tento assiná-lo com meu certificado de assinatura de código, ele diz "Erro no SignTool: este formato de arquivo não pode ser assinado porque não é reconhecido".

Então, eu estou preso entre uma rocha e um lugar difícil. Existe uma maneira de eliminar qualquer mensagem?

captura de tela


fonte
11
Reescreva-o como um script do PowerShell e assine isso? Eu nunca ouvi falar de arquivos em lotes assinados.
Iszi 5/09/12
Você não assina arquivos em lote. Parece que seu arquivo em lotes está chamando outra coisa que deve ser assinada.
Mark Allen
11
Qual é a fonte do prompt? Ou seja, qual é a barra de título e o ícone? Na verdade, é um prompt do Windows ou de um programa de segurança de terceiros? Tire uma captura de tela e adicione-a à pergunta.
Synetech 5/09/12
@SeanCheshire, se for esse o caso, então techturtle está correto; qualquer coisa em uma rede é vista com desconfiança pelo Windows, portanto, você precisará copiá-la localmente ou adicionar o local à Zona Confiável.
Synetech 5/09/12

Respostas:

4

Recebo uma mensagem semelhante se executar arquivos em lote (ou outros executáveis) de um local de rede. Se for esse o caso, considere movê-lo para uma unidade local. Outra alternativa é usar um arquivo em lotes separado na unidade local para iniciar o arquivo na rede. O arquivo em lotes de inicialização precisa ter apenas uma linha:

@call \\network\folder\batch.bat

O Windows não aceita o arquivo local e, uma vez executado, pode chamar a versão da rede sem problemas.

techturtle
fonte
@Sosukodo, então E:é uma unidade mapeada em rede?
Synetech 5/09/12
Class-of ;-) Estou executando um convidado do VirtualBox Windows 7 em um host do Mac. OE: é uma pasta compartilhada do VirtualBox. Eu não sabia que a pasta compartilhada seria considerada uma unidade de rede, mas quando você mencionou, fazia sentido.
4

Você não assina arquivos em lote. Parece que seu arquivo em lote está chamando outra coisa que deve ser assinada.

Editar: agora que você postou um arquivo em lotes, podemos ver que é por causa do local da rede. Ou, às vezes, acontecerá se você simplesmente copiar um arquivo de um local de rede. No último caso, é porque o Windows marcou o arquivo por meio de um Fluxo de dados alternativo em outra zona da Internet. Você pode contornar essa de duas maneiras:

  1. Altere suas zonas de segurança no Internet Explorer, para a zona Intranet.
  2. Use o comando type para destruir o fluxo de dados alternativo do arquivo. (Também existe o streams.exe da Sysinternals que pode fazer isso.) type thefile.bat > %temp%\newfile.bat & type %temp%\newfile.bat > thefile.bat
Mark Allen
fonte
3

O que você vê é um prompt geral que o Windows fornece sempre que você tenta abrir qualquer momento do arquivo que foi baixado. O que acontece é que, quando você baixa um arquivo, ele é marcado com uma bandeira que indica que ele veio da Internet e, portanto, é potencialmente perigoso. Quando você tenta executar esse arquivo, o Windows verifica se ele possui uma assinatura válida para determinar se é confiável.

O que você pode fazer é remover o sinalizador do arquivo usando o botão Desbloquear nas propriedades do arquivo, após o qual o Windows o deixará em paz sempre que você tentar executá-lo:

insira a descrição da imagem aqui


O problema é que arquivos em lote são arquivos de texto que podem ser executados. Embora seja possível assinar um arquivo de texto, ele acabará anexando um monte de dados binários ao arquivo, o que para um arquivo em lotes é ruim porque é sem sentido e causa problemas quando o interpretador de comandos tenta executá-lo. Comentar a assinatura também não funcionará porque a assinatura fica corrompida.

Portanto, assinar um arquivo em lotes não funcionará.

O que você precisa fazer é descobrir por que o sistema o solicita ao tentar executá-lo. Por padrão, o Windows não pergunta antes de executar arquivos em lote; portanto, você deve ter uma política ou programa de segurança especial bloqueando-o. Verifique seu (s) programa (s) de segurança para ver se há uma configuração de verificação na qual você pode desativar ou adicionar uma exclusão.

Verifique também o conteúdo do arquivo em lotes para ver se está executando um executável que não está assinado (embora, novamente, por padrão, o Windows não solicite executáveis, a menos que tenha sido baixado ou exija privilégios elevados, verifique suas configurações).

Synetech
fonte
Você deve conseguir sair do script antes que a execução atinja a assinatura, não?
Sparr 5/09/12
@ Sparr, sim e não. Você pode inserir um goto :eofantes da assinatura, mas isso alteraria o hash do arquivo e tornaria a assinatura inválida e, portanto, o arquivo como corrompido / inseguro. Suponho que você possa ter a linha no final do arquivo antes de assiná-lo, e deve funcionar. Experiência interessante para tentar ...
Synetech 5/12
2
Você pode usar o comando type - mesmo em binários - para desmarcar o arquivo. Eu faço isso o tempo todo. digite oldfile> newfile (e, em seguida, digite newfile> oldfile resulta no arquivo antigo sem a tag ADS.
Mark Allen
Hehe, inteligente. Isso não é tecnicamente tirando a bandeira (e eu não tenho certeza de quanto mais rápido ou mais conveniente é que o Propriedades de diálogo, mas funciona.
Synetech
0

Você também pode converter o arquivo .bat em um script do PowerShell, pois o signtool suporta a assinatura desses arquivos.

Emmanuel Bourg
fonte
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem. - Do comentário
Burgi
@Burgi, isso é discutível, os arquivos .bat não podem ser assinados, a menos que alguém escreva um SIP dedicado. A solução mais próxima por enquanto é um script assinado do PowerShell.
Emmanuel Bourg
A regra 42 do Fight Club é "Soluções alternativas são respostas". Então essa é uma resposta. (Mas os outros são melhores.)
Scott