none
Script para relatório de boot dos PCS do domínio RRS feed

  • Pergunta

  • Olá pessoal.

    Recentemente, criei um script que me passa o último boot das máquinas do domínio e me envia por email todos os dias.

    Agora eu gostaria de inserir no relatório a OU em que a máquina está alocada.

    tentei apenas usar o atributo distinguishedname no meu script porém ele dá problema com a interpretação do script Get-WmiObject-Wrapper-Async do powershelladmin.

    pensei em apenas colocar a OU dentro do corpo do email em cada linha mas ainda não tive nenhuma ideia.

    estou anexando o script caso vocês desejam também utilizá-lo ou aprimorá-lo.

    cd t:\\\\\boot
    
    import-module activedirectory 
    
     #etapa onde é criado o arquivo com o nome das máquinas que estão dentro da OU alvo. a variável comps recebe o nome dos pcs
            $comps = Get-ADComputer -filter * -SearchBase "ou=domain computers,dc=,dc=" | % distinguishednameName 
            .\Get-WmiObject-Wrapper-Async.ps1 -computer $comps -OutputFile .\boottime.xml `
            -MultiClassProperty 'win32_operatingsystem:LastBootUpTime' -invokeasync 20 -Clobber
            $WmiData.Keys.Count
             
    .\Gwmi-Wrapper-Report.ps1 .\boottime.xml -Property LastBootUpTime -AsCsv | Set-Content -Encoding UTF8 boottime.csv -Force
    
    $seed = Import-Csv .\boottime.csv | Select ComputerName, @{n='Lastboot'
        e={[Management.ManagementDateTimeConverter]::ToDateTime($_.Value).ToString("dd/MM/yyyy") }} | Sort 'Lastboot';
        $builder = "`n"
        $body ='Abaixo, o último boot realizado das máquinas registradas no domínio. ' + "`n`n"
        foreach ($line in $seed) {
        $body = $body + 'PC = '+$line.ComputerName + ' ' + $line.'Lastboot'
        $body = $body + $builder
        }
    
        Write-Host ($body)
    function sendMail{
    
        $From = "@"
        $To = @("Sidney <@>, Wilson <@>")
        $SMTPServer = "smtp.com"
        $SMTPPort = "587"
        $Username = "helpdesk@domain.net"
        $Password = ""
        $subject = "Boot Report"
          
        #| Export-Csv -enc UTF8 boottime-clean_date.csv;
    
        $smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);
    
        $smtp.EnableSSL = $true
        $smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
        $smtp.Send($From, $To, $subject, $body);
      }
    
    #Calling function
    sendMail
    <#
        Write-Host "Press any key to continue ..."
    
        $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
    #>


    Sidney Moreira anl. de Redes II

    terça-feira, 31 de outubro de 2017 14:05

