计算在共享文件夹上运行的.exe的所有实例

本文关键字:exe 实例 运行 共享 共享文件 文件夹 计算 | 更新日期: 2023-09-27 18:02:52

我有一个c#应用程序,在一个共享文件夹中,我有3或4个人都运行相同的。exe文件。我需要能够计算正在运行的进程的所有实例。

到目前为止,我已经尝试了互斥和:

Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length;

如果我试图计算在我的机器上运行的。exe文件的实例数量,这些工作,但这将在多台机器上运行,所有指向相同的共享可执行文件。

我不想创建一个根据用户打开或关闭它来递增或递减的文件,因为那样是不可靠的。

——编辑 --------------

有谁知道Excel是怎么做的吗?如果第二个人打开这个文件,它会告诉你这个文件正在使用中,并告诉你是谁在使用它谢谢你的帮助!!

计算在共享文件夹上运行的.exe的所有实例

除了实现某种形式的许可服务,或者如果您对正在运行的机器具有特权,就没有其他方法了。

你可以知道谁打开了一个共享:

打开计算机管理(右键单击我的计算机并选择管理)然后从左边的树视图中选择:

system tools> shared folders> sessions

this列出通过共享访问文件的用户。

有一个关于编程的答案:

https://stackoverflow.com/a/2418657/359135

如果你真的想更进一步,并且你有管理员权限,你可以使用这个信息来询问连接机器上正在运行的进程:

tasklist.exe /S SYSTEM /U USERNAME /P PASSWORD
http://www.watchingthenet.com/how-to-view-and-kill-processes-on-remote-windows-computers.html

我不是建议你做这些…更多地强调需要什么。我会在某个地方运行一个服务器,接收来自你的应用程序的打开,关闭和ping通知。

ping通知可以让你识别已经崩溃、失去连接或由于任何其他原因没有向服务器应用程序发送关闭通知的实例。

我看到过这样做,仅仅是在一个开放会话的DB中有一个表,大约每分钟写一次。我不知道这对数以百万计的用户会有什么影响,但我已经看到它对几十个用户(最多大约100个)起作用了。

编辑:

更多关于ping…

如果你有服务器端代码,你可以积极寻找丢失的ping,但是我想只是使用一个DB表,并在读取打开的会话时添加where子句:

Select
    *
FROM
    Session
WHERE
    LastPing > DATEADD(second,-60,Now())

,我会在插入时检查旧记录,这样你就不会有很多旧行挂在周围。

编辑:只是要清楚,如果你使用了这个答案开头列出的疯狂技术,你将无法知道有人将文件复制到他们的本地机器上并运行它。如果你让程序坚持它与特定的数据库或服务器有连接,那么你就有了更多的控制权。

一台计算机上的进程无法检测到另一台计算机上运行的进程,除非在它们之间建立某种通信。

你可以按照你的建议建立一个共享文件,但是它是不可靠的。

你可以在一些中央计算机上运行一个服务,每个实例都必须向服务器报告,但当然这也会有类似的可靠性问题。(如果一个实例在没有通知服务器的情况下死亡,服务器不会意识到它还在运行。)

当每个实例运行时,它可以监听一个端口,在一个中央文件中记录它的IP和端口号,当你需要一个计数时,你尝试连接到每个端口以确认实例仍在运行。

有很多方法可以做这件事,但工作取决于你。没有操作系统的帮助,就像你在同一台机器上得到的那样。