Atualmente, existem cerca de 20 a 30 computadores para os quais eu ligo regularmente. Atualmente, estou usando o HyperTerminal no Windows XP SP3 para fazer isso. Depois que meu computador se conecta ao outro computador, recebo uma impressão de string de algumas informações que olho manualmente e digito no Excel.
Embora funcione bem para conexões manuais, é um processo tedioso que acho que deveria ser automatizado. Estou fazendo isso uma vez por semana, agora, porque é muito trabalhoso (geralmente 30 a 40 minutos por), mas, idealmente, gostaria que fosse executado como uma tarefa agendada todos os dias. No entanto, o HyperTerminal não parece oferecer nenhum recurso de script. Além disso, tentei usar o recurso de registro de sessão e não parece funcionar tão bem assim.
Existe alguma maneira, talvez usando um script em lote ou VBS ou PowerShell, de discar sequencialmente uma série de computadores e, em seguida, registrar automaticamente a saída do terminal em um arquivo de texto, com registro de data e hora?
A ressalva adicionada é que também preciso ser capaz de lidar com exceções, por exemplo, se o computador estiver ocupado. O HyperTerminal tem um recurso "Redial on Busy" e, às vezes, eu o uso ou disco para o restante dos computadores e depois volto para aquele. Eu preciso construir isso em meu script, também.
Considerando que a discagem de guerra é possível, embora não registre a saída, apenas a ausência ou presença de um tom de operadora, sinto que isso é possível. Como posso implementar isso?
Preciso de uma solução Batch ou VBS, se possível. Não tenho certeza de quão bom é o suporte ao PowerShell no Windows XP e, por vários motivos, prefiro não instalar nenhuma ferramenta adicional (por exemplo, Python, etc.) na máquina.
Esclarecimento: tenho um amigo que, a certa altura, criou um script que podia discar usando os comandos de Hayes na linha. Essa é a parte fácil; a parte difícil é detectar a impressão do computador remoto e registrá-la em um arquivo de texto.
A versão paga do HyperTerminal oferece recursos para criar scripts nesse sentido, mas eu gostaria de fazer isso gratuitamente usando um script personalizado, com a capacidade de lidar também com números ocupados.
Obrigado!
PowerShell
Aqui está o que recebo ao executar o script do PowerShell:
Aqui está o script que tentei:
# Create your instance of the SerialPort Class
$serialPort = new-Object System.IO.Ports.SerialPort
# Set various COM-port settings
$serialPort.PortName = "COM3"
$serialPort.BaudRate = 1200
$serialPort.WriteTimeout = 500
$serialPort.ReadTimeout = 23000
$serialPort.DtrEnable = "true"
# or in one command
# $serialPort= new-Object System.IO.Ports.SerialPort COM#,Baudrate,None,8,one
# Open the connection
$serialPort.Open()
# write to it
$serialPort.WriteLine( "at+csq" + "`r" )
$serialPort.WriteLine( "atdt1NPANXXXXXX" + "`r" )
# wait
start-sleep -m 50
# read line
$line = $serialPort.ReadLine()
Write-Host $line
# write to it
$serialPort.Close()
Solução mais próxima até agora:
O mais próximo que consegui foi usar o AHK, que é bastante meticuloso, mas funciona o suficiente para ser útil. Meu plano é conectá-lo a um script em lote, passar cada número e iterar até obter uma impressão bem-sucedida de cada computador.
Uma ferramenta que pode ajudar com o seu problema é o AT Command Tester Desktop App , um produto comercial ($ 9,95) com teste gratuito de 7 dias.
Este produto pode executar um script de comandos AT em sua guia "Modo Script", onde pode salvar e carregar o script do computador local.
Ele também possui um modo de linha de comando onde pode ser chamado por:
A ferramenta também pode coletar e salvar logs de modem. Não tentei, pois não tenho um modem ou não conheço nenhum número para ligar, mas se os logs forem salvos como arquivos de texto, deve ser uma questão simples escrever um pequeno script de pesquisa de texto para erros/sucesso.
Se você preferir escrever o seu próprio, um script simples do PowerShell pode fazê-lo, usando a classe System.IO.Ports.SerialPort .
Aqui está um exemplo (não testado e muito teórico):
Observe que o caractere de fim de linha usado pelo modem precisa de atenção.
Aqui está minha sessão em uma VM XP onde instalei o .Net Framework 2.0 e o KB968930 . Quase funcionou, exceto que não há nada conectado ao COM1, então ele travou na chamada ReadLine () até terminar por um tempo limite.
Observe que houve um erro de copiar e colar no meu script, agora corrigido. A linha que não funcionou foi:
Deve ter sido:
O método mais básico de controlar um modem é enviar comandos através de uma porta serial. Quase todos os modems dial-up suportam comandos Hayes AT , como
ATD
ouATH
(geralmente em hardware para modems seriais, às vezes emulados pelo driver para modems USB/PCI).Exemplos:
Linux/OpenBSD/FreeBSD: Todos os programas e bibliotecas eventualmente usam os
/dev/ttyS*
arquivos especiais para acessar as portas seriais. (Observação: no Linux, os adaptadores seriais USB são denominados ttyUSB ou ttyACM.)Na maioria dos casos, seu programa pode apenas abrir o caminho como se fosse um arquivo normal, depois escrever/liberar um comando e ler a resposta.
Windows: Todos os programas eventualmente usam os
\\.\COM1:
arquivos especiais para acessar as portas seriais. Os quatro primeiros podem ser abertos simplesmente comoCOM1:
(o atalho é uma relíquia do MS-DOS).PowerShell: Existe um DevBlog sobre este tópico.
Python: use pySerial .
O outro método, no Windows, pode ser usar a Telephony API . No entanto, não consigo descobrir se ele suporta chamadas de dados (terminal) ou apenas chamadas de voz.
Como observação: aqui estão apenas dois utilitários que uso para controlar meus modems. Envio e recebo muitos SMS, as ferramentas são feitas para isso. Eles suportam vários modems e os comandos AT são usados para inicializar os modems. Considerando que todas as funções são de alguma forma definidas para funcionar com o SMS, ele pode ser altamente personalizado com scripts de inicialização e muito mais. Não testei um ciclo completo como discar em outro modem e receber dados de alguma forma, mas talvez valha a pena dar uma olhada neles:
http://smstools3.kekekasvi.com/index.php https://wammu.eu/smsd/
AutoHotkey.com pode ser útil.
Acredito que um truque importante para fazê-lo funcionar de maneira confiável será usar a abordagem correta. Simplesmente despejar as teclas digitadas no Microsoft Windows para que o Windows as forneça ao aplicativo em primeiro plano não será o método mais estável. Aqui está um pouco de código que usei para interagir com o PuTTY. Funcionou bem o suficiente para que eu pudesse iniciar o script, que iniciaria o PuTTY e, ainda assim, o programa poderia interagir com a instância correta do PuTTY, mesmo que o PuTTY estivesse em segundo plano.
(Você provavelmente desejará adaptar significativamente este código de exemplo.)
Não há necessariamente uma razão convincente pela qual eu ainda tenho coisas quebradas em pedaços, chamando "IfWinExist" várias vezes. Quando eu estava criando e inicialmente depurando o script, achei útil para depurar (ou pelo menos sentir que tinha uma ideia melhor do que estava acontecendo) se a extremidade remota encerrasse a conexão (o que faria com que minha janela do PuTTY fechasse) .
O principal é que ao usar o ControlSend para dar as teclas digitadas para o programa usando o PID que foi criado pelo meu comando Run, se algo ruim acontecesse, o script não continuava tentando enviar as teclas digitadas para o Windows e acabava tendo as teclas digitadas entre no programa errado.