如何在LAN上的所有主机上查找正在运行的程序的所有实例?

出于实际目的,SqlDataSourceEnumerator所做的是查找在LAN上的各种PC上运行的所有SQL Server实例。

是否有找到任意应用程序的运行实例的等价物?

编辑:好的,所以这只能起作用,因为这些应用程序具有预定义的合作方法。 是否有一种直接的方法来确定某个给定文件(例如exe)是否存在于LAN上的某台机器上,即使应用程序本身当时没有运行? 理解必须考虑权限。

什么SQL枚举它在整个lan段(子网掩码)上广播UDP数据包(端口1434)。 在各种主机上运行的SQL Browser Agent服务侦听此数据包,并使用本地实例列表进行响应。 因此,为了进行枚举,许多鸭子已经为你准备好了:

  • 有一个众所周知的SQL isntance发现协议,UDP 1434广播和响应
  • 有一个服务正在侦听此广播,由SQL Server安装程序安装
  • 有一个客户端库来实现您利用的广播请求格式和响应解析

对于任意行为相同的应用程序,所述应用程序必须实现这些缺失的部分。 发现在子网段中的任意主机上运行的任意进程对于所有实际方法基本上是不可能的。

区别在于SqlDataSourceEnumerator在LAN上找到“它可以看到”的所有实例。 如果服务器进程配置为不响应该请求,则不会看到它。

沿着同一条线,您可以扫描任何具有某种方式使其存在远程知道的应用程序。 最简单的是,应用程序将监听并响应连接。 例如,应用程序可以绑定到TCP端口并侦听任何请求并发回一个响应,表明它已存活并正在运行,并且可以扫描网络上的主机以查找这些回复。

然而,对于“任意应用程序”,大多数应用程序没有这种网络发现机制。 如果您控制任意应用程序,那么您可以在其中构建该function。 但是如果你不这样做,那么你需要某种方法在任何给定的主机上寻找该应用程序,这意味着它需要某种网络交互。

不,没有。

适用于SQL服务器的原因是SQL服务器具有侦听器,该侦听器在网络上侦听“发现”请求。 然后,应用程序可以在网络上发送广播消息,并侦听对该请求的响应以发现SQL服务器实例。

我想你可以编写一个通常可以执行此操作的程序 – 它可以侦听发现请求,使用一些Windows API函数来枚举在该计算机上运行的进程,并在请求的程序运行时进行响应。