Запустите программу при запуске компьютера, когда никто не вошел в систему, и покажите окно, когда кто-то вошел в систему (ОС: 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 не безразлично, что вам нравится делать. Существует установленная и поддерживаемая модель для привязки фоновой обработки к пользовательскому интерфейсу пользователя, вошедшего в систему - используйте его или нет. Но когда нет, не жалуйтесь о проблемах безопасности, которые вы поставили.


3
Аминь. Я хотел бы, чтобы больше продавцов приложений поняли эту концепцию.
— Райан Болджер

15
Вау, ты не издеваешься в своем отношении. Ну, думаю, мне не повезло. Если вы не введены в заблуждение и у кого-то есть какой-то способ решить эту проблему, все не могут знать все, поэтому вы можете ошибаться с абсолютной частью «вы не можете» в своем сообщении. Я хотел бы оставить вопрос открытым для получения дополнительных ответов на некоторое время, на всякий случай, если у кого-то есть необычный обходной путь, которым можно поделиться. Иначе я приму ваш ответ.
— Маркус

На самом деле в современных версиях Windows все труднее предоставить интерфейс для службы, но не невозможно.
— MDMoore313

Это активно не разыскивается из-за проблем безопасности. Основная проблема здесь в том, что - и вам действительно нужно это понять - если вы покажете окно в моем пользовательском интерфейсе, я могу выполнить код в вашем процессе. Затем я могу отправлять вам сообщения Windows, и это имеет массу вещей, которые можно использовать. Обычно это не проблема - потому что, если это пользовательское приложение, я могу делать только то, что мог бы я, как пользователь…, но если у службы более высокие привилегии, здесь идет кошмар безопасности. Вот почему это было закрыто много-много лет назад, и каждый, кто изучал программирование и читал документацию, должен был прочитать об этом
— TomTom

1
Если вы действительно хотите пойти туда, вы можете попробовать выполнить шаги в coretechnologies.com/WindowsServices/FAQ.html#GUIServices - не уверен, что они по-прежнему работают в текущих окнах, но есть способы сделать UI accessbile - и открыть все проблемы безопасности ,
— TomTom

0

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.