Controle automático usando acesso remoto ao registro do Windows

O suporte para a operação correta e correta de computadores e software de usuários comuns é uma rotina de funcionários e / ou administradores de suporte técnico. Se a empresa é pequena e todo mundo está em uma ou duas salas, geralmente é fácil ir sozinho e resolver o problema ou verificar o que você precisa.


Mas e se a empresa for grande e o usuário estiver em um site diferente / em outra cidade / país?


imagem


Uma das ferramentas clássicas para esse trabalho é uma conexão remota (usando RDP, software como TeamViewer / Skype com uma demonstração na área de trabalho e assim por diante). No entanto, não é sem falhas fundamentais:


  • em qualquer caso, o usuário final será distraído de seu trabalho (em alguns casos, sem sequer ver sua área de trabalho)
  • essas ferramentas nem sempre funcionam se houver erros no computador remoto
  • a instalação de software de terceiros (incluindo o proprietário, no caso do TeamViewer) está longe de ser sempre bem-vinda pela política da empresa
  • o método praticamente não é automatizado

Finalmente - essa abordagem é usada quando o incidente já ocorreu (é difícil imaginar que o administrador, de tempos em tempos, “preventivamente” se conecte a cada usuário). É por isso que o mecanismo de controle (monitoramento) de computadores remotos é importante.


Uma solução possível é usar o acesso remoto ao registro do Windows. Ele armazena dados na forma de um banco de dados hierárquico, o que permite que você os receba e armazene rapidamente. Eles usam o registro para armazenar suas próprias configurações e parâmetros de SO e serviços incorporados, bem como a maioria dos programas de terceiros. Portanto, o conteúdo do registro afeta amplamente a operação do sistema.


Com base nisso, o registro pode muito bem ser usado como um “indicador” para monitoramento (você pode detectar um erro se estiver associado a parâmetros incorretos no registro ou simular uma situação problemática).


Outra possibilidade que esta solução oferece é a possibilidade de controle administrativo dos usuários (por exemplo, a leitura remota permite que você veja os fatos da instalação de programas indesejados e faça alterações nas configurações) - não se esqueça da influência do "fator humano" no sistema. Na prática, isso foi útil na estrutura do projeto SkypeTime , onde era necessário acompanhar a correção das configurações no Skype for Business.


imagem


Mas o registro contém milhares de entradas; é extremamente difícil controlar todas elas. Portanto, antes de tudo, é necessário limitar o assunto do controle - para determinar quais parâmetros são de nosso interesse e descobrir em quais ramificações específicas do registro estão localizados os valores correspondentes. Como regra, o último não é difícil de encontrar na documentação / Internet ou determinar independentemente com base nos nomes das chaves.


Tendo decidido sobre o assunto do controle, você pode prosseguir para a configuração direta do acesso remoto. Para fazer isso, você precisa ativar o serviço Chamada de procedimento remoto em computadores remotos e configurar o firewall conforme necessário, o que é feito convenientemente usando diretivas de grupo. Considerando os requisitos de segurança, o acesso requer os direitos de um administrador de domínio ou administrador local em cada um dos dispositivos.


Configurar acesso remoto

Para ativar o próprio serviço, na seção Configuração do computador> Preferências> Configurações do painel de controle> Serviços, defina os parâmetros para o serviço RpcSs, como em uma captura de tela


imagem


Resta adicionar as exceções de firewall apropriadas. Na mesma política, em Configuração do Computador> Políticas> Configurações do Windows> Configurações de Segurança> Firewall do Windows com Segurança Avançada> Regras de Entrada, crie uma Nova Regra:
Tipo de regra - personalizado


imagem


Especifique o caminho do programa -% SystemRoot% \ system32 \ svchost.exe
Nas configurações adicionais na seção Serviços, defina Aplicar ao serviço com o seguinte nome abreviado - Winmgmt


imagem


Nas páginas seguintes, especificamos o TCP sem especificar portas específicas e para todos os endereços


imagem


imagem


e permita a conexão ( Permitir a conexão ) para o perfil de domínio


imagem


imagem


No entanto, controlar manualmente o registro de dezenas e centenas de computadores "manualmente" (mesmo que com algumas entradas) é uma tarefa ingrata e sem sentido. Felizmente, esse processo é bastante simples de automatizar usando scripts. Por exemplo, o script do PowerShell a seguir permite descobrir qual usuário alterou os parâmetros AwayThreshold e IdleThreshold (hora de mudar para o estado "Out of Place" e "Inactive") para o Skype for Business.


