0

我正在尝试制作一个工具,该工具将通过批处理文件和自定义服务的组合在另一台 PC 上启动应用程序。

目前,我的程序只需按一下按钮即可运行一个特定的程序。当我点击按钮(在winform中)时,它会启动一个批处理文件,运行我在目标PC上找到的exe。像这样:

    // when the service starts open paint
    protected override void OnStart(string[] args)
    {


        // name of the application to launch
        String applicationName = "C:\\TargetFolder\\Target.exe";

        // launch the application
        ApplicationLoader.PROCESS_INFORMATION procInfo;
        ApplicationLoader.StartProcessAndBypassUAC(applicationName, out procInfo);
    }

然后当我点击关闭按钮时,就会发生这种情况

   // when the service is stopped close the client
    protected override void OnStop()
    {


        // name of the application to launch
        String batchFile = "C:\\BatchFiles\\KillClient.bat";


        // launch the application
        ApplicationLoader.PROCESS_INFORMATION procInfo;
        ApplicationLoader.StartProcessAndBypassUAC(batchFile, out procInfo);
    }

我的 winform 运行这个批处理文件:

@echo off
net start "MyNewService" 

不过现在,我正在尝试让我的原始工具根据按钮打开特定的 exe,而无需提供 X 数量的更多服务。谁的唯一工作就是运行这个单一的 exe。

例如,如果我想要一个按钮向上绘画,另一个按钮关闭它,另一个按钮打开单词,最后一个按钮关闭它。我将如何在服务中这样做?

4

2 回答 2

1

您不会将服务用于具有 UI 并需要用户交互的程序。

服务适用于在后台安静运行的程序,无需任何人工干预(可能除了启动和停止它之外)。

如果您想要人机交互,那么您需要编写一个常规的 Windows 应用程序(WinForms、WPF、...)。

于 2012-11-14T12:34:37.020 回答
0

您需要仔细考虑上面 Chris 给出的答案,因为近年来在加强 Windows 操作系统的安全性方面付出了很多努力。Vista 带来的一个变化(我称之为最近的:))是服务现在作为“User0”运行,而不是像以前那样作为“User1”运行。User0 无权访问屏幕。

您正在尝试做的是绕过安全性。我在上面说过 - 考虑当没有用户登录到目标机器时会发生什么,但你也可以考虑如果许多用户有活动会话时你想要发生什么。在我看来,您需要稍微回溯一下并更仔细地制定要求。

话虽如此,您的问题标题询问如何将参数传递给 Windows 服务。2个答案浮现在脑海 -

  1. 您也许可以将该服务实现为 WCF 服务。(不是 Windows 服务)这将允许您定义一个接收您要传递的参数的方法。WCF 还具有以多种不同方式托管的灵活性。因此,这可能会解决 Chris 和我提出的一些问题;当特定用户登录时运行的控制台主机可能对您的特定问题更有意义。您还可以在 Windows 服务中托管您的 WCF 服务 - 我在上面提到的所有保留中都提到了这一点。

  2. 您可以实现一个打开侦听套接字的 Windows(NT) 服务。您的启动器应用程序通过套接字对话连接并传递参数。

毫无疑问还有其他方法。

于 2012-11-14T13:24:44.140 回答