使用Powershell远程验证注册表项

使用Powershell远程验证注册表项,powershell,remote-access,Powershell,Remote Access,我正在尝试编写一个脚本来检查我们网络上的哪些打印服务器用户正在连接。为此,我尝试检查“打印机\连接”下列出的注册表值。在我的本地计算机上,以下两种方法都有效: 一, 获取ChildItem HKCU:\Printers\Connections 输出: Hive: HKEY_CURRENT_USER\Printers\Connections Name Property ----- -

我正在尝试编写一个脚本来检查我们网络上的哪些打印服务器用户正在连接。为此,我尝试检查“打印机\连接”下列出的注册表值。在我的本地计算机上,以下两种方法都有效:

一,

获取ChildItem HKCU:\Printers\Connections

输出:

Hive: HKEY_CURRENT_USER\Printers\Connections

Name                              Property
-----                             --------
,,printServer,printerName         GuidPrinter        : {guid}
                                  Server             : \\printserver.domain
                                  Provider           : win32spl.dll
                                  LocalConnection    : 1
二,

该命令的输出为:

GuidPrinter     : {guid}
Server          : \\printServer.domain
Provider        : win32spl.dll
LocalConnection : 1
PSPath          : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Printers\Connections\,,printServerName,printerName
PSParentPath    : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Printers\Connections
PSChildName     : ,,printServerName, printerName
PSProvider      : Microsoft.PowerShell.Core\Registry    
就其本身而言,这两种实现都不容易应用于远程机器。我最近尝试从远程机器获取上述相同信息的尝试是:

$machine = 'computerName';
$reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('CurrentUser',$machine);
$regKey = $reg.OpenSubKey("Printers\Connections");
$regKey.GetValueName()

# I also tried the following which I didn't think
# would work, but I was grasping at straws:
# Get-ChildItem $regKey;
上面的代码不返回任何内容。它不会抛出错误,但regKey返回一个空字符串

是否有人知道获取我正在寻找的信息的替代解决方案,或者在上面的实现中发现了一些错误


谢谢。

这是因为您要查找的密钥是HKEY Current user,虽然根据登录用户的不同,每个用户的密钥都会发生正确的变化,但当您远程运行它时,加载的是您的配置单元,而不是用户。您必须让用户运行它,最简单的方法之一是将它放入机器的启动文件夹,然后它将运行并在他们不知道的情况下向您报告。

绝非完美,但我想到了这一点。在检查它的各个部分时,有两种不同的方法可以获得相同的结果,但这是我第一次能够获得实际结果的方法。功能能力不足,但我更想展示结果而不是手段

函数Get NetworkPrinters$computer{ 这是我能让用户出现的唯一一致的方式。win32_computersystem有一个用户名,但对我来说可能是空的UAC? $remoteUsers=Get WmiObject win32_进程-ComputerName$computer-Filter'Name=explorer.exe'-ErrorAction SilentlyContinue | ForEach对象{ $\u.GetOwner.User } 从active directory获取用户SID。我们需要这些来检查用户配置单元。 $users=$remoteUsers |获取ADUser |选择对象samaccountname、name、sid $users | ForEach对象{ 让用户在其他管道中使用 $user=$_ 包含映射的键 $keyPath=$$user.Sid\Printers\Connections 打开远程注册表项 $Reg=[Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey[Microsoft.Win32.RegistryHive]::用户,$computer 获取与打印机映射匹配的连接的键名称 $reg.OpenSubKey$keyPath.GetSubKeyNames | ForEach对象{ $props=@{ 打印机=$\更换\ 计算机=$计算机 用户名=$user.samaccountname } 新对象-TypeName PSCustomObject-属性$props } } } 您可以将各个计算机名传递给函数,函数将查找已登录的用户。他们通过一个关联的explorer.exe进程来判断谁登录了。对于这些用户名中的每一个,再次检查active directory以获取其SID get AdUser可能不是最好的方法,但这是一种简单的方法。然后,我们使用该信息打开远程注册表并获取网络打印机配置

一些示例输出:

UserName Printer                        Computer
-------- -------                        --------
matt     \\printserver\kanexecutive01       mypc   
matt     \\printserver\kanlabel02           mypc   
matt     \\printserver\kanpublications01    mypc   
matt     \\printserver\kanpublications02    mypc   
matt     \\printserver\kantechrecords01     mypc   
matt     \\printserver\yowengineering02     mypc   
matt     \\printserver\ywglabel01           mypc   
matt     \\printserver\YEGlabelmtce01       mypc 
有几个潜在的错误没有得到解释。因此,随着时间的推移,这肯定会有所改善


你也可以考虑其他远程注册表选项,如果我没有帮助的话,也可以将它们应用到逻辑中。p> 好的,这是个好主意。这样我就可以使用我在第一篇文章中包含的前两行中的任意一行,然后实现一个方法将结果发送回我。我现在不在电脑前,但我会测试一下,然后回复。谢谢你的回复。没问题,如果你还需要帮助,请告诉我们,别忘了标记答案以帮助其他有同样问题的人issue@Luke诚然,使用香港大学并不会为你带来你所需要的结果,但有其他方法可以远程获取这些信息。这在很大程度上取决于环境。net和wmi可以做什么。谢谢你提出这个问题。我一直想这样做一段时间,但没有足够的关心解决方案。现在我有一个。。。至少对我来说。

UserName Printer                        Computer
-------- -------                        --------
matt     \\printserver\kanexecutive01       mypc   
matt     \\printserver\kanlabel02           mypc   
matt     \\printserver\kanpublications01    mypc   
matt     \\printserver\kanpublications02    mypc   
matt     \\printserver\kantechrecords01     mypc   
matt     \\printserver\yowengineering02     mypc   
matt     \\printserver\ywglabel01           mypc   
matt     \\printserver\YEGlabelmtce01       mypc