Por Carlos Brandão, do IBGE
O IBGE utiliza IP fixo em todas as suas estações. Como nós sabemos o endereço IP de cada uma, podemos com esse programa programar uma ação via script de logon para qualquer rede que quisermos, podemos até programar uma ação para uma única estação ou para algumas.
O nosso script foi testado em Windows 98, ME, NT, 2000 e XP.
O funcionamento do programa é simples. Para executar o programa, deve-se combinar o comando IPCONFIG do MS-DOS, com o programa que faz a identificação passando como parâmetro na linha de comando, um endereço IP, ou parte dele, para que a ação desejada no seu script seja executada.
Com isso, o programa lê a saída do comando IPCONFIG do MS-DOS, e com uma pesquisa dentro dessa saída, que é um texto, procura pelo endereço IP ou parte do endereço IP que foi passado como parâmetro na linha de comando.
Estou anexando o executável e fonte do programa. Caso alguém não consiga pegar os anexos, poderá usar o fonte que coloco abaixo. Qualquer dúvida, podem fazer contato.
O programa possui um pequeno help, que é acionado digitando-se na linha de comando do DOS o seguinte: redeibge/? | more
trecho do script de logon:
ipconfig | \\ntchile01\cacic$\redeibge 172.31. if not errorlevel 4 goto :fim \\ntchile01\cacic$\chkcacic.exe :fim
programa redeibge.exe ( linguagem C ):
/****************************************************************************
IBGE - DI (Diretoria de Informatica)
Programa: redeibge
Descricao: identifica a rede do IBGE analisando a saida do IPCONFIG (MS_DOS)
Autor : Carlos Brandao (carlosbrandao@ibge.gov.br)
Data : 16/maio/2005
Versao: 1.0
*****************************************************************************
*/
#define VERSAO_PROG "1.0"
#define DATA_PROG "16/maio/2005"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream.h>
#define STR_BUSCA1 "endere"
#define STR_BUSCA2 "ip address"
#define TOT_REDES 31
#define BUFFER_SAIDA 1000
void info (void);
void procura (int argc, char *argv[], char linha[BUFFER_SAIDA]);
void procura_tabela(char linha[BUFFER_SAIDA]);
void procura_parametro(char linha[BUFFER_SAIDA], int argc, char *argv[]);
static char *redes[] = { "172.31.0."
, "172.31.1."
, "172.31.2."
, "172.31.202."
, "172.31.3."
, "172.31.203."
, "172.31.4."
, "172.31.204."
, "172.31.5."
, "172.31.205."
, "172.31.6."
, "172.31.206."
, "172.31.7."
, "172.31.207."
, "172.31.8."
, "172.31.208."
, "172.31.9."
, "172.31.209."
, "172.31.10."
, "172.31.210."
, "172.31.11."
, "172.31.211."
, "172.31.12."
, "172.31.212."
, "172.31.13."
, "172.31.213."
, "172.31.14."
, "172.31.214."
, "172.31.15."
, "172.31.215."
, "192.168.50."
};
static char *redes_desc[] = { "Canabarro"
, "Chile - CPD"
, "Chile 2§ andar - restrito"
, "Chile 2§ andar - irrestrito"
, "Chile 3§ andar - restrito"
, "Chile 3§ andar - irrestrito"
, "Chile 4§ andar - restrito"
, "Chile 4§ andar - irrestrito"
, "Chile 5§ andar - restrito"
, "Chile 5§ andar - irrestrito"
, "Chile 6§ andar - restrito"
, "Chile 6§ andar - irrestrito"
, "Chile 7§ andar - restrito"
, "Chile 7§ andar - irrestrito"
, "Chile 8§ andar - restrito"
, "Chile 8§ andar - irrestrito"
, "Chile 9§ andar - restrito"
, "Chile 9§ andar - irrestrito"
, "Chile 10§ andar - restrito"
, "Chile 10§ andar - irrestrito"
, "Chile 11§ andar - restrito"
, "Chile 11§ andar - irrestrito"
, "Chile 12§ andar - restrito"
, "Chile 12§ andar - irrestrito"
, "Chile 13§ andar - restrito"
, "Chile 13§ andar - irrestrito"
, "Chile 14§ andar - restrito"
, "Chile 14§ andar - irrestrito"
, "Chile 15§ andar - restrito"
, "Chile 15§ andar - irrestrito"
, "CCD-RJ"
};
int exibe_linha=0;
void main(int argc, char *argv[]) {
int c, i;
char saida[BUFFER_SAIDA], linha[BUFFER_SAIDA], *ptr;
// testa os argumentos
if ( argc>1 ) {
if ( strcmp(argv[1], "/?") == 0 ) {
info();
exit(0);
}
for (i=1; i<argc; i++) {
strlwr(argv[i]);
if ( strcmp(argv[i], "/l") == 0 )
exibe_linha = 1;
else {
//verifica se o codigo da rede que foi passado e valido
if ( strlen(argv[i]) <= 3 ) {
c=atoi(argv[i]);
if ( c >= (TOT_REDES + 5) || c < 5) {
printf("\nCodigo invalido.\n");
exit(0);
}
}
}
}
}
//limpa as variaveis saida e linha
for (i=0; i<BUFFER_SAIDA; i++) {
saida[i]='\0';
linha[i]='\0';
}
//armazena a saida padrao na variavel saida
i=0;
while ((c = getchar()) != EOF) {
saida[i]=c;
i++;
if ( i >= (BUFFER_SAIDA-1) ) break;
}
saida[i]='\0';
//converte a saida do IPCONFIG para caixa baixa
strlwr(saida);
// printf(saida);
//separa a linha com endereco IP
ptr = strstr(saida, STR_BUSCA1);
if (ptr==NULL) ptr = strstr(saida, STR_BUSCA2); // se nao encontrar
if (ptr!=NULL) { // se encontrar
//armazena a linha que contem a srting pesquisada
//na variavel linha
i=0;
while ( !(ptr[i] == '\n' || ptr[i] == '\0') ) {
linha[i]=ptr[i];
i++;
}
linha[i]='\0';
//exibe a linha (se for solicitado via parametro)
if (exibe_linha) cout << "\nString: [" << linha << "]" << endl;
procura(argc, argv, linha);
}
//caso a rede nao seja identificada
printf("\nRede nao identificada.\n");
exit(1); //retorna o c¢digo de rede desconhecida
}
void procura (int argc, char *argv[], char linha[BUFFER_SAIDA]) {
//realiza a pesquisa usando a tabela interna
switch (argc) {
case 1: procura_tabela(linha);
case 2:
if ( strcmp(argv[1], "/l") == 0 )
procura_tabela(linha);
else
procura_parametro(linha, argc, argv);
default: procura_parametro(linha, argc, argv);
}
}
void procura_tabela(char linha[BUFFER_SAIDA]) {
//realiza a pesquisa usando a tabela interna
int i=0;
char *ptr;
while (i<TOT_REDES) {
ptr = strstr(linha, redes[i]); //pesquisa pela string da variavel endereco
if (ptr!=NULL) { // se encontrar
cout << "\nRede identificada: [" << i+5 << "] - " << redes[i] << "xxx (" << redes_desc[i] << ")" << endl;
exit(i+5); //sai do programa e retorna o codigo da rede
}
i++;
}
}
void procura_parametro(char linha[BUFFER_SAIDA], int argc, char *argv[]) {
//realiza identificacao da rede atraves de parametros
//fornecidos pela linha de comando
int i, indice;
char *ptr;
//procura por cada codigo e/ou endereco fornecido pelo usuario
for (i=1; i<argc; i++) {
//usuario forneceu endereco IP para pesquisa
if ( strlen(argv[i]) > 3 ) {
ptr = strstr(linha, argv[i]);
if (ptr!=NULL) { // se encontrar
cout << "\nEndereco identificado: " << argv[i] << endl;
exit(4); //sai do programa
}
} else { //usuario forneceu o codigo da tabela interna para pesquisa
indice = atoi(argv[i]) - 5;
ptr = strstr(linha, redes[indice]);
if (ptr!=NULL) { // se encontrar
cout << "\nRede identificada: [" << indice+5 << "] - " << redes[indice] << "xxx (" << redes_desc[indice] << ")" << endl;
//sai do programa e retorna codigo da rede
exit(indice+5);
}
}
}
}
void info (void) {
//exibe informacoes sobre o programa
int i=0;
printf("\nIBGE - DI (Diretoria de Informatica)");
printf("\nredeibge.exe V%s (%s)", VERSAO_PROG, DATA_PROG);
printf("\nIdentifica a rede do IBGE analisando a saida do IPCONFIG (MS_DOS)");
printf("\n\n /? - informacoes\n /L - exibe a string usada para identificar a rede");
printf("\n\nExemplos:\n");
printf("\n 1) ipconfig | redeibge");
printf("\n mostra a qual rede pertence\n");
printf("\n 2) ipconfig | redeibge/L");
printf("\n mostra a qual rede pertence exibindo a string que foi inspecionada\n");
printf("\n 3) ipconfig | redeibge 31 32");
printf("\n mostra se o endereco IP pertence as redes 31 e 32");
printf("\n de acordo com a tabela interna do programa\n");
printf("\n 4) ipconfig | redeibge 172.31.24. 172.31.214. 172.31.0.");
printf("\n mostra se o endereco IP pertence");
printf("\n as redes 172.31.24.xxx, 172.31.214.xxx ou 172.31.0.xxx");
printf("\n\nCodigos de retorno:\n[1] - Rede nao identificada");
printf("\n[4] - Rede identificada");
while (i<TOT_REDES) {
printf("\n[%d] - %sxxx (%s)", i+5, redes[i], redes_desc[i]);
i++;
}
}