对普通用户的计算机和软件的正确,正确操作的支持是技术支持员工和/或管理员的日常工作。 如果公司规模很小,并且每个人都在一两个房间里,通常很容易动手解决问题或检查您的需求。
但是,如果公司规模较大且用户位于另一个城市/国家/地区的不同站点怎么办?

进行此类工作的经典工具之一是远程连接(使用RDP,TeamViewer / Skype之类的软件以及桌面演示等)。 但是,它并非没有基本缺陷:
- 在任何情况下,最终用户都将分散他的工作(在某些情况下,甚至根本看不到他的桌面)
- 如果远程计算机上有错误,这些工具将无法始终运行
- 公司政策绝不总是欢迎安装第三方软件(对于TeamViewer,包括专有软件)
- 该方法实际上不是自动化的
最后-在事件已经发生时使用这种方法(很难想象管理员会不时地“预防性地”连接到每个用户)。 这就是为什么远程计算机的控制(监视)机制很重要的原因。
一种可能的解决方案是使用对Windows注册表的远程访问。 它以分层数据库的形式存储数据,使您可以快速接收并紧凑地存储数据。 他们使用注册表来存储自己的设置和参数,包括操作系统和嵌入式服务以及大多数第三方程序。 因此,注册表的内容在许多方面都会影响系统的运行。
基于此,注册表很可能用作监视的“指示器”(如果错误与注册表中的错误参数相关联或模拟有问题的情况,则可以检测到该错误)。
该解决方案提供的另一种可能性是对用户进行管理控制的可能性(例如,远程阅读使您可以看到安装不需要的程序并更改设置的事实)-不要忘记“人为因素”对系统的影响。 实际上,这在SkypeTime项目的框架中很有用,在该框架中必须跟踪Skype for Business中的设置更正。

但是注册表包含成千上万的条目;控制所有这些条目非常困难。 因此,首先,必须限制控制的主题-确定我们感兴趣的参数,并找出对应值位于哪个特定注册表分支中。 通常,后者不难在文档/ Internet中找到,或者根据密钥名称独立确定。
确定控制主题后,您可以直接配置远程访问。 为此,您需要在远程计算机上激活“远程过程调用”服务并根据需要配置防火墙,这可以使用组策略方便地完成。 考虑到安全性要求,访问需要每个设备上的域管理员或本地管理员的权限。
配置远程访问要激活服务本身,请在“计算机配置”>“首选项”>“控制面板设置”>“服务”部分中,设置RpcSs服务的参数,如屏幕快照所示。

仍然需要添加适当的防火墙例外。 在同一策略中,在“计算机配置”>“策略”>“ Windows设置”>“安全设置”>“具有高级安全性的Windows防火墙”>“入站规则”下,创建一个“新规则”:
规则类型-自定义

指定程序的路径-%SystemRoot%\ system32 \ svchost.exe
在“服务”部分的其他设置中,将“应用到服务”设置为以下简称-Winmgmt

在接下来的页面中,我们指定TCP而不指定特定端口和所有地址


并允许域配置文件的连接( Allow Connection )


但是,“手动”(即使只有很少的条目)手动控制数十台和数百台计算机的注册表是一项不愉快而又毫无意义的任务。 幸运的是,使用脚本自动执行此过程非常简单。 例如,以下PowerShell脚本可让您找出哪个用户更改了Skype for Business的AwayThreshold和IdleThreshold参数(切换到“ Out of Place”和“ Inactive”状态的时间)。
脚本代码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" }
为了更加方便,可以使用以下参数运行脚本:
-c指向要检查的主机名计算机列表的文件的路径(如果未指定)-从AD中获取具有30天活动的计算机。
-r指向将写入具有RPC错误的计算机的主机名的文件的路径。
-u带有用户列表的文件的路径(登录),如果未指定,则全部检查。
-o脚本结果将在其中执行的文件的路径,默认为output.csv。
-AwayThreshold参数的最小值,其值小于指定值的记录将不会获得脚本执行的结果。
-i IdleThreshold参数的最小值,其值小于指定值的记录将不会获得脚本的结果。
此外,可以通过将脚本添加到Windows任务计划程序(Task Scheduler)或通过PowerShell中的Sheduled Job功能来使脚本自动化。