La prise en charge du fonctionnement correct et correct des ordinateurs et des logiciels des utilisateurs ordinaires est une routine des employés et / ou administrateurs du support technique. Si l'entreprise est petite et que tout le monde est dans une ou deux pièces, il est généralement facile d'aller vous-même et de résoudre le problème ou de vérifier ce dont vous avez besoin.
Mais que se passe-t-il si l'entreprise est grande et que l'utilisateur se trouve sur un autre site / dans une autre ville / pays?

L'un des outils classiques pour un tel travail est une connexion à distance (en utilisant RDP, un logiciel comme TeamViewer / Skype avec une démo de bureau, etc.). Mais ce n'est pas sans défauts fondamentaux:
- dans tous les cas, l'utilisateur final sera distrait de son travail (dans certains cas, sans même voir son bureau)
- ces outils ne fonctionneront pas toujours s'il y a des erreurs sur l'ordinateur distant
- l'installation de logiciels tiers (y compris propriétaires, dans le cas de TeamViewer) est loin d'être toujours bien accueillie par la politique de l'entreprise
- la méthode n'est pratiquement pas automatisée
Enfin - cette approche est utilisée lorsque l'incident a déjà eu lieu (il est difficile d'imaginer que l'administrateur se connecte de temps en temps «préventivement» à chaque utilisateur). C'est pourquoi le mécanisme de contrôle (surveillance) des ordinateurs distants est important.
Une solution possible consiste à utiliser l'accès à distance au registre Windows. Il stocke les données sous la forme d'une base de données hiérarchique, ce qui vous permet de les recevoir rapidement et de les stocker de manière compacte. Ils utilisent le registre pour stocker leurs propres paramètres et paramètres, à la fois le système d'exploitation et les services intégrés, ainsi que la plupart des programmes tiers. Par conséquent, le contenu du registre affecte à bien des égards le fonctionnement du système.
Sur cette base, le registre peut très bien être utilisé comme un «indicateur» de surveillance (vous pouvez détecter une erreur si elle est associée à des paramètres incorrects dans le registre ou simuler une situation problématique).
Une autre possibilité que cette solution offre est la possibilité d'un contrôle administratif des utilisateurs (par exemple, la lecture à distance vous permet de voir les faits d'installer des programmes indésirables et de modifier les paramètres) - n'oubliez pas l'influence du "facteur humain" sur le système. En pratique, cela était utile dans le cadre du projet SkypeTime , où il était nécessaire de suivre la correction des paramètres dans Skype Entreprise.

Mais le registre contient des milliers d'entrées, il est extrêmement difficile de les contrôler toutes. Par conséquent, tout d'abord, il est nécessaire de limiter le sujet du contrôle - pour déterminer quels paramètres nous intéressent et pour savoir dans quelles branches de registre particulières se trouvent les valeurs correspondantes. En règle générale, ce dernier n'est pas difficile à trouver dans la documentation / Internet, ou à déterminer indépendamment en fonction des noms des clés.
Après avoir décidé du sujet du contrôle, vous pouvez procéder à la configuration directe de l'accès à distance. Pour ce faire, vous devez activer le service d'appel de procédure distante sur des ordinateurs distants et configurer le pare-feu si nécessaire, ce qui se fait facilement à l'aide de stratégies de groupe. Compte tenu des exigences de sécurité, l'accès nécessite les droits d'un administrateur de domaine ou d'un administrateur local sur chacun des appareils.
Configurer l'accès à distancePour activer le service lui-même, dans la section Configuration ordinateur> Préférences> Paramètres du panneau de configuration> Services, définissez les paramètres du service RpcSs, comme dans une capture d'écran

Il reste à ajouter les exceptions de pare-feu appropriées. Dans la même stratégie, sous Configuration ordinateur> Stratégies> Paramètres Windows> Paramètres de sécurité> Pare-feu Windows avec sécurité avancée> Règles entrantes, créez une nouvelle règle:
Type de règle - Personnalisé

Spécifiez le chemin du programme -% SystemRoot% \ system32 \ svchost.exe
Dans les paramètres supplémentaires de la section Services, définissez Appliquer au service avec le nom abrégé suivant - Winmgmt

Sur les pages suivantes, nous spécifions TCP sans spécifier de ports spécifiques et pour toutes les adresses


et autoriser la connexion ( Autoriser la connexion ) pour le profil de domaine


Cependant, contrôler manuellement le registre de dizaines et de centaines d'ordinateurs «manuellement» (même avec quelques entrées) est une tâche ingrate et insensée. Heureusement, ce processus est assez simple à automatiser à l'aide de scripts. Par exemple, le script PowerShell suivant vous permet de savoir quel utilisateur a modifié les paramètres AwayThreshold et IdleThreshold (le temps de passer à l'état «Out of Place» et «Inactive») pour Skype for Business.
Code de scriptParam ( [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" }
Pour plus de commodité, le script peut être exécuté avec les paramètres:
-c chemin d'accès au fichier avec une liste d'ordinateurs de nom d'hôte à vérifier, s'il n'est pas spécifié - récupérez les ordinateurs d'AD avec une activité de 30 jours.
-r chemin d'accès au fichier dans lequel le nom d'hôte des ordinateurs ayant une erreur RPC sera écrit.
-u chemin vers le fichier avec une liste d'utilisateurs (connexion), s'il n'est pas spécifié, vérifie tout.
-o chemin vers le fichier dans lequel le résultat du script sera exécuté, la valeur par défaut est output.csv.
-une valeur minimale pour le paramètre AwayThreshold, les enregistrements avec une valeur inférieure à la valeur spécifiée n'obtiendront pas le résultat de l'exécution du script.
-i la valeur minimale pour le paramètre IdleThreshold, les enregistrements avec une valeur inférieure à la valeur spécifiée n'obtiendront pas le résultat du script.
En outre, le script peut être automatisé en l'ajoutant au Planificateur de tâches Windows (Planificateur de tâches) ou via la fonctionnalité Sheduled Job dans PowerShell.