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

时间:2011-07-11 11:41:40

标签: windows delphi file network-share

我有一个应用程序,它位于网络共享文件夹中的服务器上。网络中的许多用户可以同时使用该文件。我想执行该EXE文件的更新并执行此操作,我想知道网络中的人(除了我)当前正在使用该文件。

是否可以通过编程方式检查?例如:列出现在使用该文件的所有用户名?或至少检索该文件上的锁数?

感谢。

4 个答案:

答案 0 :(得分:7)

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

要从delphi使用这些接口,您必须导入Active DS类型库

enter image description here

然后访问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.

答案 1 :(得分:2)

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

答案 2 :(得分:1)

这可能有点矫枉过正,但是有了服务器 - 客户端架构呢?应用程序可以在您的服务器上运行,每次有人启动客户端时,它都会连接到服务器。

在等式中添加“状态/状态”,可以改变您当前的需求:正常,准备升级,升级进度等等

通过这种方式,您可以遍历打开的连接列表并向每个人发送消息,告知系统将处于维护模式,或者当客户端启动时,它可以通知用户正在进行的操作。

干杯

答案 3 :(得分:0)

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

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

我认为最好是创建向所有程序用户发送消息的功能。如果您需要升级禁用新登录并向所有用户发送消息“请退出,需要升级!”。重试此操作直到您可以替换exe。 PsFile无法判断谁在使用文件,但只能使用文件。