Uma dessas funções que você precisa vez ou outra para obter os usuários de uma rede e salvá-los em uma tabela qualquer, seja no SQL Server, seja no MYSQL ou mesmo no Microsoft Access.
Leve-se em conta o comando dsquery: O dsquery por default não se encontra disponível dentro do Windos XP porque se trata de uma aplicação para o Windows 2000.
Para utilizar o dsquery na sua estação, basta instalar o adminpak com o qual você poderá realizar as consultas.
Link para download ou no CD do Windows: http://www.microsoft.com/downloads/details.aspx?FamilyID=c16ae515-c8f4-47ef-a1e4-a8dcbacff8e3&displaylang=en
Vamos ver uma simples função que criei com esta finalidade.
A função em si executa um arquivo bath que simplesmente contêm o comando que faz a geração do dsquery para um arquivo-texto qualquer usado o comando dsget:
Comando no arquivo-bath:
dsquery user -limit
2500 "OU=MAO,OU=Regio1,DC=CPP,DC=CPP,DC=gov" |dsget user
-display -samid -email -office > C:\Temp\users.txt
A função primeiramente deleta o arquivo-texto caso ele exista. Em seguida, gera um novo arquivo-texto com os dados dos usuários usando o arquivo cmd criado e que simplesmente contêm o comando informado acima. O detalhe é o tempo de espera para a execução do arquivo bath:
listFiles.WaitForExit(90000)
Esta linha aguarda cerca de um minuto e meio até que a execução do arquivo bath seja finalizada e o arquivo-texto seja totalmente gerado. Isso é necessário para que a aplicação espere a finalização da geração do arquivo-texto. Você pode alterar esse tempo para que atenda às suas necessidades. No meu caso, verifiquei que o tempo de espera ideal girava em torno de um minuto e meio.
Continuando, a função abre este arquivo-texto gerado e faz sua leitura inserindo em uma tabela todos aqueles que não existirem dentro da mesma.
Private Sub AtualizarUsuarios()
Dim sPercentual As Double = 0
Application.DoEvents()
'Deletar o arquivo existente anteriormente
If IO.File.Exists("c:\Intel\users3.txt") Then
File.Delete("C:\Intel\users3.txt")
End If
Dim psi As New _
System.Diagnostics.ProcessStartInfo("C:\Intel\Gera_user.cmd")
psi.RedirectStandardOutput = True
psi.WindowStyle = ProcessWindowStyle.Hidden
psi.UseShellExecute = False
Dim listFiles As System.Diagnostics.Process
listFiles = System.Diagnostics.Process.Start(psi)
Dim myOutput As System.IO.StreamReader _
= listFiles.StandardOutput
listFiles.WaitForExit(90000)
If listFiles.HasExited Then
'abrir o arquivo-texto gerado na pasta c:\Intel
Dim oLeitura As System.IO.StreamReader
oLeitura = File.OpenText("c:\Intel\users3.txt")
Dim fluxoTexto As IO.StreamReader
Dim linhaTexto As String
Dim sContaLinhas As Integer = 0
If IO.File.Exists("c:\Intel\users3.txt") Then
fluxoTexto = New IO.StreamReader("c:\Intel\users3.txt")
linhaTexto = fluxoTexto.ReadLine
sContaLinhas = sContaLinhas + 1
While linhaTexto <> Nothing
linhaTexto = fluxoTexto.ReadLine
sContaLinhas = sContaLinhas + 1
End While
fluxoTexto.Close()
Dim sTotal As Integer = sContaLinhas
ProgressBar1.Maximum = sContaLinhas
ProgressBar1.Value = 0
ProgressBar1.Visible = True
LbPercent.Visible = True
sContaLinhas = 1
fluxoTexto = New IO.StreamReader("c:\Intel\users.txt")
linhaTexto = fluxoTexto.ReadLine
While linhaTexto <> Nothing
If sContaLinhas > 1 Then
Dim sUsuario As String = Trim(Mid(linhaTexto, 1, 15))
Dim sNome As String = Trim(Mid(linhaTexto, 15, 40))
Dim eEmail As String = Trim(Mid(linhaTexto, 124, 40))
' Comparar com o que está na tabela
If sUsuario <> "" Then
Dim sPesq As String = "Jabil\" + sUsuario
sSQL = "SELECT * FROM ADUsers WHERE Usu_Login = '" & sPesq & "'"
Dim myConnection2 As OleDbConnection
Dim myCommand2 As OleDbCommand
Dim ds As OleDbDataReader
myConnection2 = New OleDbConnection(connString)
myConnection2.Open()
myCommand2 = New OleDbCommand(sSQL, myConnection2)
ds = myCommand2.ExecuteReader()
If ds.Read = False Then
'Inserir o usuário na tabela
'INSERIR NA GRID
sSQL = "INSERT INTO ADUsers (Usu_Login,Usu_Nome,Usu_Email) VALUES ('" & sPesq & "', '" &
sNome & "','" & eEmail & "')"
myCommand2 = New OleDbCommand(sSQL, myConnection2)
Ra = myCommand2.ExecuteNonQuery()
End If
ds.Close()
End If
'se não existir a linha na tabela, insere
End If
'ler o conteúdo do arquivo-texto
linhaTexto = fluxoTexto.ReadLine
sContaLinhas = sContaLinhas + 1
ProgressBar1.Value = sContaLinhas
sPercentual = 100 * sContaLinhas / sTotal
LbPercent.Text = CStr(FormatNumber(sPercentual, 2)) + " %"
LbMessagem.Text = "Linhas processadas: " + CStr(sContaLinhas)
Application.DoEvents()
If sContaLinhas = (sTotal - 1) Then
GoTo sSaida
End If
End While
sSaida:
fluxoTexto.Close()
Else
LbMessagem.Text = "Arquivo não existe"
'MessageBox.Show("Arquivo não existe")
End If
'Fechar o arquivo-texto
oLeitura.Close()
Application.DoEvents()
LbMessagem.Text = "Atualização efetuada com sucesso!!! Linhas Processadas no Total: " + CStr(sContaLinhas)
PreencherGrid("select * from ADUsers")
End If
listFiles.Close()
End Sub
Sucesso a todos e aproveitem o quitute!!
By
Leonardo Metelys