Olá pessoal, tudo bem? Espero que sim!
Ontem durante o expediente, fui conversar com um amigo e colega de trabalho sobre um assunto do dia a dia e percebi que ele estava com dificuldades para concluir o desenvolvimento de um script em Powershell, para gerar relatórios de RSoP em computadores remotos. Tentei ajudá-lo, mas, devido ao fato de eu estar de saída, não conseguimos concluir o script da maneira que desejávamos em tempo hábil. Ele enfatizou para mim que este tipo de relatório é bastante útil para o Domain Admin, pois, demonstra a efetividade da aplicação de uma Política de Grupo (GPO). Ratifico a importância deste tipo de relatório e me comprometi a concluir a produção deste script e publicar aqui no blog.
Então, vamos lá?
O que é RSoP?
RSoP vem do termo Resultant Set of Policy (Conjunto Resultante de Política) e quando utilizado, retorna o conjunto de Políticas de Grupo (GPO) aplicadas pelo Domain Controller na estação de trabalho.
Conforme a definição da Microsoft:
O conjunto de diretivas resultante (RSoP) é um acréscimo à Diretiva de Grupo para auxiliar na implementação e solução de problemas de diretivas. O RSoP é um mecanismo de consulta que pesquisa políticas existentes e políticas planejadas e, em seguida, informa os resultados dessas consultas. (…) O RSoP reúne essas informações do banco de dados CIMOM (Common Information Management Object Model) (também conhecido como repositório de objetos compatível com CIM) por meio do Windows Management Instrumentation (WMI).
Como obter as informações de RSoP?
Existem duas formas de você realizar esta operação:
Primeira: Você pode executar o comando rsop.msc onde o comando será processado no Microsoft Management Console (MMC) em duas etapas.
Passo a passo: Iniciar > Executar > rsop.msc
Na primeira etapa, o MMC (Console de Gerenciamento da Microsoft) irá coletar as informações das diretivas aplicadas no computador, e em seguida irá exibir uma tela com todas as políticas aplicadas estruturadas por Configurações e Modelos Administrativos do Windows para Computador e Usuário.
Obs: Somente será retornada as políticas de computador se o usuário que executar o rsop.msc possuir privilégios de Administrador do computador.
Segunda: Você também pode retornar as Políticas de Grupo utilizando o executável gpresult.exe, nativo do sistema operacional, através do Prompt de Comando do MS-DOS para retornar as políticas aplicadas para o computador ou usuário.
Obs: A mesma regra de retorno para o comando rsop.msc vale para o gpresult.exe, para retornar as políticas de computador, o usuário que está executando o comando deverá possuir privilégios de Administrador.
Passo a passo: Iniciar > Executar > cmd.exe > gpresult.exe /r
Desta forma, o gpresult.exe irá processar as políticas aplicadas e exibir um resumo no Prompt de Comando. O gpresult.exe ainda te fornece parâmetros para realizar a operação em um computador remoto, retornar as políticas aplicadas a um usuário específico do computador, limitar o escopo das políticas que serão exibidas (computador ou usuário), ou gerar um relatório no formato XML ou HTML.
Para consultar todos os parâmetros disponíveis execute: gpresult.exe /? ou confira aqui.
Script para Gerar Relatório de RSoP em Computador Local ou Remoto
Conforme comentado no início do post, temos a possibilidade de automatizar a geração de relatórios de RSoP utilizando uma combinação de Powershell com gpresult.exe. É um grande desafio para qualquer Sysadmin gerenciar múltiplas Políticas de Grupo e validar se realmente estão sendo aplicadas corretamente, principalmente quando estamos lidando com uma topologia de rede de alta complexidade e larga escala. O script a seguir permite que você realize a operação do RSoP em um computador local, remoto, múltiplos computadores remotos ou mesmo através de um arquivo de texto com uma lista de computadores.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
<# raphaelgomes.net .SYNOPSIS Este script permite que você gere relatórios de resultado de aplicação de políticas de rede de computadores remotos e armazenar os relatórios no computador local. .AUTHOR Raphael Gomes - contato@raphaelgomes.net .FILENAME Get-GPRSoPReport.ps1 .PARAMETER CaminhoRelatorios Gerar relatório de RSoP em computador local Get-GPRSoPReport.ps1 -CaminhoRelatorios <caminho dos relatórios> .EXAMPLE Get-GPRSoPReport.ps1 -CaminhoRelatorios "C:\Users\RobotChicken" .PARAMETER Computadores Gerar relatório de RSoP em computador remoto gerando os relatórios no computador local Get-GPRSoPReport.ps1 -Computadores <hostname> -CaminhoRelatorios <caminho dos relatórios> .EXAMPLE Get-GPRSoPReport.ps1 -Computadores DISCOVERY -CaminhoRelatorios "C:\Users\RobotChicken" .PARAMETER Computadores, CaminhoRelatorios Gerar relatório de RSoP em mais de um computador remoto gerando os relatórios no computador local Get-GPRSoPReport.ps1 -Computadores <hostname1, hostname2, ...> -CaminhoRelatorios <caminho dos relatórios> .EXAMPLE Get-GPRSoPReport.ps1 -Computadores DISCOVERY1, DISCOVERY2, DISCOVERY3 -CaminhoRelatorios "C:\Users\RobotChicken" .PARAMETER CaminhoListaComputadores, CaminhoRelatorios Gerar relatório de RSoP em mais de um computador remoto através de um arquivo txt ou csv com uma lista de computadores gerando os relatórios no computador local Observação: Cada computador deverá estar uma linha do arquivo. Em caso do arquivo ser um CSV, este não deverá ter um cabeçalho, caso contrário, o cabeçalho será considerado um computador. Get-GPRSoPReport.ps1 -CaminhoListaComputadores <caminho do arquivo txt ou csv> -CaminhoRelatorios <caminho dos relatórios> .EXAMPLE Get-GPRSoPReport.ps1 -CaminhoListaComputadores "C:\Users\RobotChicken\ListaComputadores.txt" -CaminhoRelatorios "C:\Users\RobotChicken" .LINK Dúvidas? Comente em: https://raphaelgomes.net/ps-script-2-relatorio-de-rsop-em-computador-local-ou-remoto/ #> Param([array]$Computadores = $env:COMPUTERNAME, [string]$CaminhoRelatorios, [string]$CaminhoListaComputadores) # Se não for definido a lista de computadores, realizar a operação no computador local If($Computadores -eq $env:COMPUTERNAME -and !$CaminhoListaComputadores){ Write-Host -ForegroundColor Yellow "LOCAL: Gerando o RSoP do computador: $env:COMPUTERNAME" gpresult /scope computer /f /h C:\computer.html gpresult /scope user /f /h C:\user.html Write-Host -ForegroundColor Yellow "LOCAL: Importando as políticas de computador: $env:COMPUTERNAME" $htmlc = Get-Content C:\computer.html $htmlu = Get-Content C:\user.html # Constrói caminho de armazenamento dos relatórios $relatoriocomputadores = $CaminhoRelatorios + "\$env:COMPUTERNAME-computer.html" $relatoriousuarios = $CaminhoRelatorios + "\$env:COMPUTERNAME-user.html" # Exporta o relatório para o caminho de armazenamento defino $htmlc | Out-File $relatoriocomputadores -Force $htmlu | Out-File $relatoriousuarios -Force Write-Host -ForegroundColor Green "SUCESSO: O comando GPResult foi executado com sucesso no computador $env:COMPUTERNAME. Os relatórios estão disponíveis em: $CaminhoRelatorios" } # Do contrário, realiza a operação nos computadores remotos Else{ # Se for usado um arquivo de texto com uma lista de computadores, importa o conteúdo do arquivo para a variável Computadores If($CaminhoListaComputadores){ $Computadores = Get-Content $CaminhoListaComputadores } # Solicita credenciais de acesso para realizar a operação nos computadores remotos $Credencial = Get-Credential # Inicia loop para realizar as operações em cada computador remoto $Computadores | ForEach-Object{ Write-Host -ForegroundColor Yellow "SESSÃO: Abrindo sessão no computador: $_" # Abre uma sessão de Powershell no computador atual da lista $sessao = New-PSSession -ComputerName $_ -Credential $Credencial -ErrorAction SilentlyContinue -ErrorVariable VariavelDeErro # Se a sessão for aberta corretamente, executar as operações a seguir If($sessao){ Write-Host -ForegroundColor Yellow "SESSÃO: Gerando o RSoP do computador: $_" # Gera o relatório de políticas de rede no computador remoto Invoke-Command -Session $sessao -ScriptBlock { gpresult /scope computer /f /h C:\computer.html gpresult /scope user /f /h C:\user.html } # Importa conteúdo do relatório gerado para uma variável Write-Host -ForegroundColor Yellow "SESSÃO: Importando as políticas de computador: $_" $htmlc = Invoke-Command -Session $sessao -ScriptBlock { Get-Content C:\computer.html } Write-Host -ForegroundColor Yellow "SESSÃO: Importando as políticas de usuário: $_" $htmlu = Invoke-Command -Session $sessao -ScriptBlock { Get-Content C:\user.html } # Constrói caminho de armazenamento dos relatórios $relatoriocomputadores = $CaminhoRelatorios + "\$_-computer.html" $relatoriousuarios = $CaminhoRelatorios + "\$_-user.html" # Exporta o relatório para o caminho de armazenamento defino $htmlc | Out-File $relatoriocomputadores -Force $htmlu | Out-File $relatoriousuarios -Force # Exclui a sessão Powershell do computador atual $sessao | Remove-PSSession -ErrorAction SilentlyContinue Write-Host -ForegroundColor Green "SUCESSO: O comando GPResult foi executado com sucesso no computador $_. Os relatórios estão disponíveis em: $CaminhoRelatorios" } Else{ Write-Host -ForegroundColor Red "ERRO: Não foi possível abrir uma sessão de Powershell no computador: $_" Write-Host -ForegroundColor Red $VariavelDeErro } } } |
Pensando em um gerenciamento ágil, criei também a versão do script no formato de Função. Desta forma, você pode instalá-lo em seu computador para que passe a utilizar como um comando nativo do Powershell. Se você ainda não sabe instalar Funções dá uma olhadinha no Post #6.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
<# raphaelgomes.net .SYNOPSIS Esta função permite que você gere relatórios de resultado de aplicação de políticas de rede de computadores remotos e armazenar os relatórios no computador local. .AUTHOR Raphael Gomes - contato@raphaelgomes.net .FILENAME Get-GPRSoPReport.psm1 .USAGE Importar a função para o PowerShell Import-Module .\Get-GPRSoPReport.psm1 .PARAMETER CaminhoRelatorios Gerar relatório de RSoP em computador local Get-GPRSoPReport -CaminhoRelatorios <caminho dos relatórios> .EXAMPLE Get-GPRSoPReport -CaminhoRelatorios "C:\Users\RobotChicken" .PARAMETER Computadores Gerar relatório de RSoP em computador remoto gerando os relatórios no computador local Get-GPRSoPReport -Computadores <hostname> -CaminhoRelatorios <caminho dos relatórios> .EXAMPLE Get-GPRSoPReport -Computadores DISCOVERY -CaminhoRelatorios "C:\Users\RobotChicken" .PARAMETER Computadores, CaminhoRelatorios Gerar relatório de RSoP em mais de um computador remoto gerando os relatórios no computador local Get-GPRSoPReport -Computadores <hostname1, hostname2, ...> -CaminhoRelatorios <caminho dos relatórios> .EXAMPLE Get-GPRSoPReport -Computadores DISCOVERY1, DISCOVERY2, DISCOVERY3 -CaminhoRelatorios "C:\Users\RobotChicken" .PARAMETER CaminhoListaComputadores, CaminhoRelatorios Gerar relatório de RSoP em mais de um computador remoto através de um arquivo txt ou csv com uma lista de computadores gerando os relatórios no computador local Observação: Cada computador deverá estar uma linha do arquivo. Em caso do arquivo ser um CSV, este não deverá ter um cabeçalho, caso contrário, o cabeçalho será considerado um computador. Get-GPRSoPReport -CaminhoListaComputadores <caminho do arquivo txt ou csv> -CaminhoRelatorios <caminho dos relatórios> .EXAMPLE Get-GPRSoPReport -CaminhoListaComputadores "C:\Users\RobotChicken\ListaComputadores.txt" -CaminhoRelatorios "C:\Users\RobotChicken" .LINK Dúvidas? Comente em: https://raphaelgomes.net/ps-script-2-relatorio-de-rsop-em-computador-local-ou-remoto/ #> Function Get-GPRSoPReport{Param([array]$Computadores = $env:COMPUTERNAME, [string]$CaminhoRelatorios, [string]$CaminhoListaComputadores) # Se não for definido a lista de computadores, realizar a operação no computador local If($Computadores -eq $env:COMPUTERNAME -and !$CaminhoListaComputadores){ Write-Host -ForegroundColor Yellow "LOCAL: Gerando o RSoP do computador: $env:COMPUTERNAME" gpresult /scope computer /f /h C:\computer.html gpresult /scope user /f /h C:\user.html Write-Host -ForegroundColor Yellow "LOCAL: Importando as políticas de computador: $env:COMPUTERNAME" $htmlc = Get-Content C:\computer.html $htmlu = Get-Content C:\user.html # Constrói caminho de armazenamento dos relatórios $relatoriocomputadores = $CaminhoRelatorios + "\$env:COMPUTERNAME-computer.html" $relatoriousuarios = $CaminhoRelatorios + "\$env:COMPUTERNAME-user.html" # Exporta o relatório para o caminho de armazenamento defino $htmlc | Out-File $relatoriocomputadores -Force $htmlu | Out-File $relatoriousuarios -Force Write-Host -ForegroundColor Green "SUCESSO: O comando GPResult foi executado com sucesso no computador $env:COMPUTERNAME. Os relatórios estão disponíveis em: $CaminhoRelatorios" } # Do contrário, realiza a operação nos computadores remotos Else{ # Se for usado um arquivo de texto com uma lista de computadores, importa o conteúdo do arquivo para a variável Computadores If($CaminhoListaComputadores){ $Computadores = Get-Content $CaminhoListaComputadores } # Solicita credenciais de acesso para realizar a operação nos computadores remotos $Credencial = Get-Credential # Inicia loop para realizar as operações em cada computador remoto $Computadores | ForEach-Object{ Write-Host -ForegroundColor Yellow "SESSÃO: Abrindo sessão no computador: $_" # Abre uma sessão de Powershell no computador atual da lista $sessao = New-PSSession -ComputerName $_ -Credential $Credencial -ErrorAction SilentlyContinue -ErrorVariable VariavelDeErro # Se a sessão for aberta corretamente, executar as operações a seguir If($sessao){ Write-Host -ForegroundColor Yellow "SESSÃO: Gerando o RSoP do computador: $_" # Gera o relatório de políticas de rede no computador remoto Invoke-Command -Session $sessao -ScriptBlock { gpresult /scope computer /f /h C:\computer.html gpresult /scope user /f /h C:\user.html } # Importa conteúdo do relatório gerado para uma variável Write-Host -ForegroundColor Yellow "SESSÃO: Importando as políticas de computador: $_" $htmlc = Invoke-Command -Session $sessao -ScriptBlock { Get-Content C:\computer.html } Write-Host -ForegroundColor Yellow "SESSÃO: Importando as políticas de usuário: $_" $htmlu = Invoke-Command -Session $sessao -ScriptBlock { Get-Content C:\user.html } # Constrói caminho de armazenamento dos relatórios $relatoriocomputadores = $CaminhoRelatorios + "\$_-computer.html" $relatoriousuarios = $CaminhoRelatorios + "\$_-user.html" # Exporta o relatório para o caminho de armazenamento defino $htmlc | Out-File $relatoriocomputadores -Force $htmlu | Out-File $relatoriousuarios -Force # Exclui a sessão Powershell do computador atual $sessao | Remove-PSSession -ErrorAction SilentlyContinue Write-Host -ForegroundColor Green "SUCESSO: O comando GPResult foi executado com sucesso no computador $_. Os relatórios estão disponíveis em: $CaminhoRelatorios" } Else{ Write-Host -ForegroundColor Red "ERRO: Não foi possível abrir uma sessão de Powershell no computador: $_" Write-Host -ForegroundColor Red $VariavelDeErro } } } } |
É isso aí galera, por hoje é só. Até o próximo post!
Dúvidas, sugestões, críticas sobre o blog? Entre em contato aqui!
Gostou? Deixe seu comentário e não se esqueçam de curtir a página do Facebook na barra lateral!