加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 02:53:36 所属栏目:Windows 来源:网络整理
导读:我有一个应用程序,它位于网络共享文件夹中的服务器上.网络中的许多用户可以同时使用该文件.我想执行该EXE文件的更新并执行此操作,我想知道网络中的人(除了我)当前正在使用该文件. 是否可以通过编程方式进行检查?例如:列出现在使用该文件的所有用户名?或至
我有一个应用程序,它位于网络共享文件夹中的服务器上.网络中的许多用户可以同时使用该文件.我想执行该EXE文件的更新并执行此操作,我想知道网络中的人(除了我)当前正在使用该文件.

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

谢谢.

解决方法

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

要从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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读