1

Тема: VBScript: сценарий входа, выполнение только 1й программы

Здраствуйте!
Есть задача следующего характера:
нужно написать сценарий входа пользователя (если такое возможно) так, чтобы на компьютере выполнялась только 1 программа (не имеются ввиду программы работающие в фоновом режиме и прочее).
Как запустить и сделать, чтоб скрипт следил запущено приложение или нет я нашел, но как сделать, чтоб его (приложение) нельзя было свернуть и прочее додуматься не могу, ибо не хватает знаний. Нужно что-то похожее на фулл скрин в дос приложениях.
Мне нужны только подсказки, я не прошу сделать что-то за меня, а то как я решу вопрос, я тут напишу.
Спасибо!

2

Re: VBScript: сценарий входа, выполнение только 1й программы

Можно попробовать выставить окно вашего приложения как TopMost, например с помощью API функции SetWindowPos, а также показать его в максимизированном виде, например с помощью функции ShowWindow. Тогда окно будет висеть на переднем плане наглухо закрывая собою все остальные. Можно даже попробовать изменить стиль окна, чтобы оно не отображалось в панели задач и отсутствовала кнопка закрытия, (SetWindowLong), но не знаю как это повлияет на работоспособность программы.

3

Re: VBScript: сценарий входа, выполнение только 1й программы

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

4

Re: VBScript: сценарий входа, выполнение только 1й программы

Temasik, не будьте наивны, терминал в данном случае никак не рецепт, особенно если приложение работает со стандартными Common Dialog Controls. Далее, как Вы планируете определять, какие приложения работают в «фоновом» режиме? Я вот, например, не знаю.

Poltergeyst пишет:

Или может отключить загрузку служб и библиотек ответственных за Explorer. Или давить проводник при запуске - пустой рабочий стол с одновременным присутствием горячо любимого пролетариатом окна 1c вполне возможен.

Зачем что-то давить? Можно просто заменить «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell» на что-то своё, хоть на «Far.exe», хоть на «1cv7.exe» . Повторю, толку от этого всё одно будет ноль.

Данная проблема уже пару раз обсуждалась, причём последний раз совсем недавно; вот только что-то я её никак поиском не найду.
Update: еле нашёл: Серый форум / VBS : «calc.exe» - должен умереть, предпоследний пост.

5

Re: VBScript: сценарий входа, выполнение только 1й программы

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

6

Re: VBScript: сценарий входа, выполнение только 1й программы

"Все давить" или подставлять вместо стандартных оболочек свои поделки - путь, чреватый нестабильной работой с непредсказуемыми последствиями.

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

Для работы с окнами придется использовать API. В VBS это невозможно. Для задачи из этой серии я использую объект WORD'а, создаваемый и вызываемый в скрипте.

7

Re: VBScript: сценарий входа, выполнение только 1й программы

Slav пишет:

"Все давить" или подставлять вместо стандартных оболочек свои поделки - путь, чреватый нестабильной работой с непредсказуемыми последствиями.

Я бы предложил такую схему. При входе запускается скрипт. Этот скрипт запускает ту самую прикладную задачу, ждет окончания её запуска и определяет идентификатор активного окна.

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

alexii пишет:

Зачем что-то давить? Можно просто заменить «HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell» на что-то своё, хоть на «Far.exe», хоть на «1cv7.exe» . Повторю, толку от этого всё одно будет ноль.

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

8

Re: VBScript: сценарий входа, выполнение только 1й программы

Poltergeyst пишет:

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

Почему никуда? А Диспетчер задач по Ctrl-Alt-Del? Там можно запустить любую программу из командной строки, в том числе и Проводник. Файл -> Новая задача (Выполнить).

9 (изменено: Poltergeyst, 2009-07-23 13:39:42)

Re: VBScript: сценарий входа, выполнение только 1й программы

YMP пишет:

Почему никуда? А Диспетчер задач по Ctrl-Alt-Del? Там можно запустить любую программу из командной строки, в том числе и Проводник. Файл -> Новая задача (Выполнить).

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

10

Re: VBScript: сценарий входа, выполнение только 1й программы

Для пущей наглядности, кнопки альт на клавиатуре нет и как следствие возможности воспользоваться хоткеями типа alt f4, alt tab, и прочими содержащими данную клавишу, так же нет кнопочки win. Мне интересно если скрипт будет висеть в процессе постоянно, он не будет сильно перегружать процессор?
Как запустить процесс и определить PID его - не проблема, в форуме есть даже пример кода.

