Как запустить консольное приложение от службы Windows?

Я интерпретировал бы Ваши требования, поскольку "находят все подкаталоги, которые содержат все определенные файлы"

#!/bin/bash
parent_dir="$1"
shift
find "$parent_dir" -type d |
while IFS= read -r subdir; do
  all_present=true
  for file in "$@"; do
    if [[ ! -f "$subdir/$file" ]]; then
      all_present=false
      break
    fi
  done
  $all_present && echo "$subdir"
done

, "IFS =" и "читала,-r" части гарантируют, что значение "dir" содержит фактическое имя каталога, даже если она включает пробелы или специальные символы.

29
задан svick 21 February 2011 в 18:27
поделиться

7 ответов

Начиная с Windows Vista, служба не может взаимодействовать с рабочим столом. Вы не сможете видеть окна или окна консоли, запущенные из службы. См. Эту ветку форума MSDN .

В других ОС в параметрах службы доступен параметр «Разрешить службе взаимодействовать с рабочим столом». Технически, вы должны программировать на будущее и следовать руководству Vista, даже если вы не используете его в Vista.

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

ProcessStartInfo info = new ProcessStartInfo(@"c:\myprogram.exe");
info.UseShellExecute = false;
info.RedirectStandardError = true;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.CreateNoWindow = true;
info.ErrorDialog = false;
info.WindowStyle = ProcessWindowStyle.Hidden;

Process process = Process.Start(info);

Посмотрите, помогает ли это.

Сначала вы сообщаете Windows, что программа не будет использовать оболочку (которая недоступна в Vista для обслуживания).

Во-вторых,

25
ответ дан 28 November 2019 в 02:03
поделиться

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

Я подумал, что попробую это с нуля. Вот код, который я написал, запускает консольное приложение. Я установил его как службу и запустил, и он работал правильно: запускается cmd.exe (как видно в диспетчере задач) и живет 10 секунд, пока я не отправлю ему команду выхода. Я надеюсь, что это поможет в вашей ситуации, поскольку здесь все работает должным образом.

    using (System.Diagnostics.Process process = new System.Diagnostics.Process())
    {
        process.StartInfo = new System.Diagnostics.ProcessStartInfo(@"c:\windows\system32\cmd.exe");
        process.StartInfo.CreateNoWindow = true;
        process.StartInfo.ErrorDialog = false;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardInput = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        process.Start();
        //// do some other things while you wait...
        System.Threading.Thread.Sleep(10000); // simulate doing other things...
        process.StandardInput.WriteLine("exit"); // tell console to exit
        if (!process.HasExited)
        {
            process.WaitForExit(120000); // give 2 minutes for process to finish
            if (!process.HasExited)
            {
                process.Kill(); // took too long, kill it off
            }
        }
    }
8
ответ дан 28 November 2019 в 02:03
поделиться

Службы Windows не имеют пользовательского интерфейса. Вы можете перенаправить вывод из консольного приложения в свою службу с помощью кода, показанного в этом вопросе .

5
ответ дан 28 November 2019 в 02:03
поделиться

Как сказал Пьер, нет способа иметь пользовательский интерфейс для службы Windows (или нет простого способа). Что я делаю в такой ситуации, так это имею файл настроек, который считывается из службы в любой интервал, в котором она работает, и автономное приложение, которое вносит изменения в файл настроек.

0
ответ дан 28 November 2019 в 02:03
поделиться

Требует ли ваше консольное приложение взаимодействия с пользователем? Если да, то это серьезный отказ, и вам следует изменить дизайн своего приложения. Хотя есть некоторые уловки, чтобы заставить такую ​​работу работать в более старых версиях ОС, в будущем это гарантированно сломается.

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

Если вам требуется какое-то взаимодействие с пользователем, вам нужно будет создать клиентское приложение и взаимодействовать со службой и / или субприложением через rpc, сокеты или именованные каналы.

0
ответ дан 28 November 2019 в 02:03
поделиться

Службы необходимы для подключения к диспетчеру управления службами и обеспечения обратной связи при запуске (т. Е. Сообщить SCM «Я жив!»). Вот почему приложение C # имеет другой шаблон проекта для сервисов. У вас есть две альтернативы:

  • оберните ваш exe-файл в srvany.exe, как описано в KB Как создать пользовательскую службу
  • , чтобы ваше приложение C # определяло, когда оно запускается как служба (например, командная строка param) и переключите управление на класс, который наследуется от ServiceBase и правильно реализует службу.
0
ответ дан 28 November 2019 в 02:03
поделиться

У меня есть служба Windows, и я добавил в конструктор своей службы следующую строку:

using System.Diagnostics;
try {
    Process p = Process.Start(@"C:\Windows\system32\calc.exe");
} catch {
    Debugger.Break();
}

Когда я попытался запустить это, был выполнен вызов Process.Start (), и исключений не произошло. Однако приложение calc.exe не появилось. Чтобы заставить его работать, мне пришлось отредактировать свойства моей службы в диспетчере управления службами, чтобы включить взаимодействие с рабочим столом. После этого Process.Start () открыл calc.exe, как и ожидалось.

Но, как говорили другие, взаимодействие с рабочим столом не одобряется Microsoft и по существу отключено в Vista. Так что даже если вы сможете заставить его работать в XP, я не уверен, что вы сможете заставить его работать в Vista.

0
ответ дан 28 November 2019 в 02:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: