Контроллер приложений службы Windows - PullRequest
1 голос
/ 27 марта 2009

Вот посылка:

У меня есть рабочий стол, на котором я могу запускать и останавливать приложения, но не могу получить удаленный доступ. Я имел в виду настройку службы на машине, которая будет запускать / останавливать список приложений, как сказано. Эта служба Windows периодически опрашивает веб-службу для новых команд и выполняет их соответственно.

Это мои вопросы.

1) Это самое простое решение? Что еще вы бы порекомендовали?

2) Насколько сложно запустить exe из службы Windows? Как насчет остановки одного?

Это не для проекта или чего-то еще, просто что-то, что я заинтересован в реализации (в основном для развлечения). Любые ответы или даже мысли приветствуются. Общая дискуссия также приветствуется (не стесняйтесь оставлять комментарии).

Ответы [ 5 ]

3 голосов
/ 27 марта 2009

Что касается создания самой службы Windows в C #, см. Мой пост здесь .

Механизм опроса будет работать, но в целом я предпочитаю процессы, управляемые событиями, а не процессы опроса. Вы не упомянули, какую версию .NET вы используете, но если это .NET 3.0 / 3.5, я бы предложил использовать WCF. Когда команда публикуется в веб-службе, веб-служба может отправить команду в службу Windows для выполнения. Довольно просто. Юваль Лоуи, автор «Программирования служб WCF», предлагает несколько примеров / библиотек WCF, которые можно бесплатно использовать на его веб-сайте .

1 голос
/ 27 марта 2009

Итак, я думаю, PsExec не может быть и речи?

Кроме этого, нетрудно реализовать запуск программ внутри службы Win. Просто используйте для этого класс .NET Process, пример из моего кода:

        ProcessStartInfo processStartInfo = new ProcessStartInfo (programExePath, commandLineArgs);

        consoleLogger.WriteLine (log, Level.Debug, "Running program {0} ('{1}')", programExePath, commandLineArgs);

        processStartInfo.CreateNoWindow = true;
        processStartInfo.ErrorDialog = false;
        processStartInfo.RedirectStandardError = true;
        processStartInfo.RedirectStandardOutput = true;
        processStartInfo.UseShellExecute = false;

        using (Process process = new Process ())
        {
            process.StartInfo = processStartInfo;
            process.ErrorDataReceived += new DataReceivedEventHandler (process_ErrorDataReceived);
            process.OutputDataReceived += new DataReceivedEventHandler (process_OutputDataReceived);
            process.Start ();

            process.BeginOutputReadLine ();
            process.BeginErrorReadLine ();

            if (false == process.WaitForExit ((int)TimeSpan.FromHours(1).TotalMilliseconds))
                throw new ArgumentException("The program '{0}' did not finish in time, aborting.", programExePath);

            if (process.ExitCode != 0)
                throw new ArgumentException ("failed.");
        }
0 голосов
/ 27 марта 2009

Сначала я отвечу на вопрос 2:

Чтобы запустить или остановить программы, вам просто нужно использовать объект System.Diagnostics.Process, а пример кода находится прямо в библиотеке MSDN.

Для вопроса 1: Вы можете периодически опрашивать веб-сервис, если хотите.

В качестве альтернативы вы можете настроить службу для удаленного взаимодействия и заставить ее просто прослушивать tcp-порт для вызовов функций, а затем написать приложение Windows, которое может использовать удаленное взаимодействие для вызова службы. Я должен был сделать это для легального бизнес-приложения, и оно работает очень хорошо.

Однако я был бы очень безответственным, если бы не включил это предупреждение:

В любом случае, настройка компьютера таким образом, чтобы он мог выполнять произвольный код, является плохой идеей и должна выполняться очень осторожно. То, что это можно сделать, не означает, что должно быть . Если вы пойдете по пути веб-службы, как вы будете обеспечивать, чтобы кто-то не вмешивался в веб-службу и не получал вредоносный код для выполнения? Откуда вы знаете, что кто-то не будет связываться с вашим app.config и будет указывать приложению свой собственный веб-сервис? В сценарии удаленного взаимодействия, как убедиться, что какой-то другой разработчик .Net не просто создает собственный прокси-сервер?

Честно говоря, я поражен тем, что Microsoft даже позволяет использовать System.Diagnostocs.Process в приложении .Net. Вы можете буквально делать с ней все, что захотите, включая запуск оболочки cmd и выполнение системных команд. Поэтому я призываю вас серьезно подумать, действительно ли это необходимо сделать. Возможно, вам лучше будет установить vnc, либо использовать удаленный рабочий стол, либо другое приложение для удаленного доступа.

Еще один вопрос, на который вам нужно ответить: «должно ли приложение быть видимым для пользователя на этом удаленном компьютере?» Если это так, то вам нужно убедиться, что служба настроена для работы в контексте этого пользователя. в противном случае вы можете, например, запустить Word с использованием локальной системной учетной записи, и он никогда не будет виден человеку, вошедшему в систему на этом компьютере.

0 голосов
/ 27 марта 2009

Это не будет слишком сложно - вы можете просто сделать так, чтобы он периодически запрашивал какой-либо веб-сервис для получения списка «запрещенных» приложений, а затем по другому таймеру проверял наличие запущенного приложения и убивал его, если это. Вот некоторый код для получения списка процессов, и вы можете использовать методы класса процессов для запуска или уничтожения чего-либо:

http://www.vbdotnetheaven.com/UploadFile/prvn_131971/machineprocessvb11182005001454AM/machineprocessvb.aspx

Таймеры также могут работать независимо друг от друга - он может проверять веб-сервис один раз в день на наличие нового списка добавления / запрета, но затем проверять процессы, запущенные на компьютере, например, каждые 2 минуты.

0 голосов
/ 27 марта 2009

Я сделал службу, которая запускает другие исполняемые файлы. Есть несколько вещей, на которые следует обратить внимание: как сервис у вас нет визуального рабочего стола -> прямое взаимодействие невозможно. Кроме того, программа должна быть рассчитана на долгое время.

Остановка exe означает уничтожение процесса. Рассмотрим обычные побочные эффекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...