terça-feira, 31 de julho de 2012

VB.NET - OBTER USUÁRIOS DO ACTIVE DIRECTORY

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.


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

Nenhum comentário:

UM APLICATIVO PARA LEITURA DEVOCIONAL ANUAL DA BIBLIA EM ANDROID

Olá, pessoal!  Este novo projeto foi criado em Visual Studio 2019 em C#.Net com o Xamarin. Já está disponível no Google Play para vocês baix...