Получение программы для запуска при запуске из кода C #. Установка Registry Run на «true» не работает - PullRequest
1 голос
/ 17 мая 2010

Я нашел этот хороший фрагмент кода онлайн:

rkApp = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

Что отлично работает, но, увы, на Windows 7 и Vista я подозреваю, что происходит сбой, потому что у него нет разрешения на запись туда.

Итак, я исследую (конечно же, стекопоток), как избежать этого, самый быстрый метод:

rkApp = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);

Достаточно просто! Хотя есть еще две проблемы. Один из них связан с обоими методами (на XP Box), поэтому программа считает, что ее относительный путь находится где-то в папке C: \ windows ... так что, т.е. он не находит мои пути относительно файлов справки и т. д. Вторая проблема заключается в том, что в Windows 7 моя программа не запускается, пока я не войду в систему. Я хочу, чтобы она запускалась в фоновом режиме, если это возможно, прежде чем кто-либо войдет в систему.

Это простой .exe-файл, который зависает в системном окне при его запуске. Я не хотел создавать это чудовище установщика, чтобы обойти эти проблемы администрирования и пути.

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

Так что просто любопытно, какие маршруты я мог бы использовать, чтобы заставить это работать. Я даже могу допустить, чтобы это происходило только после того, как пользователь войдет в систему, но мои текущие методы, которые работают таким образом, действительно портят путь моей программы, так как она пытается записать материал в новый каталог (а не тот, который я изначально запустил EXE от). И т.д. ... и я не имею ни малейшего понятия, как решить эту проблему.

Ответы [ 2 ]

2 голосов
/ 17 мая 2010

Похоже, вам нужны две программы.

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

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

Затем создайте приложение в пользовательском режиме, которое использует IPC для связи со службой. Это может выполняться при входе в систему и удаленном «общении» со службой, обеспечивая тем самым требования к системному трею.

1 голос
/ 17 мая 2010

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

* * * * * * * * * * * * * * * * * * * * * * 1004

В Visual Studio 2008 по умолчанию установлен шаблон проекта для службы Windows:

«Файл> Создать> Проект> Visual C #> Windows> Служба Windows»

...