11

Re: VBScript: сценарий входа, выполнение только 1й программы

Slav пишет:

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

Оболочка — это обычная программа. При чём тут «нестабильная работа с непредсказуемыми последствиями»? Весьма стабильно и вполне предсказуемо. Или в групповую политику этот параметр тоже от нечего делать добавили?
Slav, Poltergeyst: цитировать не буду. Скажу лишь, что окно можно свернуть, изменить размеры, сдвинуть за пределы экрана (и без помощи мыши). Topmost окна не означает наличие фокуса ввода. Влезть можно, как я уже писал, через интерфейс Common Dialog Controls: запускаем Блокнот, закрываем Проводник (\Пуск\Завершение работы, Ctrl-Alt-Shift+ЛКМ на кнопке «Отмена»), в Блокноте делаем \Файл\Открыть(Сохранить как), переходим в нужную папку, запускаем по контекстному меню Проводник или что там будет потребно.
В итоге опять всё сводится к слежению за приложениями, которое делается в данном случае отнюдь не слежением скриптами (что на ать-два с лёгкостью обходится переименованием), а по ссылке, указанной в посте #5.

OFF: Я никак не могу понять, почему именно имеющиеся стандартные средства вызывают такое отвращение и заставляют изобретать велосипед?

12

Re: VBScript: сценарий входа, выполнение только 1й программы

Temasik, это что ж за клавиатура такая? И как за ней можно работать?

13

Re: VBScript: сценарий входа, выполнение только 1й программы

Poltergeyst пишет:

Ну и как Вы намерены запустить Блокнот, если отсутствует интерфейс проводника,…

Блокнот упоминался только в качестве примера. Использоваться будет именно то приложение, с которым только и планируется работать.

Poltergeyst пишет:

