![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Remote Install сервиса [D7, WinXP]
Chaser © (2007-05-07 14:43:00)Написал простенький сервис.
Теперь хочу создать функцию Remote Install для этого сервиса (удаленная установка сервиса, как это реализовано в некоторых программах удаленного администрирования).
Перерыл Интернет, но практически по этому вопросу ничего не нашел.
Если у кого-нибудь есть примеры кода или хотя бы какая-то информация как можно реализовать Remote Install, буду благодарен за любую помощь по этому вопросу.
VirEx (2007-06-28 20:36:00) [1]
> [14] Rouse_ © (09.05.07 18:14)
>
> > VirEx © (08.05.07 18:44) [11]
>
> Фига, ты действительно ставишь драйвер просто через SCM?
> Не боишся? :)
это из диплома ;)
Rouse_ (2007-05-09 18:14:00) [2]
> VirEx © (08.05.07 18:44) [11]
Фига, ты действительно ставишь драйвер просто через SCM? Не боишся? :)
Chaser (2007-05-08 20:51:00) [3]
> VirEx © (08.05.07 18:44) [11]
Благодарю за пример!
Eraser (2007-05-08 18:48:00) [4]> OpenSCManager
будет работать только в домене, хе-хе )
VirEx (2007-05-08 18:44:00) [5]program SCMTestApp;
{$APPTYPE CONSOLE}
uses
SysUtils,
Winsvc, //для работы с сервисами
Windows; //для распознавания ошибок
//===================================================
// далее идут вспомогательные процедуры и функции
//
//установка драйвера
function InstallDriver(scm :SC_HANDLE;DrvName,DrvPath:PChar):string;
var
Service:SC_HANDLE;
begin
//создаем сервис
Service:=CreateService(scm, //дескриптор создаваемого сервиса
DrvName, //имя сервиса (для системы)
DrvName, //имя сервиса для вывода на экран
SERVICE_ALL_ACCESS, //тип доступа (полный)
SERVICE_KERNEL_DRIVER, //тип сервиса (драйвер)
SERVICE_DEMAND_START, //тип запуска (по опросу)
SERVICE_ERROR_NORMAL, //реакция системы на ошибку
DrvPath, //путь к *.sys файлу
nil,nil,nil,nil,nil); //здесь не используются
if scm<>0 then result:='Install driver OK' else
//вывод ошибок
case GetLastError of
ERROR_ACCESS_DENIED: result:='ERROR_ACCESS_DENIED';
ERROR_CIRCULAR_DEPENDENCY: result:='ERROR_CIRCULAR_DEPENDENCY';
ERROR_DUP_NAME: result:='ERROR_DUP_NAME';
ERROR_INVALID_HANDLE: result:='Driver fail install';
ERROR_INVALID_NAME: result:='ERROR_INVALID_NAME';
ERROR_INVALID_PARAMETER: result:='ERROR_INVALID_PARAMETER';
ERROR_INVALID_SERVICE_ACCOUNT: result:='ERROR_INVALID_SERVICE_ACCOUNT';
ERROR_SERVICE_EXISTS: result:='Driver already install';
end;
//закрываем сервис
CloseServiceHandle(Service);
end;
//удаление драйвера
function RemoveDriver(scm :SC_HANDLE;DrvName:PChar):string;
var
Service:SC_HANDLE;
begin
//открываем сервис
Service:=OpenService(scm,DrvName,SERVICE_ALL_ACCESS);
if Service=0 then result:='Driver not install' else
if DeleteService(Service) then result:='Driver remove OK';
//закрываем сервис
CloseServiceHandle(Service);
end;
//запуск драйвера
function StartDriver(scm :SC_HANDLE;DrvName:PChar):string;
var
Service:SC_HANDLE;
arg:PChar;
begin
arg:=nil;
//открываем сервис
Service:=OpenService(scm,DrvName,SERVICE_ALL_ACCESS);
if Service=0 then result:='Driver not install' else
if StartService(Service,0,arg) then result:='Driver start OK' else
//вывод ошибок
case GetLastError of
ERROR_INVALID_HANDLE: result:='ERROR_INVALID_HANDLE';
ERROR_PATH_NOT_FOUND: result:='ERROR_PATH_NOT_FOUND';
ERROR_SERVICE_ALREADY_RUNNING:result:='Driver already start';
ERROR_SERVICE_DATABASE_LOCKED:result:='ERROR_SERVICE_DATABASE_LOCKED';
ERROR_SERVICE_DEPENDENCY_DELETED: result:='ERROR_SERVICE_DEPENDENCY_DELETED';
ERROR_SERVICE_DEPENDENCY_FAIL:result:='ERROR_SERVICE_DEPENDENCY_FAIL';
ERROR_SERVICE_DISABLED: result:='ERROR_SERVICE_DISABLED';
ERROR_SERVICE_LOGON_FAILED: result:='ERROR_SERVICE_LOGON_FAILED';
ERROR_SERVICE_MARKED_FOR_DELETE: result:='ERROR_SERVICE_MARKED_FOR_DELETE';
ERROR_SERVICE_NO_THREAD: result:='ERROR_SERVICE_NO_THREAD';
ERROR_SERVICE_REQUEST_TIMEOUT:result:='ERROR_SERVICE_REQUEST_TIMEOUT';
end;
//закрываем сервис
CloseServiceHandle(Service);
end;
//остановка драйвера
function StopDriver(scm :SC_HANDLE;DrvName:PChar):string;
var
Service:SC_HANDLE;
ServStatus:TServiceStatus;
begin
//открываем сервис
Service:=OpenService(scm,DrvName,SERVICE_ALL_ACCESS);
if Service=0 then result:='Driver not install' else
if ControlService(Service,SERVICE_CONTROL_STOP,ServStatus) then result:='Driver stop OK' else
//вывод ошибок
case GetLastError of
ERROR_INVALID_HANDLE: result:='ERROR_INVALID_HANDLE';
ERROR_ACCESS_DENIED: result:='ERROR_ACCESS_DENIED';
ERROR_DEPENDENT_SERVICES_RUNNING:result:='ERROR_DEPENDENT_SERVICES_RUNNING';
ERROR_INVALID_SERVICE_CONTROL: result:='ERROR_INVALID_SERVICE_CONTROL';
ERROR_SERVICE_CANNOT_ACCEPT_CTRL:result:='ERROR_SERVICE_CANNOT_ACCEPT_CTRL';
ERROR_SERVICE_NOT_ACTIVE: result:='Driver already stopped';
ERROR_SERVICE_REQUEST_TIMEOUT: result:='ERROR_SERVICE_REQUEST_TIMEOUT';
end;
//закрываем сервис
CloseServiceHandle(Service);
end;
//помощь о командах
procedure Help;
begin
Writeln('-------------------------------');
Writeln('|Test drivers from SCM meneger|');
Writeln('-------------------------------');
Writeln('Commands:');
Writeln('1 - Install driver');
Writeln('2 - Start driver');
Writeln('3 - Stop driver');
Writeln('4 - Remove driver');
Writeln('99 - exit');
Writeln('-------------------------------');
end;
//
// вспомогательные процедуры и функции заканчиваются здесь,
// далее идёт главная процедура программы
// (в языке C/C++ она называется Main)
//===================================================
var
i:integer;
scm_:SC_HANDLE;//дескриптор SCM менеждера
status:string; //строка статуса (для вывода)
begin
//запуск SCM менеждера
scm_:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
if scm_<>0 then WriteLn('SCM Manager start OK')//успешный запуск
else begin
WriteLn('SCM Manager start fail');//показываем ошибку на экране
readln;// до ввода любого символа
exit; // выход из программы
end;
status:='';
Help; // выводим меню команд при старте
repeat
//цикл, до тех пор, пока не будет
//введена цифра 99
begin
readln(i);// запоминаем код команды
Help; // выводим меню команд после ввода команды
case i of
//команды
1: status:=InstallDriver(scm_,'Example','D:\Example\objchk_wxp_x86\i386\Example.sys ');
2: status:=StartDriver (scm_,'Example');
3: status:=StopDriver (scm_,'Example');
4: status:=RemoveDriver (scm_,'Example');
end;
Writeln('Driver status='+Status);//статус результата команды
Write('>'); //командное приглашение
end;
until i=99;
//останавливаем SCM менеждер
CloseServiceHandle(scm_);
end.
Chaser (2007-05-08 16:41:00) [6]ОК, понял.
Сенькс за помощь.
Rouse_ (2007-05-08 16:40:00) [7]Имея права админа, просто скопировать в удаленную папку. "Copy" с путем \\remote_comp_name\C$\temp\
Chaser (2007-05-08 16:29:00) [8]В принципе понятно... но как копировать сервис на удаленную машину?
Каким способом, какая команда?
Rouse_ (2007-05-08 16:21:00) [9]Имея права администратора на удаленной машине или права администратора домена, кописуешь сервер на удаленную машину, соединяешся с ее SCM и даешь ему команду на установку и запуск сервиса.
Если админских прав нет, то пишешь докладную начальнику, мол всвязи со служебной необходимостью прошу админа дать мне логин и пароль для учетки с админскими правами...
Chaser (2007-05-08 16:06:00) [10]Нужно написать софт (по работе), который бы устанавливал некие сервисы удаленно на сетевые машины.
Порылся в нете, но не информации ни примеров не нашел, т.е. по сервисам много чего есть, но по этой теме как то пусто.
Написал простой сервис для теста, а вот как его удаленно инсталлировать не ясно.
Может подскажешь подробнее как это делается, или хотябы этапы процесса установки?
Rouse_ (2007-05-08 15:44:00) [11]Ты, собственно, что пишешь?
Chaser (2007-05-08 13:41:00) [12]Статьи прочел, но не особо воткнул, как все-таки удаленно установить сервис?
Ведь для начала сервис нужно каким-то образом копировать на удаленную машину, затем запустить.
Как его туда копировать непонятно (
Нет ли исходников прилагающихся к статьям http://rsdn.rsdn.ru/?summary/2393.xml, но не на СИ, а на Delphi?
Chaser (2007-05-07 15:18:00) [13]ОК, благодарю за инфу.
ПС. Если будут еще варианты по теме, кидайте ссылки, не помешают.
Leonid Troyanovsky (2007-05-07 14:53:00) [14]
> Chaser © (07.05.07 14:43)
> Перерыл Интернет, но практически по этому вопросу ничего
> не нашел.
http://rsdn.rsdn.ru/?summary/2393.xml
--
Regards, LVT.
Rouse_ (2007-05-07 14:53:00) [15]Да очень просто. OpenSCManager('\\REMOTE_COMP_NAME'...
И дальше как обычно...