Dicas para scripts de Logon

Instalacao condicional

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++; 
        } 
} 

 
script_logon.txt · Modificada em: 2007/08/12 20:27 (external edit)
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki