Tech Box To Unbox Ответов: 2

Как открыть другой графический интерфейс приложения с помощью службы windows


Я пытаюсь открыть приложение(с его графическим интерфейсом) через службу windows. Он не создает никаких исключений или ошибок. Он не открывает приложение. Когда я выполнил тот же код с приложением windows Forms, приложение открывается. Почему служба windows не открывает никаких других приложений ?

В своем коде я попытался проверить, установлено ли приложение "AnyDesk" или нет. Если он установлен, я пытаюсь его открыть. Но он не открывает приложение.

Когда я проверил "диспетчер задач", он отображается в списке приложений "фоновый процесс". Но пользовательский интерфейс не открывается. Как я могу заставить его открыться ?

Мой код выглядит следующим образом :

Что я уже пробовал:

protected override void OnStart(string[] args)
    {
        try
        {
            bool isinstalled = checkInstalled("AnyDesk");
            if (isinstalled)
            {
                Process.Start(@"C:\Program Files (x86)\AnyDesk\AnyDesk.exe");
            }
        }
        catch (Exception ex)
        {
            this.EventLog.WriteEntry(ex.Message, EventLogEntryType.Information);
        }
    }



    public static bool checkInstalled(string c_name)
    {
        string displayName;

        string registryKey = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
        RegistryKey key = Registry.LocalMachine.OpenSubKey(registryKey);
        if (key != null)
        {
            foreach (RegistryKey subkey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
            {
                displayName = subkey.GetValue("DisplayName") as string;
                if (displayName != null && displayName.Contains(c_name))
                {
                    return true;
                }
            }
            key.Close();
        }

        registryKey = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall";
        key = Registry.LocalMachine.OpenSubKey(registryKey);
        if (key != null)
        {
            foreach (RegistryKey subkey in key.GetSubKeyNames().Select(keyName => key.OpenSubKey(keyName)))
            {
                displayName = subkey.GetValue("DisplayName") as string;
                if (displayName != null && displayName.Contains(c_name))
                {
                    return true;
                }
            }
            key.Close();
        }
        return false;
    }

2 Ответов

Рейтинг:
20

OriginalGriff

Вы не можете открыть приложение с графическим интерфейсом из службы вообще: вся идея заключается в том, что сервисы не имеют никакого взаимодействия с пользователем (прямо или косвенно) и не работают под учетной записью "обычного пользователя" именно по этой причине - именно поэтому они могут открываться без входа в систему любого пользователя.

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

Приложения разговаривают со службами, службы не запускают процесс.


Tech Box To Unbox

Не знаю, ошибаюсь ли я, "если ни один пользователь не вошел в систему" означает, что система будет находиться в "выключенном режиме", то служба также не будет работать правильно ?

OriginalGriff

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

https://stackify.com/what-are-windows-services/

Рейтинг:
0

RickZeeland

В Windows XP это было разрешено, но не в более поздних версиях Windows.
Вот довольно сложная статья о том, как обойти контроль UAC Windows: Подрыв Vista UAC как в 32, так и в 64-битных архитектурах[^]
Но мой совет был бы не беспокоить, так как более новые версии Windows, вероятно, будут иметь улучшенную безопасность и будут блокировать любые попытки.