3

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

到目前为止,我已经尝试过互斥锁并且:

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

如果我试图计算我在我的机器上运行的 .exe 文件的实例数,那么这些就可以工作,但这将在多台机器上运行,所有这些机器都指向同一个共享可执行文件。

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

- - - - 编辑 - - - - - - -

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

4

3 回答 3

2

除了实施某种形式的许可服务或者您对正在运行的机器拥有特权之外,别无他法。

于 2013-03-08T15:03:19.110 回答
1

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

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

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

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

有很多方法可以做到,但工作取决于你。当它们都在同一台机器上时,操作系统不会提供任何帮助。

于 2013-03-08T15:08:39.763 回答
1

你可以知道谁有一个共享开放:

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

系统工具>共享文件夹>会话

这列出了谁正在通过共享访问文件。

有一个关于以编程方式执行此操作的答案:

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 通知可让您识别已崩溃、失去连接或出于任何其他原因未向服务器应用程序发送关闭通知的实例。

我已经看到这只是通过在每分钟左右写入的开放会话数据库中创建一个表来完成的。我不知道这对数百万用户如何工作,但我已经看到它对数十个用户(最多大约一百个)运行良好。

编辑:

更多关于 ping..

如果您有服务器端代码,您可以主动查找丢失的 ping,但是我很想在阅读打开的会话时只使用数据库表并在您的选择中添加 where 子句:

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

我会在插入时检查旧记录,这样你就不会得到很多旧行。

编辑:为了清楚起见,如果您使用了此答案开头列出的疯狂技术,您将无法知道有人已将文件复制到本地计算机并运行它。如果您让程序坚持它与特定数据库或服务器有连接,那么您将拥有更多控制权。

于 2013-03-08T15:23:09.423 回答