C# 如何检查是否从服务器访问exe

C# 如何检查是否从服务器访问exe,c#,delphi,windows-server,C#,Delphi,Windows Server,这是一个客户机-服务器应用程序。我正在创建一个更新程序,该程序将替换exe文件列表、运行脚本以及任何需要更新的内容。这将安装在服务器上 首先,我需要检查可执行文件是否通过网络共享打开。我可以通过进入计算机管理,然后进入共享文件和打开文件来手动执行此操作。这似乎是检查文件是否打开的唯一方法。我尝试使用R/W检查文件是否已打开,但这不起作用。查看了Win32_ServerConnection,但这只是列出了打开的文件数,而不是名称 如果不能在Delphi中完成,我想在Delphi7或C#中编写代码。

这是一个客户机-服务器应用程序。我正在创建一个更新程序,该程序将替换exe文件列表、运行脚本以及任何需要更新的内容。这将安装在服务器上

首先,我需要检查可执行文件是否通过网络共享打开。我可以通过进入计算机管理,然后进入共享文件和打开文件来手动执行此操作。这似乎是检查文件是否打开的唯一方法。我尝试使用R/W检查文件是否已打开,但这不起作用。查看了Win32_ServerConnection,但这只是列出了打开的文件数,而不是名称


如果不能在Delphi中完成,我想在Delphi7或C#中编写代码。我发现有几个程序可以查看服务器上打开的文件,但没有关于如何执行的内容

您在System.IO中见过FileSystemWatcher吗


为什么不尝试删除它呢?如果文件当前处于打开状态,则会出现错误。如果删除有效,您可以复制更新后的可执行文件。

您可以保留一个将运行此操作的“服务器”的静态列表,您可以查找进程计算机名、主机名或计算机名以查找匹配项。如果它在列表中,您可以假定它是本地打开的

string name = Environment.MachineName;
string name = System.Net.Dns.GetHostName();
string name = System.Windows.Forms.SystemInformation.ComputerName;

Process[] myProcesses = Process.GetProcessesByName("myExeProcName",MachineName);
foreach(Process myProcess in myProcesses)
{
    Console.Write("MachineName : " + myProcess.MachineName + "\n");
}

在Windows 2000及更高版本上,您可以使用API:

似乎
LocalPath
参数中传递的路径必须以双反斜杠开头,例如:

test.exe C:\\Dev\Test\test.exe
生成以下输出(如果文件是通过共享打开的):

还请注意,MSDN表示:

“仅限管理员或 服务器操作员本地组可以 成功执行NetFileEnum 功能。”


我使用这样的函数来检查是否可以更改文件系统上的文件。基本上,我尝试“创建”一个名为fName的新文件,仍然打开现有文件(如果它存在的话),并获得一个有效的文件句柄。如果失败,则该文件正在使用中。 该函数实际上并不创建文件,也不改变现有的文件系统(我从不使用句柄做任何事情)。它只是检查我是否可以获得该文件的文件句柄,如果我想用它做些什么的话

这也适用于从远程计算机上的共享打开的文件

 function IsFileInUse(fName: string): boolean;
  var
    HFileRes: HFILE;
  begin
    Result := false;
    if not FileExists(fName) then
      exit;
    HFileRes := CreateFile(pchar(fName),
      GENERIC_READ or GENERIC_WRITE,
      0, nil, OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      0);
    Result := (HFileRes = INVALID_HANDLE_VALUE);
    if not Result then
      CloseHandle(HFileRes);
  end;

这有什么帮助?打开的可执行文件不是文件系统修改,因此不会被文件系统观察者报告,或者我错了吗。我认为它也可以处理文件访问。对不起,你的另一个问题到底有什么不同?我试图更详细地描述这个问题,希望能找到答案。但是请注意,您可以编辑您的答案,如果问题基本相同,这应该是首选的方式。对不起,我的意思是“编辑您的问题”。投票结束时,与您的其他问题相同。正如Smasher所说,您应该编辑该问题以澄清/添加其他信息,而不是发布一个全新的问题。应该有另一种方法来检查是否从服务器访问了。你可以直观地做。我认为代码中有一种方法可以做到这一点。这不需要管理员权限吗?谢谢,我已经添加了一个关于这一点的注释。这就是我需要它做的。谢谢
id: -469761405, permissions: $00000001, num_locks: 0, pathname: 'C:\\Dev\Test\test.exe', username: 'Ondrej'
 function IsFileInUse(fName: string): boolean;
  var
    HFileRes: HFILE;
  begin
    Result := false;
    if not FileExists(fName) then
      exit;
    HFileRes := CreateFile(pchar(fName),
      GENERIC_READ or GENERIC_WRITE,
      0, nil, OPEN_EXISTING,
      FILE_ATTRIBUTE_NORMAL,
      0);
    Result := (HFileRes = INVALID_HANDLE_VALUE);
    if not Result then
      CloseHandle(HFileRes);
  end;