O Cartão MegaBônus Unicard é a oportunidade de você ter uma renda extra através do bom relacionamento com as pessoas que você tem contato. Quanto mais amigos, parentes e conhecidos aderirem e usarem o cartão*, melhor para você. E, quanto mais pessoas eles indicarem e fizerem uso do cartão, mais MegaBônus você acumula e mais créditos recebe.
Com o MegaBônus é possível fazer compras em estabelecimentos credenciados, como nos cartões de crédito tradicionais, e os valores gastos se transformam em MegaBônus, que são convertidos em créditos, para você gastar com o que quiser.
Mais do que um cartão de crédito, o MegaBônus possibilita que você forme um círculo de relacionamento, sem limites, com todas as pessoas que foram indicadas por você, as indicadas por elas e assim por diante.
Central de atendimento:
Capitais e Regiões Metropolitanas:
4004-3000
Outras localidades:
0800 722 3000
Código de indicação: 117.061.816.6005
terça-feira, 11 de dezembro de 2007
Cartão Mega Bônus Unicard
Postado por
Menezes
às
17:28
0
comentários
segunda-feira, 10 de dezembro de 2007
Google AdSense no Joomla!
Olá amigos.
Nos últimos dias estive pensando numa maneira de utilizar os códigos da famosa e poderosa ferramenta de publicidade AdSense do Google no CMS Joomla! (que na minha opinião, entre os gratuitos, é o melhor). Então comecei a procurar na internet algum componente/módulo que se viabiliza esta façanha.
Achei muitas, testei algumas, porém, não gostei de nenhuma. Os motivos foram diversos: facilidade de uso, flexibilidade, compatibilidade com o google, etc. Enfim, tive que partir para uma outra solução: desenvolver!!!
Quem já é assinante do Google AdSense sabe que a mais nova novidade desta ferramenta é a possibilidade de formatar um bloco de anúncios sem alterar o código, por exemplo: por padrão os links gerados pelo AdSense são na cor azul. Antigamente ao alterar essa cor, um novo código era gerado pelo AdSense, sendo assim necessário atualizar o código no site. A novidade é que agora você altera a formatação do anuncio no site no AdSense e alguns minutos depois a alteração aparace em seu site, sem a necessidade de alterar o código fonte.
Sabendo desta preciosa informação percebi que um simples módulo com a única função de escreve um bloco de código resolveria meu problema tranqüilamente, sem a necessidade de perder horas e horas de desenvolvimento ou aprendendo a utilizar algo que alguém desenvolveu.
Para tanto, bastam dois arquivos muito simples:
- mod_wmads.xml: configurações do módulo;
- mod_wmads.php: resgata o bloco de código do AdSense e escreve ele na tela;
Vejamos agora o fonte destes arquivos:
mod_wmads.xml
<?xml version="1.0" encoding="iso-8859-1"?>
<mosinstall type="module">
<name>WMAds</name>
<author>WMenezes</author>
<creationDate>December, 2007</creationDate>
<copyright>WMenezes!</copyright>
<license>GNU/GPL</license>
<authorEmail>wesley_menezesmsn.com</authorEmail>
<authorUrl>http://wmenezes.blogspot.com</authorUrl>
<version>1.0</version>
<description><!CDATA
<h3><a href="http://wmenezes.blogspot.com/" target="_blank">WMAds</a> é a maneira mais fácil de implementar códigos do Google AdSense no Joomla!</h3>
></description>
<files>
<filename module="mod_wmads">mod_wmads.php</filename>
</files>
<params>
<param name="wmads_code" type="textarea" default="" label="Código Google AdSense" description="Cole aqui o código gerado pelo site do Google AdSense" cols="30" rows="8" />
</params>
</mosinstall>As tags mais importantes do xml acima são:
- file->filename: utilizada para instalar de desinstalar o módulo no site;- params->param: utilizada para montar o formulário de configuração do módulo;
mod_wmads.php
<?php
/*
* package WMAds Module 1.0 from WMenezes
* copyright WMenezes (C) 2007 WMenezes.globspot.com All rights reserved.
* license http://www.gnu.org/copyleft/gpl.html GNU/GPL, see LICENSE.php
* Joomla! is free software.
* This extension is made for Joomla version 1.0.x;
* Also works for Joomla 1.5 in legacy mode;
** WE LOVE JOOMLA! **
*/
// NEGA O ACESSO DIRETO
defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );
// RESGATA O CÓDIGO GRAVADO
$ads_code = $params->get('wmads_code');
// ESCREVE NA TELA O CÓDIGO
echo str_replace("<br />", "", $ads_code);?>Passos para a instalação:
- compacte os dois arquivos em formato ZIP com o nome mod_wmads.zip;- na página de administração do Joomla! Clique no menu Instaladores->Módulos;
- no item "Pacote de arquivos" clique no botão "Arquivo..." e selecione o arquivo mod_wmads.zip que você gerou;- clique no botão "Enviar o arquivo e instalar";
Se tudo ocorrer bem você receberá a mensagem de Módulo enviado com sucesso.
Para configurar o bloco anúncios clique no menu Módulo->Módulos do site, ainda na página de administração do Joomla! Esta tela lista todos os módulos instalados. Um novo, com o nome WMAds foi gerado. Clique nele para editá-lo.
A guia detalhes é padrão para todos os módulos. Nela você escolhe o título, se este deve ou não ser exibido, posição, ordem, nível de acesso e os locais onde módulo deve aparecer. Altere o ítem publicado para "Sim" e selecione a posição de sua preferência (ítem posição).
Em parâmetros temos uma caixa de texto com o nome "Código Google AdSense". Cole nesta caixa o código gerado pelo AdSense e clique no botão "Salvar".
Pronto. Seus anúncios do Google AdSense já devem aparecer no site, simples assim.
Para ter mais de um bloco de anúncios, basta utilizar a opção copiar da tela "Módulos do Site".Se alguém quiser conferir o resultado acesse www.fimel.com.br
Abraços!!!
Postado por
Menezes
às
09:49
1 comentários
quinta-feira, 25 de outubro de 2007
Tabela dinâmica com paginação (Data grid) e ordenação de colunas em HTML, ASP 3.0, CSS e AJAX.
Olá pessoal.
Neste artigo eu vou mostrar como utilizar uma classe em ASP que gera um Data Grid básico em HTML (foi testado com MSSQL e Access).
Características da classe WMTable:
• Paginação automática;
• Ordenação de dados ao clicar na coluna;
• cabeçalho personalizado;
• Cores alternadas de linhas;
• Ao passar o mouse, altera-se a cor da linha;
• Funciona com ou sem ajax;
• Funciona perfeitamente com os navegadores Internet Explorer e Firefox;
• Campos com conteúdo personalizado – este item, pra mim, é especial. Com ele eu consigo adicionar ao conteúdo de uma coluna um link ou uma imagem, por exemplo.
Dependências de arquivos (com link):
- WMTable.asp – Classe para geração das tabelas dinâmicas;
- ajax.js – objeto JavaScript com diversas funções para AJAX;
- pubs.mdb - Um banco de dados de sua preferência. No caso do nosso exemplo, Access;
A imagem abaixo é uma amostra do resultado que pode ser obtido com a classe WMTable.Para isso, é preciso criar dois arquivos:
- tabela.asp – arquivo que utiliza a classe WMTable.
- tabela.html – arquivo que será invocado pelo navegador;
Vejamos então o código fonte destes arquivos:
Tabela.asp
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<!--#include file="WMTable.asp"-->
<%
' CONEXÃO COM O BANCO DE DADOS
' MAIORES INFORMAÇÕES em http://www.connectionstrings.com/
connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& Server.MapPath("pubs.mdb") &";"
' CRIA UM OBJETO WMTable
Set tbl = new WMTable
' ATRIBUTOS DA TAG <TABLE>
' A PROPRIEDADE SETATTRIBUTE PODE SER UTILIZADA PARA QUALQUER ATRIBUTO
' EXISTENTE DE UMA TABELA
tbl.setAttribute("class") = "cssTable"
tbl.setAttribute("width") = "70%"
tbl.setAttribute("align") = "center"
' COLUNAS
tbl.ColNames = Array("Nome","Sobrenome","Fone") ' Título das colunas
tbl.ColWidth = Array("40%","40%","20%") ' largura em pixel ou porcentagem
tbl.ColFields = Array("au_fname","au_lname","phone") ' nomes dos campos no banco de dados
tbl.ColAlign = Array("left","left","left") ' alinhamento das colunas
tbl.ColText = Array("" _
,"<a href=""javascript:void(0)"" onclick=""alert(':au_fname: :au_lname:');"">:au_lname:</a>" _
,"") ' Conteúdo, efetivamente, das colunas.
' Imagens que indicam que a ordem da coluna (crescente ou descrescente)
tbl.ImageAsc = "/includes/class/sort_asc.png"
tbl.ImageDesc = "/includes/class/sort_desc.png"
tbl.ConnectionString = connString ' string de conexão com o banco de dados
tbl.Source = "SELECT * FROM [authors]" ' comando que será executado no banco
tbl.Paginate = True ' Indica se deve ser feita a paginação
tbl.PageSize = 10 ' indica a quantidade de registros por página
tbl.JsFunction = "wmTable(':qString:');" ' esta é a função JavaScript que utiliza o ajax
tbl.Create("tblTeste") ' função que gera o código HTML
Set tbl = Nothing ' Destrói o objeto para não ficar ocupando memória do servidor web
%>
O banco de dados pubs.mdb possui uma tabela chamada authors que é uma cópia da tabela authors do banco pubs do SQL Server 2000.
Observe a propriedade ColText do arquivo tabela.asp. A nossa tabela HTML possui três colunas e este comando define o texto que será exibido dentro dos campos de cada coluna. Quando nada é informado, o conteúdo do campo HTML será o conteúdo do banco de dados. Todo texto entre dois pontos representa o nome de um campo no banco de dados. Desta forma é possível personalizar todo o conteúdo da tabela.
A propriedade JsFunction informa o nome da função javascript que será invocada na paginação e ordenação das colunas. Esta função contém código AJAX que processa a página tabela.asp, passando alguns parâmetros por querystring. Após o processamento, exibe o resultado obtido. Quando a propriedade não é informada, a função é substituída por outra, nativa do javascript, document.location.
As demais linhas estão bem comentadas, assim, acredito que explicações adicionais não se fazem necessárias, porém, se alguém tiver dúvidas basta comentar o artigo que eu respondo.
Agora vamos ver o código do arquivo tabela.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>WMTable</title>
<style type="text/css">
<!—
/* FONTE PADRÃO */
body, th, td, select { font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
/* CABEÇALHO DA TABELA */
.cssTable thead th { color:#FFFFFF; background-color:#FF794A; cursor:pointer; }
/* LINHA PAR */
.cssTable tbody tr { color:#000000; background-color:#EEEEE6; border: 1px #CCCCCC; }
/* LINHA ÍMPAR */
.cssTable tbody .even { color:#000000; background-color:#E2E2E2; border: 1px #CCCCCC; }
/* LINHA AO PASSAR O MOUSE */
.cssTable tbody tr:hover { background-color:#FFCC99; }
/* MARGENS INTERNAS E EXTERNAS DOS CAMPOS DA TABELA */
.cssTable th, .cssTable td { padding:5px; margin:0px; }
-->
</style>
<script type="text/javascript" src="ajax.js"></script>
<script>
// FUNÇÃO AJAX QUE EXECUTA A PÁGINA TABELA.ASP
function wmTable( qString ) {
qString = (qString)?qString:'rnd=' + Math.random();
var ajax = new sack( 'tabela.asp' );
ajax.element = 'divWMTable';
ajax.onError = function(){ this.elementObj.innerHTML = this.response; };
ajax.runAJAX( qString );
}
// AO CARREGAR A PÁGINA HTML
window.onload = function(){ wmTable() };
</script>
</head>
<body>
<div id="divWMTable"></div>
</body>
</html>
Vamos entender o código desta página. A classe WMTable gera um tabela com a seguinte estrutura:
<table id=”id_da_tabela”>
<thead>
<tr>
<th>Coluna 1</th>
<th>Coluna 2</th>
<th>Coluna 3</th>
</tr>
</thead>
<tbody>
<tr>
<td>Texto1</td>
<td>Texto1</td>
<td>Texto1</td>
</tr>
<tr class=”even”>
<td>Texto1</td>
<td>Texto1</td>
<td>Texto1</td>
</tr>
</tbody>
<tfoot>
<tr>
<td colspan=”3”> texto da paginação</td>
</tr>
</tfoot>
</table>
Com essa estrutura fica fácil desenvolver um estilo (CSS) para cada bloco da tabela (cabeçalho, corpo e rodapé). Note que no CSS da página tabela.html existe um item com o nome “cssTable” que é o mesmo nome informado pelo comando setAttribute(“class”) no arquivo tabela.asp.
Mas a grande funcionalidade desta página html esta na função wmTable do java script. Esta função utiliza um objeto que se encontra no arquivo ajax.js, o sack.
Através do XMLHTTP do navegador, o sack facilita a implantação do AJAX em páginas da web. As principais propriedades e funções deste objeto são:
• sack(file): este é o nome do objeto e, ao ser instanciado precisa do parâmetro file, que é o caminho completo do arquivo dinâmico que será processado pelo servidor web. Este arquivo pode ser um ASP, PHP, ColdFusion etc;
• element: ID do elemento HTML que receberá a resposta do servidor web. Este elemento pode ser uma div, um input text ou outra tag qualquer.
• reponse: resposta do servidor web em formato texto;
• responseXML: resposta do servidor web em formato XML;
• onLoading: função executada enquanto o servidor web está processando a página dinâmica. Eu utilizo muito esta função para mostrar a mensagem “carregando...” para o usuário;
• onError: função executada quando a página dinâmica contem erro em seu script;
• onCompletation: função executada após o término do processamento da página dinâmica pelo servidor web.
• runAJAX( QueryStrin ): esta é a função que faz a requisição para o servidor web.
Agora é só testar sua tabela com paginação e ordenação de campos. Fácil, prático e rápido.
Postado por
Menezes
às
17:23
2
comentários
terça-feira, 16 de outubro de 2007
SACK - Simple AJAX Code-Kit
Olá amigos.
Hoje eu vou falar um pouco sobre Ajax, que é a bola da vez entre os programadores. Independente da linguagem que cada um utiliza, na web o ajax dá uma bela incrementada no sistema desenvolvido.
Pra quem não sabe, Ajax é um acrônimo para Asynchronous Javascript And XML. Já ouvi muitos dizerem que Ajax é uma nova tecnologia, mas não é. Ajax é um conjunto de tecnologias trabalhando juntas.
A grande vantagem do Ajax é o dinamismo que ele proporciona as páginas web. Vamos entender melhor. Num sistema comum, quando o usuário interage com sua interface, geralmente esta interação gera uma requisição HTTP para o servidor web. O servidor processa esta requisição e devolve a resposta. O grande problema é que a página que faz a requisição é recarregada, e informações como de um formulário, por exemplo, são perdidas. Isso é perceptível para qualquer usuário, transmitindo uma sensação de lentidão, e de certa forma é lento.
Aí é que entra o Ajax. Através de um código simples em Javascript, é possível enviar esta requisição ao servidor de forma assíncrona ou não, sem a necessidade de recarregar a página. Desta forma o processamento e exibição do resultado acontecem de uma forma mais rápida que a convencional.
Bom chega de blablabla e vamos colocar a "mão na massa".
O primeiro passo é criar um objeto XMLHTTP. Para criar este objeto é muito importante que o programador faça um código que funcione em diversos navegadores, caso contrário, muitas críticas surgirão para esse sistema "limitado" e "preconceituoso". ;-)
O código abaixo cria um objeto XMLHTTP que funciona no Internet Explorer e Firefox, e mostra um exemplo simples de utilização deste objeto.
A página exemplo.asp poderia resgatar as variáveis passadas por QueryString e escreve-las através do comando response.write, por exemplo.var ajax = null;
try {
ajax = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e1) {
try {
ajax = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) {
ajax = null;
}
}
if( ajax ) {
ajax.open('GET', 'exemplo.asp?a=1&b=2&c=3', true); // true=Assíncrono,false=sincrono
ajax.onreadystatechange = function() {
if( ajax.readyState == 4 ) { // VERIFICA SE O PROCESSAMENTO DO SERVIDOR TERMINOU
var obj = document.getElementById('id_do_elemento_que_recebe_a_resposta');
if( ajax.status == 200 ) { // Status 200 significa que a requisição foi processada com êxito
obj.innerHTML = ajax.responseText;
} else {
obj.innerHTML = 'Erro no processamento da requisição.';
}
}
}
ajax.send(null);
} else {
alert( 'Seu browser não tem suporte a requisições XMLHTTP.' );
}
Tudo isso parece muito bonito, porém, o que isso tem a ver com o título deste post? Tudo.
O título é o nome de um objeto que encontrei na net que faz tudo o que eu mostrei acima de uma maneira muito mais simples. Com este objeto o mesmo exemplo acima, pode ser re-escrito em apenas três linhas. Vejam só:
var ajax = new sack('exemplo.asp');
ajax.element = 'id_do_elemento_que_recebe_a_resposta';
ajax.runAJAX('a=1&b=2&c=3');
Este objeto permite, por exemplo, informar o usuário que o Ajax está aguardando o término do processamento no servidor, e executar uma função após o procesamento, mas tudo isso de forma simples e prática. Veja o mesmo exemplo com a mensagem "Carregando..." e um alert indicando o termino ou erro do processamento no servidor:var ajax = new sack('exemplo.asp');
ajax.element = 'id_do_elemento_que_recebe_a_resposta';
ajax.onLoading = function(){ this.elementObj.innerHTML = 'Carregando...'; };
ajax.onError = function(){ alert('Ocorreu um erro ao processar a requisição.'); };
ajax.onCompletion() = function(){ alert('Requisição processada com êxito'); };
ajax.runAJAX('a=1&b=2&c=3');
Simples e fácil, não acham? Eu particularmente gosto muito deste objeto e utilizo em muitos sistemas que desenvolvo. Vou postar outros códigos utilizando este objeto futuramente. O objeto pode ser baixado em http://www.twilightuniverse.com/downloads/sack/tw-sack.js.Aquele abraços e até o próximo post.
Postado por
Menezes
às
08:35
0
comentários
Marcadores: ajax
quinta-feira, 11 de outubro de 2007
Criando combos HTML através de uma classe ASP
Olá amigos internautas.
Hoje eu presentear os amantes do bom e velho ASP 3.0 com uma classe que cria combos em html com o resultado de uma query no banco de dados.
Neste exemplo eu estou usando o SQL Server como banco de dados, porém, basta você adaptar a ConnectionString para a base de sua preferência. Em connectionstrings.com você encontra diversos exemplos de connectionString.
O objeto utilizado para conectar ao banco de dados é o ADODB.
Vantagem: código estruturado (limpo de sujeiras) e de fácil manutenção.
Então, mãos a obra. Abaixo encontra-se o código da classe que eu chamei de WMCombo.asp:
<%
'===================================================================================================================================
' Autor: Wesley de Menezes Flor
' Descrição: Criar combos (tag SELECT do HTML) a partir de uma query no Banco de Dados.
' Contato: http://wmenezes.blogspot.com/
'===================================================================================================================================
' CREDITOS
Response.AddHeader "keywords", "Este site utiliza a classe WMCombo para geração de combos. http://wmenezes.blogspot.com/"
'===================================================================================================================================
Class WMCombo
' PROPRIEDADES DO SELECT
Private oAttributes
' OPTIONS
Private sOptionText
Private sOptionValue
Private sOptionDefault
' BANCO DE DADOS
Private rsTable
Private sQuery
Private sConnString
' AO INICIAR A CLASSE
Private Sub Class_Initialize()
Set rsTable = Server.CreateObject("ADODB.RecordSet")
Set oAttributes = Server.CreateObject("Scripting.Dictionary")
sOptionDefault = 0
End Sub
' PROPRIEDADES DA CLASSE
Public Property Let setAttribute( attributeName, attributeValue )
oAttributes.Add attributeName, attributeValue
End Property
Public Property Let OptionTextField( optionTextFieldValue )
sOptionText = optionTextFieldValue
End Property
Public Property Let OptionValueField( optionValueFieldValue )
sOptionValue = optionValueFieldValue
End Property
Public Property Let OptionDefaultValue( optionDefault )
sOptionDefault = optionDefault
End Property
Public Property Let Query( queryValue )
sQuery = queryValue
End Property
Public Property Let ConnectionString( connStringValue )
sConnString = connStringValue
End Property
' FUNÇÃO QUE CRIA A COMBO
Public Function Create( selectName )
' TAG SELECT
Response.Write "<select name="""& selectName &""" id="""& selectName &""""
' PROPRIEDADES DA TAG SELECT
Dim sKey
For Each sKey In oAttributes
Response.Write Space(1) & sKey & "="""& oAttributes(sKey) &""""
Next
Response.Write ">" & vbCrLf
' PRIMEIRA OPTION
Response.Write Space(2) & "<option value=""0"""
If sOptionDefault = 0 Then Response.Write " selected=""selected"""
Response.Write ">-- Selecione --</option>" & vbCrLf
' ABRE A TABELA NO BANCO DE DADOS
Const adUseServer = 2
Const adUseClient = 3
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
Const adLockReadOnly = 1
rsTable.CursorLocation = adUseClient
rsTable.CursorType = adOpenForwardOnly
rsTable.LockType = adLockReadOnly
rsTable.Open sQuery, sConnString
' CRIA AS OPTIONS COM AS INFORMAÇÕES DO BANCO
While Not rsTable.EOF
Response.Write Space(2) & "<option value="""& rsTable.Fields(sOptionValue) & """"
If sOptionDefault = rsTable.Fields(sOptionValue) Then Response.Write " selected=""selected"""
Response.Write ">"
Response.Write Server.HTMLEncode( rsTable.Fields(sOptionText) )
Response.Write "</option>" & vbCrLf
rsTable.MoveNext
Wend
rsTable.Close
' FINALIZA A COMBO
Response.Write "</select>" & vbCrLf
' DESTRÓI OBJETOS
Set rsTable = Nothing
Set oAttributes = Nothing
End Function
End Class
%>
Exemplo de utilização da classe:
<!--#include virtual="/includes/class/WMCombo.asp"-->
<%
Set cb = New WMCombo
cb.OptionTextField = "Descricao"
cb.OptionValueField = "Codigo"
cb.OptionDefaultValue = 20
cb.Query = "SELECT Codigo, Descricao FROM Tabela"
cb.ConnectionString = "cole_aqui_a_string_de_conexão_do_seu_banco_de_dados"
cb.setAttribute("class") = "cssCombo"
cb.Create "cbTeste"
Set cb = Nothing
%>
Pronto, agora basta acessar sua página de exemplo, e você terá uma combo preenchida com os dados de uma query no banco de dados.
Agora só falta você opnar. Envie um comentário sobre este post.
Aquele abraço e até +.
Postado por
Menezes
às
09:30
1 comentários
quarta-feira, 10 de outubro de 2007
Atualizando Usuários do Active Director com ADSI
Bom, este é o meu post de inauguração do blog. Vou começar com uma situação que passei a pouco tempo e que acho que outros que trabalham em empresas de médio porte também passaram ou passarão um dia. (rsrsr)
Eis o meu problema !!!
A universidade onde trabalho possui diversos prédios, cada prédio têm um servidor Microsoft Windows com AD (Active Diretor) armazenando o login e senha de todos os alunos. O aluno pode acessar qualquer máquinas de laboratórios em qualquer um dos prédios. Estes prédios não possuem, ainda, um link de comunicação entre si. Existe ainda, um site de serviços ao aluno, onde ele pode alterar a sua senha. Então você me pergunta: Qual o problema? Eu respondo: Sincronizar a senha de todos os alunos com o AD de todos os prédio e com a base de dados do site (SQL Server).
A solução que encontramos (eu e a equipe que trabalha comigo), não é a melhor, nem a mais segura, mas sim, a que resolveu nosso problema. Vejamos então passo-a-passo:
1º) Foi criado um job no servidor SQL Server que exporta para um arquivo texto os logins e senhas dos alunos novos e dos alunos que alteraram a senha;
2º) Agendamos no “schedule tasks” do servidor SQL Server o upload do arquivo texto para um FTP;
3º) No servidor de cada prédio outro agendamento fazendo o download do arquivo texto;
4º) E por último, um script em VBS que atualiza o AD com as informações do arquivo texto, também foi agendado.
On Error Resume Next
' '================================================================================================================================
' Autor : Wesley de Menezes Flor
' Descrição : Cria/Altera usuário e senha no AD com os dados de um arquivo texto.
'================================================================================================================================
'===================================================================================================================================
' Função que altera a opção do "User canoot change password" do AD
' Origem: http://msdn2.microsoft.com/en-us/library/aa746399.aspx
'===================================================================================================================================
Sub SetUserCannotChangePassword(strDomain, strUser, strUserCred, strPassword, fUserCannotChangePassword)
Dim fUser
Const ADS_UF_PASSWD_CANT_CHANGE = &H40
strPath = "WinNT://" & strDomain & "/" & strUser
If "" <> strUserCred Then
' Bind to the group with the specified username and password.
Set fUser = GetObject("WinNT:").OpenDSObject(strPath, strUserCred, strPassword, 1)
Else
' Bind to the group with the current credentials.
Set fUser = GetObject(strPath)
End If
lUserFlags = fUser.Get("userFlags")
If fUserCannotChangePassword Then
lUserFlags = lUserFlags Or ADS_UF_PASSWD_CANT_CHANGE
Else
lUserFlags = lUserFlags And Not ADS_UF_PASSWD_CANT_CHANGE
End If
' Modify the userFlags property.
fUser.Put "userFlags", lUserFlags
' Commit the changes to the server.
fUser.SetInfo
Set fUser = Nothing
End Sub
'===================================================================================================================================
' GRAVA ARQUIVO DE LOG
' EX: Call LogWrite ( Err, fsoFile, "texto", "comando" )
'===================================================================================================================================
Sub LogWrite ( Erro, fsTxt, Descricao, Comando )
If Erro.Number <> 0 Then
fsTxt.WriteLine( """" & Now() & """;" & Erro.Number & ";""" & Erro.Description & """;"""& Comando &""" " )
WScript.Quit
Else
fsTxt.WriteLine( """" & Now() & """;" & Erro.Number & ";""" & Descricao & """;"""& Comando &""" " )
End If
End Sub
' CONSTANTES ADSI
' Fonte: http://msdn2.microsoft.com/en-us/library/aa772300.aspx
Const ADS_SECURE_AUTHENTICATION = 1, ADS_USE_ENCRYPTION = 2, ADS_SERVER_BIND = 512, ADS_UF_DONT_EXPIRE_PASSWD = &H10000
' CONSTANTES FILE SYSTEM OBJECT
Const ForReading = 1, ForWrite = 2, ForAppending = 8
' OBJETOS DE DOMINIO LOCAL
Set objRootDSE = GetObject("LDAP://RootDSE")
ouDomain = objRootDSE.Get("DefaultNamingContext") ' Resultado ==> DC=dominio,DC=com,DC=br
Domain = Replace( Replace(ouDomain, "DC=", ""), ",", ".") ' Resultado ==> dominio.com.br
nt4Domain= Mid(Domain, 1, InStr(Domain, ".")-1 ) ' EX.: dominio.com.br = dominio
' DIRETÓRIO ATUAL / ARQUIVO DE LOG
scFile = WScript.ScriptFullName ' C:\SCRIPT\alunos-users.vbs
Dir = Left( scFile, InstrRev(scFile, "\") ) ' C:\SCRIPT\
Set objRootDSE = Nothing
' ALIMENTA VARIÁVEIS COM OS ARMENTOS
Set WshNetwork = WScript.CreateObject("WScript.Network")
Servidor = WshNetwork.ComputerName
Set WshNetwork = Nothing
' UNIDADE ORGANIZACIUONAL (OU) ONDE ESTÃO OS USUÁRIO QUE TERÃO A SENHA ALTERADA
strOU = "OU=Alunos,OU=Usuarios" & "," & ouDomain ' OU=Alunos,OU=Usuarios
' GRUPO DOS ALUNOS CRIADOS
ouGrupo = "CN=Grupo Alunos,OU=Alunos,OU=Usuarios" & "," & ouDomain ' CN=Grupo Alunos,OU=Alunos,OU=Usuarios
' ARQUIVO COM OS USUÁRIOS QUE SERÃO CRIADOS
SourcePath = Dir & "alunos-users.txt"
sDir = Mid( SourcePath, 1, InStrRev(SourcePath, "\") )
Tabela = Mid( SourcePath, InStrRev(SourcePath, "\") + 1 )
' ARQUIVO TEXTO SEM TÍTULO
' FONTE: http://www.connectionstrings.com/?carrier=textfile
txtConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="& sDir &";Extended Properties=""text;HDR=No;FMT=Delimited(;)"";"
' INFORMAÇÕES DA TABELA/ARQUIVO
RA = 0
Aluno = 1
SenhaRA = 2
Faculdade = Array(3,4)
Curso = Array(5,6)
' TRATAMENTO DO USUÁRIO DE LOGIN E DOMINIO
adUser = nt4Domain & "\" & AdUser ' dominio\username
DomainServer = Servidor & "." & Domain ' servidor.dominio.com.br
' OBJETOS DO ARQUIVO DE LOG
LogFile = Dir & Servidor & "-" & nt4Domain & "-log.csv"
Set fso = CreateObject("Scripting.FileSystemObject")
Set fLog = fso.OpenTextFile(LogFile, ForAppending, True)
' CABEÇALHO DE ARQUIVO DE LOG
Set txt = fso.GetFile(LogFile)
If txt.Size = 0 Then fLog.WriteLine( """Data/Hora"";Código do Erro;""Descrição do Erro"";""Comando""" )
Set txt = Nothing
Call LogWrite ( Err, fLog, "Início do processo.", "" )
' ABRE CONEXÕES COM O SERVIDOR AD E SQL/TXT
Set oConn = CreateObject("ADODB.Connection")
Set rsSQL = CreateObject("ADODB.RecordSet")
Set rsTMP = CreateObject("ADODB.RecordSet")
Set rsAD = CreateObject("ADODB.RecordSet")
oConn.Provider = "ADsDSOOBJECT"
oConn.Open "DS Query"
Call LogWrite( Err, fLog, "ADO Conn - Aberta um conexão com o AD.", "Open DS Query")
' ABRE TABELA DO SQL / TXT
' CursorLocation, CursorType,
Const adUseNone = 1, adUseServer = 2, adUseClient = 3
Const adOpenUnspecified = -1, adOpenForwardOnly = 0, adOpenKeyset = 1, adOpenDynamic = 2, adOpenStatic = 3
Const adLockUnspecified = -1, adLockReadOnly = 1, adLockPessimistic = 2, adLockOptimistic = 3, adLockBatchOptimistic = 4
rsSQL.CursorLocation = adUseClient
rsSQL.CursorType = adOpenForwardOnly
rsSQL.LockType = adLockReadOnly
rsSQL.Open "SELECT * FROM [" & Tabela & "]", txtConn
If Not rsSQL.EOF Then rsSQL.MoveFirst
Call LogWrite( Err, fLog, "ADO RS - Tabela de origem aberta (SQL/TXT)", rsSQL.Source)
' OBJ DOMINIO
Set oDomain = GetObject("LDAP://"& DomainServer & "/" & strOU)
Call LogWrite( Err, fLog, "OU Principal aberta.", "GetObject(LDAP:).OpenDSObject(LDAP://"& DomainServer & "/" & strOU & ", adUser, adPass, 1)" )
' VARRE OS USUÁRIOS DA 'OU' ESPECIRFICADA
While Not rsSQL.EOF AND Err.Number = 0
' QUERY QUE SERÁ EXECUTADA NO AD
strQuery = "SELECT ADsPath, cn, Name, givenName, initials, sn, samAccountName, department, telephoneNumber, mail, userPrincipalName, distinguishedName, homeDirectory, homeDrive, canonicalName, scriptPath, userAccountControl FROM 'LDAP://" & DomainServer & "' WHERE objectCategory='user' AND samAccountName = '"& rsSQL.Fields(RA) &"'"
' VERIFICA SE O USUÁRIO EXISTE NO AD
rsAD.Open strQuery, oConn
' SENHA QUE SERÁ GRAVADA NO AD
strPass = Trim(rsSQL.Fields(SenhaRA))
' CRIA O USUÁRIO SE ELE NÃO EXISTIR
If rsAD.EOF Then
' OU DO CURSO DO ALUNO
ouCurso = rsSQL.Fields(Faculdade(0)) & "-" & rsSQL.Fields(Curso(0))
deCurso = rsSQL.Fields(Faculdade(1)) & " - " & rsSQL.Fields(Curso(1))
' CRIA/ABRE A OU DO CURSO
rsTmp.Open "SELECT * FROM 'LDAP://"& DomainServer & "/" & strOU &"' WHERE name='"& ouCurso &"' AND objectCategory='organizationalUnit'", oConn
If rsTmp.EOF Then
' CRIA A 'OU' DO CURSO
Set oCurso = oDomain.Create("organizationalUnit", "ou=" & ouCurso)
oCurso.Put "Description", deCurso
oCurso.SetInfo
Call LogWrite( Err, fLog, "LDAP SetInfo - OU 'OU="& ouCurso &"' do curso foi criada.", "Criar ou=" & ouCurso )
' DESTRÓI
Set oCurso = Nothing
End If
rsTmp.Close
' ABRE O GRUPO DE USUÁRIOS
Set oGrupo = GetObject("LDAP://"& DomainServer & "/"& ouGrupo)
' CRIA O USUÁRIO
Set oCurso = GetObject("LDAP://"& DomainServer & "/OU="& ouCurso & "," & strOU)
Set oUser = oCurso.Create("User", "cn=" & rsSQL.Fields(RA).Value)
oUser.Put "sAMAccountName", rsSQL.Fields(RA).Value ' Nome de Logon do usuário (anterior ao Windows 2000)
oUser.SetInfo
oUser.AccountDisabled = False
oUser.Put "Description", rsSQL.Fields(Aluno).Value ' Descrição
oUser.Put "displayName", rsSQL.Fields(Aluno).Value ' Display Name
oUser.Put "userPrincipalName", rsSQL.Fields(RA).Value & "@" & Domain ' Nome de Logon do usuário
oUser.Put "userAccountControl", ADS_UF_DONT_EXPIRE_PASSWD ' A senha nunca expira
oUser.SetPassword(strPass) ' Senha
oUser.SetInfo ' Salvar
Call SetUserCannotChangePassword( DomainServer, rsSQL.Fields(RA).Value, "", "", True )
ouUser = "LDAP://"& DomainServer & "/" & "CN=" & rsSQL.Fields(RA).Value & ",OU="& ouCurso & "," & strOU
oGrupo.Add ouUser
Call LogWrite( Err, fLog, "LDAP - Usuário '"& rsSQL.Fields(RA).Value &"' do aluno(a) '"& rsSQL.Fields(Aluno).Value &"' foi criado e a senha alterada para '"& strPass &"'.", "Criar usuário: " & rsSQL.Fields(RA).Value )
Set oUser = Nothing
Set oCurso = Nothing
Set oGrupo = Nothing
Else
' ALTERA A SENHA DO USUÁRIO NO AD
Set oUser = GetObject(rsAD.Fields("ADsPath"))
oUser.SetPassword(strPass) ' Senha
oUser.Put "displayName", rsSQL.Fields(Aluno).Value ' Display Name
oUser.Put "Description", rsSQL.Fields(Aluno).Value ' Display Name
oUser.SetInfo
Call LogWrite( Err, fLog, "LDAP SetInfo - '"& rsAD.Fields("ADsPath") &"' Senha alterada para '"& strPass &"'.", "Alterar senha do usuário: " & rsAD.Fields("samAccountName") )
Set oUser = Nothing
End If
rsAD.Close
' PRÓXIMO REGISTRO NO SQL
rsSQL.MoveNext
Wend
rsSQL.Close
oConn.Close
' LOG DO FIM DO PROCESSO
Call LogWrite( Err, fLog, "Fim do processo.", "" )
' FECHA ARQUIVO DE LOG
fLog.Close
' DESTRÓI OBJETOS
Set rsSQL = Nothing
Set rsAD = Nothing
Set rsTmp = Nothing
Set oCmd = Nothing
Set oConn = Nothing
Set oDomain = Nothing
Set fso = Nothing
Set fLog = Nothing
Dúvidas, críticas ou sugestões, envie seu comentário.
Abraços e até o próximo post.
Postado por
Menezes
às
14:36
0
comentários
Marcadores: Active Director, VBScript