为了账号安全,请及时绑定邮箱和手机立即绑定

防止进程看到现有实例

防止进程看到现有实例

C#
哈士奇WWW 2022-01-15 16:47:26
这是情况。我有一个应用程序,出于所有意图和目的,我必须将其视为黑匣子。我需要能够打开这个应用程序的多个实例,每个实例都带有一组文件。打开 this 的语法是executable.exe file1.ext file2.ext.如果我在executable.exe没有参数的情况下运行 x 次,则新实例可以正常打开。如果我executable.exe file1.ext随后运行,executable.exe file2.ext则第二次调用会在现有窗口中打开文件 2,而不是创建新实例。这会干扰我的其他解决方案,这就是问题所在。我的解决方案包装了这个应用程序并对其执行各种管理操作,这是我的包装类之一:public class myWrapper{    public event EventHandler<IntPtr> SplashFinished;    public event EventHandler ProcessExited;    private const string aaTrendLocation = @"redacted";    //private const string aaTrendLocation = "notepad";    private readonly Process _process;    private readonly Logger _logger;    public myWrapper(string[] args, Logger logger =null)    {        _logger = logger;        _logger?.WriteLine("Intiialising new wrapper object...");        if (args == null || args.Length < 1) args = new[] {""};        ProcessStartInfo info = new ProcessStartInfo(aaTrendLocation,args.Aggregate((s,c)=>$"{s} {c}"));        _process = new Process{StartInfo = info};    }    public void Start()    {        _logger?.WriteLine("Starting process...");        _logger?.WriteLine($"Process: {_process.StartInfo.FileName} || Args: {_process.StartInfo.Arguments}");        _process.Start();        Task.Run(()=>MonitorSplash());        Task.Run(() => MonitorLifeTime());    }在我开始提供文件参数并且这种意外的实例化行为开始之前,我的包装类都可以正常工作。我无法修改目标应用程序,也无法访问其源代码来确定此实例化是使用互斥锁还是通过其他某些功能进行管理的。因此,我需要确定是否有办法阻止新实例看到现有实例。有人有什么建议吗?TLDR:如何防止仅限于单个实例的应用程序确定已经有一个实例正在运行为了澄清(在可疑评论之后),我公司的研发团队写道executable.exe,但我没有时间等待他们在这件事上的帮助(我有几天而不是几个月)并且有权做任何需要的事情来提供所需的功能(有一个我的解决方案比这个问题提到的更多)迅速。通过一些反编译工作,我可以看到正在使用以下内容来查找现有实例。Process[] processesByName = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);有什么办法可以解决创建具有不同名称的应用程序的多个副本的情况吗?我考虑过在Process运行中重命名,但显然这不可能不写内核漏洞......
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

我过去通过创建源可执行文件的副本解决了这个问题。在您的情况下,您可以:

  • 将“original.exe”保存在特定位置。

  • 每次需要调用它时,创建 original.exe 的副本并将其命名为“instance_xxxx.exe”,其中 xxxx 是唯一编号。

  • 根据需要执行您的新实例 exe,完成后您可以将其删除

  • 您甚至可以通过创建实例池来重用这些实例


查看完整回答
反对 回复 2022-01-15
?
Helenr

TA贡献1780条经验 获得超4个赞

在 Dave Lucre 的回答的基础上,我通过创建绑定到我的包装类的可执行文件的新实例来解决它。最初,我继承IDisposable并删除了 Disposer 中的临时文件,但由于某种原因导致清理会阻塞应用程序的问题,所以现在我的主程序最后执行清理。


我的构造函数现在看起来像:


public AaTrend(string[] args, ILogger logger = null)

{

    _logger = logger;

    _logger?.WriteLine("Initialising new aaTrend object...");

    if (args == null || args.Length < 1) args = new[] { "" };

    _tempFilePath = GenerateTempFileName();

    CreateTempCopy(); //Needed to bypass lazy single instance checks

    HideTempFile(); //Stops users worrying

    ProcessStartInfo info = new ProcessStartInfo(_tempFilePath, args.Aggregate((s, c) => $"{s} {c}"));

    _process = new Process { StartInfo = info };

}

使用两种新方法:


    private void CreateTempCopy()

    {

        _logger?.WriteLine("Creating temporary file...");

        _logger?.WriteLine(_tempFilePath);

        File.Copy(AaTrendLocation, _tempFilePath);

    }


    private string GenerateTempFileName(int increment = 0)

    {

        string directory = Path.GetDirectoryName(AaTrendLocation); //Obtain pass components.

        string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(AaTrendLocation);

        string extension = Path.GetExtension(AaTrendLocation);

        string tempName = $"{directory}\\{fileNameWithoutExtension}-{increment}{extension}"; //Re-assemble path with increment inserted.

        return File.Exists(tempName) ? GenerateTempFileName(++increment) : tempName; //If this name is already used, increment an recurse otherwise return new path.

    }

然后在我的主程序中:


    private static void DeleteTempFiles()

    {

        string dir = Path.GetDirectoryName(AaTrend.AaTrendLocation);

        foreach (string file in Directory.GetFiles(dir, "aaTrend-*.exe", SearchOption.TopDirectoryOnly))

        {

            File.Delete(file);

        }

    }

作为旁注,这种方法仅适用于具有(惰性)确定实例化方法的应用程序,这些方法依赖于Process.GetProcessByName(); Mutex如果使用 a 或者如果在清单中明确设置了可执行文件名称,它将不起作用。


查看完整回答
反对 回复 2022-01-15
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信