【问题标题】:Remotely start Process in foreground在前台远程启动进程
【发布时间】:2016-02-22 17:48:37
【问题描述】:

如果某个进程尚未在我们的远程服务器上运行,我需要检查并启动该进程。我遇到的问题是进程作为后台进程启动,这是不希望的。这是我用来启动该过程的代码:

public Process StartUploader()
    {
        try
        {
            var uploaderLocation = Properties.Settings.Default.CaptureLifeUploaderLocation;
            var uploadProcess = uploaderLocation + Properties.Settings.Default.CaptureLifeUploaderFilename;

            Logger.Info($"Checking {uploaderLocation} for {Properties.Settings.Default.CaptureLifeUploaderFilename}");

            if (Directory.Exists(uploaderLocation))
            {
                var files = Directory.EnumerateFiles(uploaderLocation).Count();
                if (files > 0)
                {
                    return Process.Start(uploadProcess);
                }
            }

            var errorMessage = $"{uploadProcess} not found. Please check the directory/filename and try again.";
            Logger.Error(errorMessage);
            throw new FileNotFoundException(errorMessage);
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message, ex);
        }   
    }

当我在本地运行此程序时,相关进程按预期在前台启动。当它在服务器上运行时,没有那么多。 AppPool 设置为与安装程序的服务器上的“用户”相同的身份。我已经用 notepad.exe 对此进行了测试,并且该程序遇到了同样的问题。

【问题讨论】:

  • IIS 无法做到这一点,因为它没有在交互式会话中运行。只有具有交互式会话的登录用户才能执行此操作。
  • @squillman 是否有办法通过代码实现我想做的事情?
  • 澄清一下,您是在尝试在客户端机器上启动一个交互式进程,对吧?
  • 我正在尝试启动第三方实用程序,在该状态下我可以验证它已完成所需的工作。我假设这与交互式过程相同。除了验证它是否按预期工作之外,我实际上不必与程序进行交互。这能回答你的问题吗?
  • 我会研究 WMI 来管理远程机器上的进程:stackoverflow.com/a/2343745/3922214

标签: c#


【解决方案1】:

如果应用程序有一个 GUI,并且您想在服务器上启动它,那么必须有人在服务器上保持登录状态,以便有一个活动会话来托管/接收进程。这通常不是理想的情况,但如果您可以接受,那么在问题上追求类似 NineBerry 在 cmets 中链接的内容就是要走的路。如果您无法让用户保持登录状态,那么您将需要找到不同的解决方案,例如该工具的命令行版本、API 或从该工具进行日志记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2018-08-16
    相关资源
    最近更新 更多