如何检查networking共享EXE文件是否被多个用户使用?

我有一个应用程序位于networking共享文件夹中的服务器上。 networking中的许多用户可以同时使用该文件。 我想执行该EXE文件的更新,为此,我想知道谁在networking(除了我)正在使用该文件。

是否有可能以编程方式检查? 例如:要列出所有正在使用该文件的用户名? 或至less检索该文件上的锁的数量?

谢谢。

要在计算机中列出打开的共享文件,您可以使用ADSI(Active Directory Service Interfaces,活动目录服务接口)。

为了使用delphi的这些接口,你必须导入Active DS类型库

在这里输入图像说明

然后访问IADsFileServiceOperations接口,该接口包含一个名为Resources方法返回一个包含所有打开的共享资源的集合。

检查这个示例代码

 {$APPTYPE CONSOLE} uses ActiveDs_TLB, Variants, ActiveX, SysUtils; function ADsGetObject(lpszPathName:WideString; const riid:TGUID; out ppObject):HRESULT; safecall; external 'activeds.dll'; procedure ListSharedResourcesInUse; var FSO : IADsFileServiceOperations; Resources : IADsCollection; Resource : OleVariant; pceltFetched : Cardinal; oEnum : IEnumvariant; begin //establish the connection to ADSI ADsGetObject('WinNT://./lanmanserver', IADsFileServiceOperations, FSO); //get the resources interface Resources := FSO.Resources; //get the enumerator oEnum:= IUnknown(Resources._NewEnum) as IEnumVariant; while oEnum.Next(1, Resource, pceltFetched) = 0 do begin Writeln(Format('Resource %s User %s',[Resource.Path,Resource.User])); Resource:=Unassigned; end; end; begin try CoInitialize(nil); try ListSharedResourcesInUse; finally CoUninitialize; end; except on E:Exception do Writeln(E.Classname, ':', E.Message); end; Writeln('Press Enter to exit'); Readln; end. 

如果你真正需要的是替换一个可能正在使用的exe文件,你可以重命名该可执行文件,然后将这个新文件复制到同一个位置。 新用户将运行新的可执行文件,只要最后一个运行该文件的用户关闭应用程序,就可以删除旧的(可重命名的)可执行文件。

这可能是矫枉过正,但有一个服务器 – 客户端架构呢? 一个应用程序可以在你的服务器上运行,每当有人启动一个客户端,它就连接到服务器。

添加一个“状态/状态”的等式,可以改变到您目前的需要:正常,准备升级,升级中,等等

通过这种方式,您可以遍历打开的连接列表,并向所有人发送消息,使系统进入维护模式,或者当客户端启动时,可以通知用户发生了什么事情。

干杯

如果你启动exe,它将被锁定写入。 因此,替换或重命名exe是安全的,但如果你不能这意味着使用exe。

PsFile和“网络文件”可以显示文件是否打开,您可以关闭文件。 但是这对于启动程序的用户来说并不好。

我认为最好是创建函数发送消息给程序的所有用户。 如果您需要升级禁用新登录,并发送消息给所有用户“请退出,需要升级!”。 重试这个,直到你可以替换exe。 PsFile不能告诉谁在使用文件,但只有在使用文件的情况下。