…а также заблокирован запуск новых приложений(хоть через скрипт…

повторю ещё раз: переименованием исполняемого файла в имя того приложения, с которым только и планируется работать.

Poltergeyst пишет:

…хоть через стандартные средства по ссылке #5)

Именно этот вариант я и предлагаю использовать. С хэшэм бороться на порядок сложнее.

14

Re: VBScript: сценарий входа, выполнение только 1й программы

Переименуйся sol.exe в 1cv77.exe

Вот именно. Безо всяких заклинаний.

15

Re: VBScript: сценарий входа, выполнение только 1й программы

alexii пишет:

Использоваться будет именно то приложение, с которым только и планируется работать.

Действительно, этот момент как-то проскользнул в голове, а Вы здесь оказались правы - если приложение использует диалог открытия файла, то такой диалог являясь частью оболочки предоставит все её функции - можно переименовать sol.exe в 1cv77.exe и потихоньку наигрывать в карты, даже если сама оболочка отключена и включен фильтр на запуск определенных процессов. Что делать?

16

Re: VBScript: сценарий входа, выполнение только 1й программы

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

17

Re: VBScript: сценарий входа, выполнение только 1й программы

Штука не такая как Вы описали а очень приличная и красивая.
Операционная система Windows XP Pro. Программа СПС ГАРАНТ

18

Re: VBScript: сценарий входа, выполнение только 1й программы

Осмелюсь предположить, что такая терминальная программа - информационная доска вряд-ли использует диалог открытия файла. Скорее всего это просто таблица-сводка с базой данных, которая управляется клавишами Up, Down, Left, Right и Enter конечно же.

19

Re: VBScript: сценарий входа, выполнение только 1й программы

В том-то и дело, что программа не терминальная так бы проблем не было...
Слишком много вариантов, чтоб выбрать правильный...

20

Re: VBScript: сценарий входа, выполнение только 1й программы

Я тоже, пожалуй, цитировать не буду - хотя ох как хочется.

Подход TopMost предполагает, что в процессе работы в программе больше не открывается ни одного дочернего окна. Что я имею ввиду? Откройте WORD, сделайте его окно TopMost, a затем дайте команду Печать. Окно диалога вам уже не увидеть никогда, программа же перестала выполнять одну из своих функций.

Замену "обычной программы - оболочки" я обсуждать не буду. Никогда этого не делал сам и ни разу не видел человека, который бы реально это использовал. alexii, а Вы это реально (не в тестовом режиме) применяли? Было бы интересно услышать о столь уникальном опыте.

Повторю еще раз свою схему. Как только отслеживаемое окно перестает быть активным, оно тут же принудительно делается таковым. Пусть юзер хоть обзапускается игрушек или порнушек - через секунду рабочее окно все равно станет активным. Не очень-то захочешь играть в таком режиме.
Недостаток моего подхода может в критической ситуации стать достоинством. Я имею ввиду, что можно в ТаскМенеджере снять скрипт-монитор и работать как обычно. Но, во-первых, я предполагаю, что все-таки работает не сознательный шпион, а обычный пользователь. А во-вторых, именно это может потребоваться в нештатных ситуациях (прога зависла).
Как в предыдущих двух подходах - TopMost и "замена оболочки" - предполагается действовать в этой ситуации?

Спасибо, коллеги, за интересное обсуждение.

21 (изменено: Poltergeyst, 2009-07-23 17:11:19)

Re: VBScript: сценарий входа, выполнение только 1й программы

Резюмируя все вышесказанное можно поступить примерно по следующей схеме

- При запуске подавить процесс проводника.
- Проставить ограничение на запуск всех программ кроме заданной, через "Локальные параметры безопасности", как было рекомендовано alexii.
- Поставить СПС ГАРАНТ в автозагрузку
- Если интерфейс проводника отключен и в контексте экрана существует только одно окно, то это окно будет активным в любом случае. Задача сделать так, чтобы его нельзя было свернуть или переместить, дабы попросту не потерять. Для этого нужно изготовить небольшой скрипт, который будет периодически заставлять это окно отображаться в максимизированном состоянии - максимизированное окно занимает весь экран и его невозможно переместить за пределы области экрана. Даже если кто-то решит свернуть или нормализовать окно скрипт восстановит максимизированное состояние и не даст окну потерятся. Никакого TopMost здесь не надо.

22

Re: VBScript: сценарий входа, выполнение только 1й программы

Значит нужно подумать над скриптом, который:
1. При закрытии окна (выход из программы, запускает его снова;
2. При сворачивании делает его максимализированным.
Пункты с запуском других программ и прочее не актуально благодаря SteadyState.
Буду работать в этом направлении. Спасибо, что уберегли от решений, которые могли бы только добавить ненужных действий.

23

Re: VBScript: сценарий входа, выполнение только 1й программы

Slav пишет:

alexii, а Вы это реально (не в тестовом режиме) применяли?

Да. Никакого уникального опыта в этом нет. Обычная замена shell'а, коих превеликое множество. Примерно так же во времена Windows 3.1 менялся ProgMan на более удобный DashBoard. Начиная с Windows 95 (когда shell'ы под Windows, собственно, и начали плодиться как кролики) не пользую, поскольку насущной потребности не возникало и хватало стандартного shell'а.

Замену shell'а по рассматриваемому типу (на произвольное приложение) делал в качестве демонстрации.

Slav пишет:

Как … предполагается действовать в этой [«замена оболочки»] ситуации [«прога зависла»]?

Reset.

Про шпионов и прочее: при наличии головы, прямых рук, соответствующего оборудования и обеспечения, достаточного количества времени и физического доступа к системному блоку не спасают никакие меры.

24

Re: VBScript: сценарий входа, выполнение только 1й программы

Poltergeyst пишет:

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

Poltergeyst,

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

25

Re: VBScript: сценарий входа, выполнение только 1й программы

alexii пишет:

... Reset....

alexii,

неинтеллигентно.

26

Re: VBScript: сценарий входа, выполнение только 1й программы

Вот по политике на достаточно внятном русском: Применение политик ограниченного использования программ для защиты от несанкционированного программного обеспечения.

Update: Ещё: Политики ограниченного использования программ-Windows IT Pro.

Poltergeyst пишет:

Задача сделать так, чтобы его [окно] нельзя было свернуть или переместить, дабы попросту не потерять.

Оно не потеряется, поскольку при минимизации оно (при отсутствии Проводника) располагается пиктограммой заголовка в низу экрана, подобно тому, как сие было в приснопамятных Windows 2.0-3.11. Alt-Tab тоже пока никто не отменял (конечно, не в рассматриваемом случае, где на клавиатуре Alt отсутствует как таковой).

27

Re: VBScript: сценарий входа, выполнение только 1й программы

Slav пишет:

по моему опыту…

По моему — то, которое работает и в котором ты можешь разобраться .

28

Re: VBScript: сценарий входа, выполнение только 1й программы

Poltergeyst пишет:
alexii пишет:

Оно не потеряется, поскольку при минимизации оно (при отсутствии Проводника) располагается пиктограммой заголовка в низу экрана

У меня окно попросту исчезает будто бы его и не было никогда, однако Alt+Space, Alt+Tab помогает. Только какому пользователю терминала(банковскому хомячку) придет в голову размышлять об свернутом значке, и клавиатурной комбинации? Поэтому окно должно быть все время развернуто - по той простой причине, что решение рассчитано на пользователя (офисного хомячка), которого совершенно, наглухо неинтересуют никакие комбинации. Это тоже надо учитывать

Согласен.

29

Re: VBScript: сценарий входа, выполнение только 1й программы

Для терминалов пишутся соответствующие программы, причём использующие стандартные библиотеки в минимальнейшем объёме. Использовать в этом качестве стандартное приложение — это верх глупости или наивности. Надо бить разработчиков.

30

Re: VBScript: сценарий входа, выполнение только 1й программы

Poltergeyst пишет:

У меня окно попросту исчезает будто бы его и не было никогда

Сверните все окна (а поскольку у нас будет только одно… надеюсь, не забыли?) и будет видно.

31

Re: VBScript: сценарий входа, выполнение только 1й программы

alexii пишет:

Для терминалов пишутся соответствующие программы, причём использующие стандартные библиотеки в минимальнейшем объёме. Использовать в этом качестве стандартное приложение — это верх глупости или наивности. Надо бить разработчиков.

Это не для терминалов программа. Просто с помощью терминала появляется возможность найти человеку закон или еще что-либо бесплатно.

32

Re: VBScript: сценарий входа, выполнение только 1й программы

2Temasik: Ну, я и имел в виду подобный случай — native interface, так сказать. Или это попытка сподобить уже имеющееся приложение под случай «Лифт должен выдержать прямое попадание в кабину самого необученного академика»? Тогда, да, тут придётся работать с тем, что есть.

33

Re: VBScript: сценарий входа, выполнение только 1й программы

alexii пишет:

Сверните все окна (а поскольку у нас будет только одно… надеюсь, не забыли?) и будет видно.

У меня всего лишь одно единственное окно при отсутствующем проводнике(в чем собственно и заключается смысл). И при сворачивании оно пропадает из поля зрения полностью, восстанавливаясь лишь через Alt+Space, Alt+Tab. Ничего другого кроме курсора мышки и картинки на рабочем столе я не вижу. Резонный вопрос - для чего удалять проводник, если можно просто поддерживать окно приложения в активном состоянии, как это предлагает Slav? Дело в том что речь идет о решении для конечного пользователя, где не должно быть ничего лишнего и должно быть заблокировано все что можно заблокировать, где вся работа сводится к принципу "увидел - нажал". Представьте реакцию пользователя, решившего свернуть окно и на мгновение увидевшего там какие-то значки. "Чо? Это несерьезно! Да они тут дурят нас! Там у них значки, поиграть можно, а здесь все время окно выскакивает!" Поэтому если человек на мгновенье отодвинет окно, то кроме черного экрана с он не должен ничего видеть - тогда будет серьезно.

34

Re: VBScript: сценарий входа, выполнение только 1й программы

Poltergeyst это что-то у Вас не так. Окну некуда исчезать, поскольку этот функционал обеспечивают библиотеки Проводника. Я неоднократно такое проделывал, на многих машинах; проверял и теперь, прежде чем писать. Может быть это как-то связано выполнением Проводника в раздельных потоках (separate process в реестре)?

Poltergeyst пишет:

…если можно просто поддерживать окно приложения в активном состоянии, как это предлагает Slav? Дело в том что речь идет о решении для конечного пользователя, где не должно быть ничего лишнего и должно быть заблокировано все что можно заблокировать, где вся работа сводится к принципу "увидел - нажал". Представьте реакцию пользователя, решившего свернуть окно и на мгновение увидевшего там какие-то значки. "Чо? Это несерьезно! Да они тут дурят нас! Там у них значки, поиграть можно, а здесь все время окно выскакивает!" Поэтому если человек на мгновенье отодвинет окно, то кроме черного экрана с он не должен ничего видеть - тогда будет серьезно.

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

35

Re: VBScript: сценарий входа, выполнение только 1й программы

Poltergeyst пишет:

...
Представьте реакцию пользователя, решившего свернуть окно и на мгновение увидевшего там какие-то значки. "Чо? Это несерьезно! Да они тут дурят нас! Там у них значки, поиграть можно, а здесь все время окно выскакивает!" Поэтому если человек на мгновенье отодвинет окно, то кроме черного экрана с он не должен ничего видеть - тогда будет серьезно.

Poltergeyst,

Ответ 1 (юмористический): Вы может не помните - было время, когда проходили съезды КПСС и по всем программам шла его трансляция. Анек из того времени: Включает чел ТВ - там съезд. Переключает программу - там съезд. Переключает еще - там съезд. Переключает... А там сидит кгбшник и так строго говорит: "Я тебе попереключаю!"
Уберите все иконки с рабочего стола, а на стол положите картинку с лозунгом: "Юзер! Тебе же сказали - работать только в программе!"

Ответ 2 (технический): у меня сложилось впечатление, что Вы неплохо знакомы с API. Значит умеете делать callback на любые действия и производить свою обработку любого wm_ системы. Уж игнорировать wm_minimaze или wm_restore для конкретного окна не проблема.

Коллеги, меня несколько удивляет ваш подход - сделать из Мерса Запорожец. С решением всех проблем кнопкой Reset. Можно, наверно - токо зачем?

36

Re: VBScript: сценарий входа, выполнение только 1й программы

Slav пишет:

С решением всех проблем кнопкой Reset. Можно, наверно - токо зачем?

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

alexii пишет:
Slav пишет:

Как … предполагается действовать в этой [«замена оболочки»] ситуации [«прога зависла»]?

Reset.

37

Re: VBScript: сценарий входа, выполнение только 1й программы

alexii пишет:

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

alexii,

есть еще один тонкий момент.
Мы на форуме скриптовых языков и в условиях задачи - можно ли написать скрипт, реализующий поставленную цель. Я и обсуждаю возможность создания такого скрипта. В рамках системы, которая этот скрипт сможет выполнять.
А замену оболочки может более логично обсуждать где-нибудь на... OSZONE, например?
Или Вы при замене оболочки предусмотрите в своей интерпритатор VBS?

38

Re: VBScript: сценарий входа, выполнение только 1й программы

Slav пишет:

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

Ну и нормально. В чём проблема-то?! Я лишь указываю на недостаточность решения исключительно скриптами.
По поводу того, где и что обсуждать: кроме указанного Вами есть и ещё один тонкий момент: Как правильно задать вопрос, чтобы быть услышанным, § 4.10. [курсив мой]:

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

Slav пишет:

Или Вы при замене оболочки предусмотрите в своей интерпритатор VBS?

А какое отношение WSH имеет к shell'у?

39

Re: VBScript: сценарий входа, выполнение только 1й программы

Можно тогда задам более конкретный вопрос, а то глобальная задача заводит всех в тупик, т.к. имеет одно решение, но разными дорогами и никто не хочет идти одной, как камешек налево пойдешь и т.д. только у камешка вот я стою
я поискал по форуму и нашел только для AHK скрипт позволяющий убрать кнопки закрыть свернуть... как в VBS добиться аналогичного результата? а еще лучше, чтоб даже не было окна заголовка. Спасибо.
P.S.
У меня нет большого опыта и знаний программирования, пользуюсь скриптами и этим форумом для решения локальных прикладных задач.

40

Re: VBScript: сценарий входа, выполнение только 1й программы

Напрямую — никак. Можно получить аналогичный результат, используя сторонние библиотеки и те же операции, что в AHK, так что, не стоит даже и заморачиваться.

Подход, я думаю, у Вас верный. Я бы так и делал: скомпилированный скрипт на AHK/AutoIt, который загружается в качестве shell'а вместо Проводника. Этот скрипт запускает требуемое приложение, дожидается появления окна запущенного приложения, блокирует функции сворачивания/закрытия (и чего ещё потребуется); далее он следит за запущенным приложением (я не уверен насчёт закрытия, но можно в скрипте предусмотреть, что при закрытии отслеживаемого приложения происходит его повторный запуск из скрипта по вышеописанному варианту).

Правда, опять не очень понятно, что делать, если Ваше приложение (СПС ГАРАНТ) использует вышеуказанные Common Dialog Controls.

P.S. На всякий случай, для любителей поспорить насчёт кривости и глючности «подмены shell'а», добавлю, что аналогичным же образом реализуется сеанс на сервере терминалов с назначенным приложением в качестве задачи.

41

Re: VBScript: сценарий входа, выполнение только 1й программы

Я пробовал с помощью скрипта который есть на даном форуме убрать "кнопчки управления окном", но т.к. я в AHK полный нуб, то так и не понял, почему могу реализовать "деактивацию" кнопки "закрыть", но не могу "деактивировать кнопку "свернуть". С AHK мне нужно будет так сломать голову...

42

Re: VBScript: сценарий входа, выполнение только 1й программы

alexii пишет:

...
P.S. На всякий случай, для любителей поспорить насчёт кривости и глючности «подмены shell'а», добавлю, что аналогичным же образом реализуется сеанс на сервере терминалов с назначенным приложением в качестве задачи.

alexii,

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

Если это не совсем оффтоп, то прошу пояснить последнюю мысль. Отнюдь не спора ради, а исключительно с целью самообразования. Что собственно имеется ввиду?
Спасибо.

43

Re: VBScript: сценарий входа, выполнение только 1й программы

Temasik пишет:

так и не понял, почему могу реализовать "деактивацию" кнопки "закрыть", но не могу "деактивировать кнопку "свернуть".

Вот пример на АНК, который запускает Блокнот, ждёт появления его окна и деактивирует кнопку "Свернуть".

WS_MINIMIZEBOX = 0x20000

Run, notepad.exe
WinWait, Безымянный - Блокнот
WinSet, Style, -%WS_MINIMIZEBOX%, Безымянный - Блокнот

44

Re: VBScript: сценарий входа, выполнение только 1й программы

Slav пишет:

Если это не совсем оффтоп, то прошу пояснить последнюю мысль. Отнюдь не спора ради, а исключительно с целью самообразования. Что собственно имеется ввиду?

Доберусь до терминала, опишу подробно.

OFF:

Slav пишет:

если это камешек в мой огород - то напрасно.

Slav, разве я упоминал кого-то конкретно?

Slav пишет:

Подменяйте на здоровье что угодно чем угодно. Так жизнь приобретет новые краски - особенно для пользователей. Корячиться -то ведь им в конце концов.

Вы бы сами попробовали что ли, а то Вы пока как-то беспредметно рассуждаете (перед этим желательно заиметь какой-нибудь LiveCD, чтобы вернуть стандартный shell).

45

Re: VBScript: сценарий входа, выполнение только 1й программы

alexii пишет:

...
Вы бы сами попробовали что ли, а то Вы пока как-то беспредметно рассуждаете (перед этим желательно заиметь какой-нибудь LiveCD, чтобы вернуть стандартный shell).

alexii,

попробовал что именно?
Вы же не предлагаете - пока - ни одного конкретного скрипта, ни инструкции как заменить shell хотя бы обычным notepad.
Кстати, насчет LiveCD - это не мне совет надо давать, а тем, кто пойдет по предложенному Вами пути. Рекомендую включить в комплект еще и вазелин - если что-то серьезно сбойнет, LiveCD не окажется под рукой, и руководство захочет отметить Ваше решение. Шутко.
Да и еще - хотите я скажу как из того же notepad запустить что угодно? Вы эту проблему до сих пор не решили - а ведь уже 3-я страница темы.

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

VBS-скрипт:

'
' Неубиваемый блокнот
'

appExe = "notepad.exe"     '  старт приложения
appWndSufix = "- Блокнот"  '  суффикс окна приложения

Set objWord = CreateObject("Word.Application")
objWord.Documents.Add()

Set WshShell = WScript.CreateObject("WScript.Shell")

Do While True  '  глобальный цикл - повторный запуск если приложение будет закрыто

' запускаем приложение
WshShell.Run appExe

' ждем первого появления окна - хотя тут возможны нюансы
retVal = False
Do While not retVal
   retVal = objWord.Application.Run("CheckActiveWindow", appWndSufix)
Loop

' определяем наш Task
For Each objTask in objWord.Tasks
    if (InStr(1, objTask.Name, appWndSufix) > 1) then
       objTask.Activate         ' первый раз - нафсякей
       objTask.WindowState = 1  ' wdWindowStateMaximize
       Exit For
    End If
Next

On Error resume next  '  если приложение будет закрыто

' режим мониторинга
Do While True

  retVal = objWord.Application.Run("CheckActiveWindow", appWndSufix)
  if (not retVal) then objTask.Activate
  if (objTask.WindowState <> 1) then objTask.WindowState = 1  ' wdWindowStateMaximize

  if (Err.Number = 5825) then Exit Do  '  приложение было закрыто, номер ошибки для WINDOWS2000
  
  Wscript.Sleep 1000  ' опрос каждую секунду
Loop

Err.Clear
On Error Goto 0

Loop  '  глобальный цикл

' придумать критерий нормального выхода
Set WshShell = Nothing

objWord.Quit
Set objWord = Nothing

WScript.Echo "Приложение закрыто"

WScript.Quit 0

VBA-функция (сохранить в NORMAL.DOT):

Declare Function GetForegroundWindow Lib "user32" () As Long

Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" _
(ByVal hwnd As Long) As Long

Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long



Function CheckActiveWindow(ByVal TitleWindow As String) As Boolean
  Dim hwnd As Long
  Dim MyStr As String
  
  CheckActiveWindow = False
  
  hwnd = GetForegroundWindow
  If GetParent(hwnd) = 0 Then
     MyStr = String(GetWindowTextLength(hwnd) + 1, Chr$(0))
     GetWindowText hwnd, MyStr, Len(MyStr)
     If InStr(MyStr, TitleWindow) > 0 Then
        CheckActiveWindow = True
     End If
  End If

End Function

46

Re: VBScript: сценарий входа, выполнение только 1й программы

Slav пишет:

Да и еще - хотите я скажу как из того же notepad запустить что угодно? Вы эту проблему до сих пор не решили

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

Интересно, а что будет если окно основного приложения сделать дочерним по отношению к окну SysListView32 Рабочего стола (без удаления проводника, конечно-же)?

47

Re: VBScript: сценарий входа, выполнение только 1й программы

Совсем небольшое дополнение в программе повысит психологическую мотивацию пользователя даже не пытаться запустить что-нибудь, кроме основной проги. В том случае, если активное окно любое отличное от требуемого, то перед переключением название левого окна записывается в лог-файл. Также как и попытки закрыть программу.
На основании лога можно поинтересоваться у пользователя: "А зачем это Вы пытались несколько раз запустить игру?"

48

Re: VBScript: сценарий входа, выполнение только 1й программы

Вот так будет лучше - добавлено:
1. Ведение протокола.
2. Нормальное завершение (через реестр).

OneTask.vbs :

'
' Неубиваемый блокнот
'

Dim objTask

Const ForWriting = 2

appExe = "notepad.exe"     '  старт приложения
appWndSufix = "- Блокнот"  '  суффикс окна приложения
ParentWindow = "ParentWindow:"  '  префикс для идентификации что активное окно родительское
myHKCU = "HKEY_CURRENT_USER\Software\Slav\OneTask"

rootDir = Left(WScript.ScriptFullName, instrrev(WScript.ScriptFullName,"\"))

Set objWord = CreateObject("Word.Application")
objWord.Documents.Add()

Set WshShell = WScript.CreateObject("WScript.Shell")
' запрещаем пользователю выход из приложения
WshShell.RegWrite myHKCU & "\StopApplication", "0", "REG_DWORD"

Set objFSO = CreateObject("Scripting.FileSystemObject")
' файл протокола
Set myProtocol = objFSO.OpenTextFile(rootDir & "_Protocol.log", ForWriting, True)


Do While True  '  глобальный цикл - повторный запуск если приложение будет закрыто

' запускаем приложение
WshShell.Run appExe

' ждем первого появления окна - хотя тут возможны нюансы
retVal_str = "Start my program"
Do While True
   retVal_str = objWord.Application.Run("CheckActiveWindowStr", ParentWindow)
   if (InStr(1, retVal_str, ParentWindow) = 1) and (InStr(1, retVal_str, appWndSufix) > 1) then Exit Do
   Wscript.Sleep 1000  ' проверка каждую секунду
Loop

' режим мониторинга
Do While True

  retVal_str  = objWord.Application.Run("CheckActiveWindowStr", ParentWindow)
  retVal_bool = MyTask()

  if (InStr(1, retVal_str, ParentWindow) = 1) and (InStr(1, retVal_str, appWndSufix) < 1) then
     if retVal_bool then 
        myProtocol.WriteLine Now() & vbTab & retVal_str & vbCrLf
        objTask.Activate
     else
        Exit Do
     end if
  end if

  if retVal_bool then
     if (objTask.WindowState <> 1) then objTask.WindowState = 1  ' wdWindowStateMaximize
  end if

  Wscript.Sleep 1000  ' опрос каждую секунду
Loop

' проверка на разрешенное завершение приложения
  retVal = WshShell.RegRead(myHKCU & "\StopApplication") 
  if (retVal = 0) then 
     myProtocol.WriteLine Now() & vbTab & "Close application" & vbCrLf
  else
     Exit Do
  end if

Loop  '  глобальный цикл

' завершение работы приложения
myProtocol.Close
Set myProtocol = Nothing
Set objFSO = Nothing

Set WshShell = Nothing

objWord.Quit
Set objWord = Nothing

WScript.Echo "Приложение закрыто"

WScript.Quit 0

' *** функция определения нашего задания
Function MyTask()
  MyTask = False
  For Each objTask in objWord.Tasks
    if (InStr(1, objTask.Name, appWndSufix) >= 1) then
       MyTask = True
       Exit For
    End If
  Next
End Function

VBA-функция (включить в NORMAL.DOT) :

Declare Function GetForegroundWindow Lib "user32" () As Long

Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" _
(ByVal hwnd As Long) As Long

Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long



Function CheckActiveWindowStr(ByVal ParentWindow As String) As String
  Dim hwnd As Long
  Dim MyStr As String
  
  CheckActiveWindowStr = "ChildWindow"
  
  hwnd = GetForegroundWindow
  If GetParent(hwnd) = 0 Then
     MyStr = String(GetWindowTextLength(hwnd) + 1, Chr$(0))
     GetWindowText hwnd, MyStr, Len(MyStr)
     CheckActiveWindowStr = ParentWindow + MyStr
  End If

End Function

OneTask.reg : команда на выполнение regedit /s d:\script\onetask.reg.
Если этот reg-файл выполнен, то при закрытии приложения происходит нормальное завершение скрипта.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Slav\OneTask]
"StopApplication"=dword:00000001

49

Re: VBScript: сценарий входа, выполнение только 1й программы

По поводу приобрести мс офис только для скрипта не вариант, скрипт на АХК не подходит, т.к. обращается к названию окна, а оно динамичное, т.е. изменяется в процессе работы да и название у него не 2 слова

50

Re: VBScript: сценарий входа, выполнение только 1й программы

Так не обязательно к названию. Можно к классу окна или хэндлу. Насчёт двух слов вообще не понял. При чём тут количество слов?

51

Re: VBScript: сценарий входа, выполнение только 1й программы

Temasik пишет:

скрипт на АХК не подходит, т.к. обращается к названию окна, а оно динамичное, т.е. изменяется в процессе работы да и название у него не 2 слова

А что скажете насчёт класса окна (посмотреть можно с помощью «AU3_Spy.exe» из комплекта AutoHotKey или «Au3Info.exe» из комплекта AutoIt, а также многих прочих утилит, включая Microsoft Spy++, WinspectorU и т.п.)? Класс, надеюсь, постоянно не меняется (хотя бывает и так) или, хотя бы, имеет некую постоянную часть?

52

Re: VBScript: сценарий входа, выполнение только 1й программы

Temasik пишет:

По поводу приобрести мс офис только для скрипта не вариант...

Temasik,

действительно не стоит - для скрипта приобретать МС Офис.
Если Вы внимательно посмотрели для чего собственно нужен Офис в моем варианте - то только для легкого и прозрачного вызова API-функций. Вызвать их можно и без Офиса - написать свою DLL, например, на любом известном Вам языке (благо, теперь МС выкладывает бесплатные студии самых популярных языков). Вызов DLL затем производится rundll32.exe.

53

Re: VBScript: сценарий входа, выполнение только 1й программы

Temasik пишет:

...а оно динамичное, т.е. изменяется в процессе работы да и название у него не 2 слова

Temasik,

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