在我工作的地方,我们使用一款名为 Dameware 的软件来远程管理我们域中的计算机。通过 Dameware,我们能够获得所有在线且当前连接到域的计算机的列表。
我们正在推出不向我们提供此功能的新桌面管理软件。当我们想要连接到一台计算机时,我们需要知道它的名称。
我知道如何获取属于域的计算机列表,但它也返回可能在线或不在线的计算机。如何将当前连接的计算机列表(即它们具有活动的网络连接)返回到域?我考虑过返回属于该域的计算机列表,然后对每台计算机进行 ping 操作,但我认为这会很慢并且完全浪费资源。
您以前遇到过这个问题吗?如果遇到过,哪些解决方案对您有效?我更喜欢 .NET 解决方案,但 VB 脚本也可以。我最终可能会为此构建一个 GUI,然后分发给我们的 IT 团队成员。
如果您观察来自 DameWare 的出站流量,它只会从 AD 中获取所有计算机对象,然后尝试使用 NETBIOS 通过它们的主机名连接到它们。
重新创建非常简单,不涉及任何魔法。
Active Directory 用户和计算机将为您提供域中所有计算机帐户的列表。除了脚本之外,我从来不用担心机器是在线还是离线,因为我所做的更改是通过组策略完成的。对于桌面支持,如果我不能引导用户告诉我他的机器名称,那么我遇到的问题比如何连接要大得多。
- - 前言 - -
我认识到这个问题已经过时了,但它仍然是 Google 上的顶级结果,特别是在搜索“获取所有在线域计算机”时。
- - 解决方案 - -
一行 PowerShell 和必需的 ActiveDirectory模块(在使用 Active Directory 对象时需要)将实现这一点。
尽管您断言 ping 每台域计算机将是一个缓慢的、资源密集型的过程,但这正是我建议做的事情。如果 Active Directory 跟踪每台计算机的连接状态肯定会很方便(不管这个功能产生的流量,这是微软要解决的问题),但不幸的是它没有。
简单地说,下面的代码从 Active Directory 中获取设备列表,对每个设备执行 ping 操作,记录响应(或缺少响应),并显示响应的计算机列表。使用 PowerShell 7,此操作简单、快速且不占用资源。
- - 代码 - -
Windows PowerShell(即 5.1 版):
输出:
上面的命令虽然简单,但在生产环境中完成可能会很慢。因此,建议使用 PowerShell 7 来显着改进 ICMP 管理和并行化。可以使用Windows PowerShell 完成,但难度更大。
PowerShell 7:
输出:
如果您对监控设备状态感兴趣并考虑构建 GUI,您可能会考虑使用Nagios或Zenss等系统(还有很多其他系统,但这两个是流行的选项)。
像 Advanced IP Scanner ( http://www.radmin.com/products/utilities/ipscanner.php ) 这样基本的东西应该能够为您提供此信息。
我经常使用 MMC 控制台进行计算机管理,连接到我们的文件服务器并检查那里的用户连接,以获取他们的计算机名称和 IP 地址以进行远程支持。它既快速又简单,我不必引导用户查找他们的计算机名称。如果他们的连接超时或者我只是让他们单击联网驱动器以打开连接。