Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Контроль запуска и права админа/системы |
Автор: Romero 24.2.2006, 07:43 |
Имеется программа, умеющая сидеть в трее и выводить окно, когда нужно. По определенному событию она запускает exe-шник или cmd-шник, которому нужен доступ к запрещенным для пользователя папкам на NTFS-разделе. Соответственно, хотелось бы запускать программу с правами системы или админа. Кроме того нужно обеспечить надежность в плане постоянного контроля, запущена ли прога. Если каким-либо образом запустить exe от имени администратора, то пользователю проблематично будет убить процесс, но нет страховки от какой-нибудь ошибки, закрывающей программу. Можно написать сервис, который потом и запускает нужный exe-шник, и время от времени контролирует его присутствие. Например, как у большинства антивирусов и файерволов, запускается служба, которая далее подгружает все его компоненты. Есть варианты? Кто сталкивался с подобным, напишите, как решили. Если остановиться на варианте с сервисом (а он мне больше нравится), то хотелось бы уяснить схему действия. Правильно ли я понимаю: 1) служба - программа, имеющая специальные функции взаимодействия с менеджером служб; 2) при помощи этих функций она регистрируется, запускается и управляется из менеджера; 3) службу нельзя остановить с правами простого юзера; 4) если служба породит процесс, то он получит ее права (по-умолчанию - системные) и сможет оперировать с папками раздела NTFS, на которые есть права у SYSTEM; 5) моя служба должна при первом запуске вызвать функцию, регистрирующую ее, а затем автоматом будет подгружаться системой из той же папки и стартовать при помощи функции запуска. |
Автор: Marlin 24.2.2006, 08:24 | ||||||
Есть команда в винде RUNAS, которая может запустить программу с правами администратора, если ты укажешь пароль. Далее
А потом нужно организовать контроль за программой контроля, которая контролирует программу - чушь Пиши одну программу, и запиши ее в реестр как службу и все. Конечно она может закрыться, как ты говоришь, но это зависти от того как ты будешь ее писать, если ее занести в реестр правильно то по-моему пользователь даже в диспечере задач ее не увидит. Я не помню точно, давно код тестил. А программу лучше напиши в DLL, пусть весит в памяти.
Если интересно, что это за ключи в реестре почитай Windows |
Автор: Romero 24.2.2006, 08:35 |
RunAs не подходит, так как в 2000 винде нельзя запомнить пароль, введенный однажды. А каждый раз его вводить - не дело. Саму службу, насколько я понимаю, не нужно контролировать - на то и менеджер служб. Она сама по себе не вылетит. Тот способ, что ты мне написал, позволит запустить любую прогу как сервис? Что-то сомнительно... Зачем тогда столь сложные механизмы создания сервисов на Дельфях описываются в инете и в DRKB? Можно ссылку на источник сего чудесного способа? |
Автор: Marlin 24.2.2006, 08:44 | ||
Это что-то вроде облегченного варианта! А что тебе мешает, чтобы dll вела контроль за всем? Например с помощью таймеров и различных проверок осуществляет запуск твоей программы. Опять же через RunAs а пароли можешь, складывать куда-нибудь и шифровать, а когда необходимо считывать А если RunAs не подходит, ищи в инете статьи по получению прав админа. |
Автор: Romero 24.2.2006, 08:57 |
Думаю, проще использовать механизмы, описанные здесь: =htp://www.delphiworld.narod.ru/base/services_work.html или здесь: =http://www.delphiworld.narod.ru/base/create_services_api.html Скажите мне только, правильно ли я понимаю схему действия. |
Автор: Marlin 24.2.2006, 09:09 |
Ну принципе там все доступно излагается, и пункты, которые ты описал тоже верны, единственное, служба породит скорее поток, а не процесс. |
Автор: Romero 27.2.2006, 16:18 | ||
Вот такой код сделал (переписал какой-то примерчик из инета):
Вроде, работает. Только вот не знаю пока, насколько это решит проблему "самопроизвольной" выгрузки процесса (если служба запускается от имени системы в сеансе обычного пользователя). Буду тестировать. По крайней мере, решен вопрос запуска от имени системы! |
Автор: Romero 4.3.2006, 15:04 | ||
Помогите, плиззз. В вышеуказанном коде нужно сделать поправку, чтобы после инсталяции сервис стартовал сразу. Пробовал сделать в 185 строке if not (Install and SvcNotifyIsRunning) then ShowMsg(SysErrorMessage(GetLastError)); но получил ошибку о неверном дескрипторе. Что не так?
|
Автор: Romero 4.3.2006, 17:14 |
Сделал при помощи StartService |