Запустите программу при запуске компьютера, когда никто не вошел в систему, и покажите окно, когда кто-то вошел в систему (ОС: Windows)

19

У меня есть программа, которая запускается при запуске системы с помощью планировщика заданий в Windows Server 2012. Программа должна запускаться, даже если компьютер автоматически перезагружается.

Администратор - это учетная запись, используемая для запуска программы, для задачи выбран параметр «Запускать, вошел ли пользователь в систему или нет».

Проблема заключается в том, что когда кто-то, наконец, входит в систему как администратор, используя Remote Desktop Connection, интерфейс (окно программы) скрывается.

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

Как я могу решить это?

Это должно быть довольно распространенной проблемой, но я не могу найти что-либо, ища в сети. Я очень удивлен, что Microsoft допускает такое ограничение в своем планировщике. Могу ли я создать VBScript или что-то, что запускается при запуске и запускает программу, которая затем будет видна, когда пользователь действительно войдет в систему?

Другие идеи?

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

Маркус
источник
2
Firedaemon, установите приложение как службу, когда RDPed переключается на «Сеанс 0» с помощью Firedaemon. Смотрите приложение.
TheCleaner
Технически это можно сделать, если вы разрабатываете свой собственный сервис.
Райан Райс
1
Просто ответил на мой собственный вопрос. Однако я не могу принять свой собственный ответ в течение двух дней, потому что система здесь на serverfault.com очень плохая (большинство людей теперь просто покидают эту страницу, не дожидаясь двух дней, и оставляют вопрос навсегда помеченным как нерешенный).
Маркус
2
@Marcus: ограничения на то, кто и что может делать, предназначены для пресечения определенных злоупотреблений. К сожалению, они иногда создают неудобства для подлинных попыток сделать все правильно, но иногда такие компромиссы должны быть достигнуты. Если у вас есть предложение, которое может улучшить ситуацию (хотя бы защищая сайт, но не создавая неудобств для подлинных пользователей), лучше поднять мысль через соответствующий «мета» сайт ( meta.serverfault.com , meta. stackoverflow.com ) вместо того, чтобы жаловаться в комментарии, что бегуны сайта очень вряд ли увидят.
Дэвид Спиллетт
Как вы можете видеть из голосования, ответ, который вы хотите принять, не тот, который одобряют люди, потому что то, как вы пытаетесь это сделать, неправильно с самого начала.
JamesRyan

Ответы:

28

Разобрался, как это сделать сам. Это своего рода обходной путь, но я ожидал этого.

Стоп! Только пока не съеживайтесь. Читай дальше...

  • Запустите его, установите так, чтобы администратор автоматически входил в систему.

  • Создайте задачу в планировщике задач. Установите его для запуска только когда пользователь (администратор) вошел в систему. Триггер "при входе в систему" и указывает, что это только когда администратор входит в систему.

  • Создайте второе задание. Запускать только при входе пользователя в систему, запускать при входе администратора. Действие должно быть «запустить программу», а программа - «C: \ Windows \ System32 \ rundll32.exe» с полем аргумента, установленным на «user32.dll, LockWorkStation».

Теперь, если вы перезагрузите компьютер, администратор автоматически войдет в систему, запустится программа, которую вы хотите запустить, и рабочая станция будет заблокирована. Если я вхожу через подключение к удаленному рабочему столу, я вижу окно программы и использую графический интерфейс. Я могу без проблем заблокировать / разблокировать компьютер и отключить / повторно подключить, как мне нравится. Нет проблем, если я иду на сервер и захожу на рабочую станцию. Поскольку администратор уже вошел в систему, задача больше не будет запускаться (она не создает бесконечный цикл входа-блокировки-блокировки, из которого невозможно выйти).

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

