我在共享文件夹中有一个C#应用程序,在其中我有3或4个人都运行相同的.exe文件.我需要能够计算正在运行的进程的所有实例.
到目前为止,我已经尝试过互斥并且:
Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length;
如果我要计算我在计算机上运行的.exe文件的实例数量,这些功能将起作用,但是它将在多台计算机上运行,并且都指向同一个共享可执行文件.
我不想创建一个依赖用户打开或关闭文件来增加和减少的文件,因为这样做是不可靠的.
– – – – 编辑 – – – – – – –
有人知道Excel是如何做到的吗?如果第二个人打开文件,则说明文件正在使用中,并告诉您谁在使用文件
谢谢您的帮助!!!
解决方法:
您可以告诉谁开放了股份:
打开计算机管理(右键单击我的计算机,然后选择管理)
然后从左侧的树形视图中选择:
系统工具>共享文件夹>会议
这列出了谁正在通过共享访问文件.
有一个关于以编程方式执行此操作的答案:
https://*.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,但是在读取打开的会话时,我很想使用DB表并在您的select中添加where子句:
Select
*
FROM
Session
WHERE
LastPing > DATEADD(second,-60,Now())
而且我会检查插入时是否有旧记录,这样就不会有很多旧行流连忘返.
编辑:只是要弄清楚,如果您使用了此答案开头列出的疯狂技术,您将无法知道有人已将文件复制到本地计算机并运行它.如果您使程序坚持要与特定的数据库或服务器建立连接,那么您将拥有更多的控制权.