Código de script
Param ( [alias("c")] [string]$FromFileComputers, [alias("r")] [string]$OutputRPCErrorsFile, [alias("u")] [string]$FromFileUsers, [alias("o")] [string]$OutputFile="output.csv", [alias("a")] [int]$MinAway, [alias("i")] [int]$MinIdle ) $RPCErrorsArray = @() $result = @() $HKU = 2147483651 $RegistryForCheckArray = "SOFTWARE\Microsoft\Office\13.0\Lync","SOFTWARE\Microsoft\Office\14.0\Lync","SOFTWARE\Microsoft\Office\15.0\Lync","SOFTWARE\Microsoft\Office\16.0\Lync","SOFTWARE\Microsoft\Communicator" $CurrentComputerNumber = 0; if(![string]::IsNullOrEmpty($FromFileUsers)) { $Users = Get-Content $FromFileUsers; } if(![string]::IsNullOrEmpty($FromFileComputers)) { $Comps = Get-Content $FromFileComputers; } else { $date = (get-date).AddMonths(-1) $Comps = Get-ADComputer -filter { lastlogontimestamp -ge $date } | select name | ForEach-Object {$_.name} #$Comps = "NB_CY" } $ServersCount = ($Comps).Count; Foreach ($Comp in $Comps) { $CurrentComputerNumber++ try { Write-Host "Checking: $Comp [$CurrentComputerNumber/$ServersCount]"; $profiles = Get-WmiObject Win32_UserProfile -filter "Loaded=$true and special=$false" -ComputerName $Comp -ErrorAction Stop $reg = [wmiclass]"\\$Comp\root\default:stdregprov" Foreach ($profile in $profiles) { $username = Split-Path $profile.LocalPath -Leaf if(![string]::IsNullOrEmpty($FromFileUsers)) { if(!$Users.Contains($username)) { continue; } } Foreach( $registry in $RegistryForCheckArray) { $hkey = "$($profile.sid)\$registry" #Write-Host "KEY: $hkey" $away = $reg.GetDWORDValue($hku,$hkey,"AwayThreshold").uValue $idle = $reg.GetDWORDValue($hku,$hkey,"IdleThreshold").uValue $sip = $reg.GetStringValue($hku,$hkey,"ServerSipUri").sValue if([string]::IsNullOrEmpty($away) -and [string]::IsNullOrEmpty($idle)) { continue; } if(($MinAway -gt 0 -and $away -lt $MinAway) -or ($MinIdle -gt 0 -and $idle -lt $MinIdle)) { continue; } $result += New-Object PsObject -Property @{ "PC" = $Comp "Username" = $username "SIP" = $sip "SFB_Away" = $away "SFB_Idle" = $idle } } } } catch { if ($_.Exception.GetType().Name -eq "COMException") { $RPCErrorsArray += $Comp; } Write-Host "Error: ($_.Exception.GetType().Name)"; $_.Exception } } $result | Export-csv -Path $OutputFile $result | Format-Table -Property PC,Username,SIP,SFB_Away,SFB_Idle -AutoSize Write-Host "Saved to: $OutputFile" if(![string]::IsNullOrEmpty($OutputRPCErrorsFile)) { $RPCErrorsArray | out-file $OutputRPCErrorsFile Write-Host "RPC errors saved to: $OutputRPCErrorsFile" } 

Para maior conveniência, o script pode ser executado com os parâmetros:

-c caminho para o arquivo com uma lista de computadores com nome de host para verificar, se não for especificado - obtenha computadores do AD com uma atividade de 30 dias.
-r caminho para o arquivo no qual o nome do host dos computadores com erro de RPC será gravado.
-u caminho para o arquivo com uma lista de usuários (logon), se não especificado, verifica todos.
-o caminho para o arquivo no qual o resultado do script será executado, o padrão é output.csv.
-um valor mínimo para o parâmetro AwayThreshold, os registros com um valor menor que o valor especificado não obterão o resultado da execução do script.
-i o valor mínimo para o parâmetro IdleThreshold, registros com um valor menor que o valor especificado não obterão o resultado do script.

Além disso, o script pode ser automatizado adicionando ao Agendador de tarefas do Windows (Agendador de tarefas) ou através da funcionalidade Trabalho agendado no PowerShell.

Source: https://habr.com/ru/post/pt426873/


All Articles