我有一个c#应用程序位于共享文件夹中,我有3或4个人都运行相同的.exe文件。我需要能够计算正在运行的进程的所有实例。
到目前为止,我已尝试过互斥锁,并且:
Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length;
如果我正在尝试计算我在我的计算机上运行的.exe文件的实例数,那么这些工作,但这将在多台机器上运行,所有这些都指向同一个共享可执行文件。
我不想创建一个递增和递减的文件,具体取决于用户是打开还是关闭它是不可靠的。
--------编辑--------------
有人知道Excel是如何做到的吗?如果第二个人打开文件,它会说它正在使用中并告诉您谁正在使用它 谢谢你的帮助!!!
答案 0 :(得分:2)
除了实施某种形式的许可服务或您拥有正在运行的计算机的权限之外,没有任何其他方法。
答案 1 :(得分:1)
一台计算机上的进程无法检测在另一台计算机上运行的进程,除非您在它们之间设置某种通信。
您可以按照建议设置共享文件,但是它会不可靠。
您可以在某台中央计算机上运行服务,每个实例都必须向服务器报告,但当然会出现类似的可靠性问题。 (如果一个实例在没有通知服务器的情况下死亡,服务器将不会意识到它仍在运行。)
当每个实例运行时,它可以在端口侦听,在中央文件中记录其IP和端口号,当您需要计数时,您尝试连接到每个端口以确认该实例仍在运行。 / p>
有很多方法可以做到,但工作取决于你。操作系统没有任何帮助,就像他们在同一台机器上一样。
答案 2 :(得分:1)
您可以告诉谁有共享权:
打开计算机管理(右键单击我的电脑并选择管理) 然后从左侧的树视图中选择:
系统工具>共享文件夹>会话
列出了谁通过共享访问文件。
有一个关于以编程方式进行sdo的答案:
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通知可以识别崩溃,丢失连接的实例,或者由于任何其他原因未向服务器应用程序发送关闭通知。
我已经看到这样做只是在开放会话的数据库中有一个表,每分钟写一次。我不知道这对数百万用户有什么用,但我看到它适用于数十个用户(最多约一百个)。
编辑:
更多关于pinging ..
如果您有服务器端代码,您可以主动查找丢失的ping,但是我很想在阅读打开的会话时使用DB表并在select中添加where子句:
Select
*
FROM
Session
WHERE
LastPing > DATEADD(second,-60,Now())
我会检查插入的旧记录,这样你就不会有很多旧行。
编辑:为了清楚,如果您使用了本答案开头列出的疯狂技术,您将无法知道有人将文件复制到本地机器并运行它。如果你让程序坚持它与特定的数据库或服务器有连接,那么你就有了更多的控制权。