Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

Remote Install сервиса   Найти похожие ветки 

 
Chaser ©   (2007-05-07 14:43) [0]

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


 
Leonid Troyanovsky ©   (2007-05-07 14:53) [1]


> Chaser ©   (07.05.07 14:43)  

> Перерыл Интернет, но практически по этому вопросу ничего
> не нашел.

http://rsdn.rsdn.ru/?summary/2393.xml

--
Regards, LVT.


 
Rouse_ ©   (2007-05-07 14:53) [2]

Да очень просто. OpenSCManager("\\REMOTE_COMP_NAME"...
И дальше как обычно...


 
Chaser ©   (2007-05-07 15:18) [3]

ОК, благодарю за инфу.

ПС. Если будут еще варианты по теме, кидайте ссылки, не помешают.


 
Chaser ©   (2007-05-08 13:41) [4]

Статьи прочел, но не особо воткнул, как все-таки удаленно установить сервис?
Ведь для начала сервис нужно каким-то образом копировать на удаленную машину, затем запустить.
Как его туда копировать непонятно (
Нет ли исходников прилагающихся к статьям http://rsdn.rsdn.ru/?summary/2393.xml, но не на СИ, а на Delphi?


 
Rouse_ ©   (2007-05-08 15:44) [5]

Ты, собственно, что пишешь?


 
Chaser ©   (2007-05-08 16:06) [6]

Нужно написать софт (по работе), который бы устанавливал некие сервисы удаленно на сетевые машины.
Порылся в нете, но не информации ни примеров не нашел, т.е. по сервисам много чего есть, но по этой теме как то пусто.
Написал простой сервис для теста, а вот как его удаленно инсталлировать не ясно.
Может подскажешь подробнее как это делается, или хотябы этапы процесса установки?


 
Rouse_ ©   (2007-05-08 16:21) [7]

Имея права администратора на удаленной машине или права администратора домена, кописуешь сервер на удаленную машину, соединяешся с ее SCM и даешь ему команду на установку и запуск сервиса.
Если админских прав нет, то пишешь докладную начальнику, мол всвязи со служебной необходимостью прошу админа дать мне логин и пароль для учетки с админскими правами...


 
Chaser ©   (2007-05-08 16:29) [8]

В принципе понятно... но как копировать сервис на удаленную машину?
Каким способом, какая команда?


 
Rouse_ ©   (2007-05-08 16:40) [9]

Имея права админа, просто скопировать в удаленную папку. "Copy" с путем \\remote_comp_name\C$\temp\


 
Chaser ©   (2007-05-08 16:41) [10]

ОК, понял.
Сенькс за помощь.


 
VirEx ©   (2007-05-08 18:44) [11]

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.


 
Eraser ©   (2007-05-08 18:48) [12]

> OpenSCManager

будет работать только в домене, хе-хе )


 
Chaser ©   (2007-05-08 20:51) [13]


> VirEx ©   (08.05.07 18:44) [11]

Благодарю за пример!


 
Rouse_ ©   (2007-05-09 18:14) [14]


> VirEx ©   (08.05.07 18:44) [11]

Фига, ты действительно ставишь драйвер просто через SCM? Не боишся? :)


 
VirEx ©   (2007-06-28 20:36) [15]


>  [14] Rouse_ ©   (09.05.07 18:14)
>
> > VirEx ©   (08.05.07 18:44) [11]
>
> Фига, ты действительно ставишь драйвер просто через SCM?
> Не боишся? :)

это из диплома ;)



Страницы: 1 вся ветка

Текущий архив: 2008.02.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
2-1199798648
AntonUSAnoV
2008-01-08 16:24
2008.02.03
Помогите!


6-1179280426
Ш-К
2007-05-16 05:53
2008.02.03
Изменения в TWebBrowser


2-1200206885
Anion
2008-01-13 09:48
2008.02.03
Проблема запуска Delphi 6


15-1196091261
Космос
2007-11-26 18:34
2008.02.03
Проблема ИИ


2-1200012250
Abcdef123
2008-01-11 03:44
2008.02.03
Пробелы знаний DOSa