Маркус
источник
7
Никакого неуважения (или негатива), Маркус. Но если это действительно тот тип ответа, который вы искали, этот вопрос был бы более подходящим для SuperUser .
Райан Болджер
2
Было непросто решить, какой обмен стека нужно опубликовать.
Маркус
Привет, Маркус, я последовал твоему ответу, но у меня проблема с запуском двух программ с графическим интерфейсом вместо одной. Я разместил вопрос в SuperUser. Если бы вы могли ответить на него там, это будет отличная помощь - superuser.com/questions/902386/…
user2162550
1
На самом деле это тоже понижение, потому что это НЕ ответ на вопрос. Вопрос явно определяет полдень входа в систему - и ваше «решение» здесь делает автоматический вход (так что кто-то вошел в систему). Может быть, не умная формулировка в вопросе, но вопрос в том, как он есть.
TomTom
1
@TomTom Как вариант, представленный конечному пользователю, «Запускать, вошел ли пользователь в систему или нет», может определенно означать «Вам не нужно быть здесь, чтобы присматривать за ребенком, чтобы убедиться, что он запускается».
Арье Лейб Таурог
16

У меня есть программа, которая запускается при запуске системы с помощью планировщика заданий в Windows Server 2012. Программа должна запускаться, даже если компьютер автоматически перезагружается.

Тогда почему вы не делаете это системной службой, как определяют спецификации Windows?

Как я могу решить это?

Тебе нельзя. Фоновые программы не должны взаимодействовать с пользовательским интерфейсом. Или: пользовательский интерфейс должен запустить свою собственную программу, которая затем подключается к службе. Пользовательский интерфейс, запущенный в пользовательском пространстве вошедшего в систему пользователя, выполняет презентацию, а служба Windows - обработку. Вот как модель рассчитана на 15 лет или около того.

Я очень удивлен, что Microsoft допускает такое ограничение в своем планировщике.

Я больше удивлен, что вы никогда не задумывались, почему.

Есть несколько проблем:

  • Когда несколько человек вошли в систему, кто получает интерфейс?
  • Когда пользователь выходит из системы, вы убиваете программу? УЧ.
  • Безопасность. Фоновая программа может работать с ограниченными правами - предоставление пользователю пользовательского интерфейса означает, что пользователь может выполнять код там. Модель сообщений Windows - ах - полна проблем.

Я не хочу делать отдельную программу только для GUI, которая, кстати, соединяется с оригинальной программой.

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

TomTom
источник
3
Аминь. Я хотел бы, чтобы больше продавцов приложений поняли эту концепцию.
Райан Болджер
15
Вау, ты не издеваешься в своем отношении. Ну, думаю, мне не повезло. Если вы не введены в заблуждение и у кого-то есть какой-то способ решить эту проблему, все не могут знать все, поэтому вы можете ошибаться с абсолютной частью «вы не можете» в своем сообщении. Я хотел бы оставить вопрос открытым для получения дополнительных ответов на некоторое время, на всякий случай, если у кого-то есть необычный обходной путь, которым можно поделиться. Иначе я приму ваш ответ.
Маркус
На самом деле в современных версиях Windows все труднее предоставить интерфейс для службы, но не невозможно.
MDMoore313
Это активно не разыскивается из-за проблем безопасности. Основная проблема здесь в том, что - и вам действительно нужно это понять - если вы покажете окно в моем пользовательском интерфейсе, я могу выполнить код в вашем процессе. Затем я могу отправлять вам сообщения Windows, и это имеет массу вещей, которые можно использовать. Обычно это не проблема - потому что, если это пользовательское приложение, я могу делать только то, что мог бы я, как пользователь…, но если у службы более высокие привилегии, здесь идет кошмар безопасности. Вот почему это было закрыто много-много лет назад, и каждый, кто изучал программирование и читал документацию, должен был прочитать об этом
TomTom
1
Если вы действительно хотите пойти туда, вы можете попробовать выполнить шаги в coretechnologies.com/WindowsServices/FAQ.html#GUIServices - не уверен, что они по-прежнему работают в текущих окнах, но есть способы сделать UI accessbile - и открыть все проблемы безопасности ,
TomTom
0

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

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

MDMoore313
источник