Respostas

  • Sidney,

    Qual a dificuldade está tendo? Agora os resultados já estão aí, somente configura para enviar o email.

    Eu recomendo apenas tirar os espaços do Computer Name e Boot Time. Segue exemplo que pode utilizar:

    $FinalReport = @{ComputerName="XXX"; OU="domínio,OU="computers"; BootTime="10/23/2017 10:27:06"}
    $FinalReport | ForEach-Object {
        Write-Host $_.ComputerName
        Write-Host $_.OU
        Write-Host $_.BootTime
    }

    No lugar dos Write-Host ai do teste coloca a sua função de Send-MailMessage.


    Se foi útil, classifique. Rafael Damásio Microsoft Consulting



    • Marcado como Resposta Sidney Moreira quarta-feira, 8 de novembro de 2017 18:38
    • Editado Rafael Damásio quarta-feira, 8 de novembro de 2017 19:28 Alterado nomes dominio usuario
    quarta-feira, 8 de novembro de 2017 18:34

Todas as Respostas

  • fala pessoal.

    decidi criar o script do zero e utilizar apenas o modulo get-computerboottime.

    #
    # script-boot.ps1
    #
    
    
     Get-ADComputer -filter * -SearchBase "ou=homolog-users-pcs, dc=,dc="| 
     % name | 
     Out-File c:\pcs.txt
    
     $body = Get-ComputerBootTime -ComputerNameFile c:\pcs.txt -Credential domain\adm 
     ConvertTo-csv -InputObject $body
    
    
    
    
    function sendMail{
    
        $From = "@"
        $To = @("Sidney <@>")
        $SMTPServer = ""
        $SMTPPort = "587"
        $Username = "@"
        $Password = ""
        $subject = "Boot Report"
          
        $smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort);
    
        $smtp.EnableSSL = $true
        $smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password);
        $smtp.Send($From, $To, $subject, $body);
      }
    
    #Calling function
    sendMail

    porém agora estou com problemas pra injetar isso corretamente no e-mail, quando uso o convertto-html ele traz apenas o seguinte:

    Microsoft.PowerShell.Commands.Internal.Format.FormatStartData Microsoft.PowerShell.Commands.Internal.Format.GroupStartData Microsoft.PowerShell.Commands.Internal.Format.FormatEntryData Microsoft.PowerShell.Commands.Internal.Format.GroupEndData Microsoft.PowerShell.Commands.Internal.Format.FormatEndData


    Sidney Moreira anl. de Redes II

    quarta-feira, 1 de novembro de 2017 17:37
  • Ok, usando o cmdlet send-mailmessage consegui contornar o problema.

    falta agora apenas inserir a OU das máquinas nesse report :D


    Sidney Moreira anl. de Redes II

    quarta-feira, 1 de novembro de 2017 18:25
  • Sidney,

    Utilize o seguinte comando para retornar a OU:

    (Get-ADComputer pc01 -Properties CanonicalName).CanonicalName

    Você já pode utilizar:

    Send-MailMessage -Body ((Get-ADComputer pc01 -Properties CanonicalName).CanonicalName |
    Out-String-SmtpServer domínio.com -From origem@dominio.com -Subject 'OU Location' -To destino@dominio.com


    Se foi útil, classifique. Rafael Damásio Microsoft Consulting

    quarta-feira, 1 de novembro de 2017 19:11
  • Sidney,

    Utilize o seguinte comando para retornar a OU:

    (Get-ADComputer pc01 -Properties CanonicalName).CanonicalName

    Você já pode utilizar:

    Send-MailMessage -Body ((Get-ADComputer pc01 -Properties CanonicalName).CanonicalName |
    Out-String-SmtpServer domínio.com -From origem@dominio.com -Subject 'OU Location' -To destino@dominio.com


    Se foi útil, classifique. Rafael Damásio Microsoft Consulting

    Rafael, obrigado por responder!

    Então, mas dessa forma eu perco o resultado do meu get-ComputerBootTime

    mas acho que uma abordagem próxima dessa pode rolar.

    vou tentar aproveitar essa linha e posto aqui as novidades.


    Sidney Moreira anl. de Redes II

    quarta-feira, 1 de novembro de 2017 19:15
  • Avançando, decidi não usar o modulo  do Victor (get-computerboottime) e estudei como ele é feito.

    cheguei ao seguinte resultado:

     foreach ($Computer in $ComputerList){
    		 If (Test-Connection -ComputerName $Computer -ErrorAction SilentlyContinue -Quiet -Count 2  )
    			{
    			$ComputerInfo = (Get-WmiObject Win32_OperatingSystem -ComputerName $Computer -Credential $Cred).LastBootUpTime
    			#converte data pra legível
    			$BootTime = [System.Management.ManagementDateTimeConverter]::ToDateTime($ComputerInfo)
    			$Canonical = (Get-ADComputer $Computer -Properties CanonicalName).CanonicalName
    			$FinalReport = New-Object PSObject -Property @{            
    			 'Computer Name'    = $Computer                  
    			 'Boot Time'    =  $BootTime
    			 'OU'        =  $Canonical
    				}
    			} #end-if test
    		 Else
    		 {
    			$offlines =	"$Computer desligado" 
    		 }
    	 }

    porém, o meu retorno na variável FinalReport é apenas:

    @{Computer Name=29658; OU=TI/29658; Boot Time=10/23/2017 10:27:06}

    alguma luz?


    Sidney Moreira anl. de Redes II


    quarta-feira, 8 de novembro de 2017 17:01
  • Sidney,

    Qual a dificuldade está tendo? Agora os resultados já estão aí, somente configura para enviar o email.

    Eu recomendo apenas tirar os espaços do Computer Name e Boot Time. Segue exemplo que pode utilizar:

    $FinalReport = @{ComputerName="XXX"; OU="domínio,OU="computers"; BootTime="10/23/2017 10:27:06"}
    $FinalReport | ForEach-Object {
        Write-Host $_.ComputerName
        Write-Host $_.OU
        Write-Host $_.BootTime
    }

    No lugar dos Write-Host ai do teste coloca a sua função de Send-MailMessage.


    Se foi útil, classifique. Rafael Damásio Microsoft Consulting



    • Marcado como Resposta Sidney Moreira quarta-feira, 8 de novembro de 2017 18:38
    • Editado Rafael Damásio quarta-feira, 8 de novembro de 2017 19:28 Alterado nomes dominio usuario
    quarta-feira, 8 de novembro de 2017 18:34
  • acabei fazendo algo parecido que funcionou, realmente, os resultados já estavam armazenados, era só formatá-los pra enviar na função;

    $finalreport = foreach ($computer in $ComputerList){



    Sidney Moreira anl. de Redes II

    quarta-feira, 8 de novembro de 2017 18:38