Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нид хелп в сервисах, Об "ручной" установки сервисов 
:(
    Опции темы
ZeroMem
Дата 5.1.2007, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 24.8.2004
Где: Комсомольск-на-Ам уре

Репутация: нет
Всего: нет



Уф... Прива всем! Прошу не бить ногамт smile Сильно smile

Дело вот в чем. На .NET я новичек, как бы приглядывал сверху, но глубоко не копался. И вот сейчас встала такая вот у меня проблема. Я не совсем понимаю, как можно произвести "ручную" установку сервиса в C#. То есть если бы я писал на C++ это, то в момент обнаружения того, что моего сервиса просто нету в БД SCM при запуске программы/, выполнися примерно следующий псевдокод:

void InstallService()
{
    [Открыть SCM базу данных и проверить права пользователся на добавление]
    [Заполнить необходимые структуры]
    [Непосредственно вызвать CreateService и обработать ошибки]
    [сделать очистку]
}

как почитал на форуме тут, я бы хотел обойтись без средств WMI. Полностью. Хотя как я понял, .NET капец к ним сильно привязана... (((. Даже частоту проца и то через кучу абстракций искать приходится... эхь... а так всего несколько ассемблерных вставок и готово))) 
ЗЫ. Извините за флуд.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 5.1.2007, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Запихнуть утилиту InstallUtil.exe в ресурсы, распаковывать её в Temp и оттуда запускать для установки сервиса smile


--------------------
user posted image
PM MAIL WWW   Вверх
tol05
Дата 5.1.2007, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Может я что-то недопонял (стиль изложения проблемы не из простых), но предлагаю соорудить класс  иснталлятора (типа MyDreamInstaller), порожденный от System.Configuration.Install.Installer.
Включить в него ServiceProcessInstaller и ServiceInstaller. Дальше - по мануалу.
В итоге вызвать MyDreamInstaller.Install()


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
ZeroMem
Дата 5.1.2007, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 24.8.2004
Где: Комсомольск-на-Ам уре

Репутация: нет
Всего: нет



По документации, она сама использует классы ServiceInstaller и ServiceProcessInstaller... так что решение должно быть. Они смогли, значит и мы можем. Кстати, не понимаю толком в чем разница между этими классами...   smile

Добавлено @ 19:07 
tol05, любопытно... была такая мысль. Сейчас посмотрим.

Добавлено @ 19:10 
Сюда же вопрос: через этот класс я смогу спокойно удалить сервис?

Добавлено @ 19:18 
Хм... интересно...
MyDreamInstaller.Install() по-идее должен принимать еще параметр IDictionary stateSaver. Вот это меня с толку сбило.

PM MAIL ICQ   Вверх
Stepan_Lameroff
Дата 5.1.2007, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 164
Регистрация: 16.12.2006

Репутация: 9
Всего: 14



Код


using System;
using System.Runtime.InteropServices;

namespace ServiceInstaller
{
    class DirectServiceInstaller
    {
        #region DLLImport
        [DllImport("advapi32.dll")]
        public static extern IntPtr OpenSCManager(string lpMachineName,string lpSCDB, int scParameter);
        
        [DllImport("Advapi32.dll")]
        public static extern IntPtr CreateService(IntPtr SC_HANDLE,string lpSvcName,string lpDisplayName,
            int dwDesiredAccess,int dwServiceType,int dwStartType,int dwErrorControl,string lpPathName,
            string lpLoadOrderGroup,int lpdwTagId,string lpDependencies,string lpServiceStartName,string lpPassword);
            
        [DllImport("advapi32.dll")]
        public static extern void CloseServiceHandle(IntPtr SCHANDLE);
        
        [DllImport("advapi32.dll")]
        public static extern int StartService(IntPtr SVHANDLE,int dwNumServiceArgs,string lpServiceArgVectors);
  
        [DllImport("advapi32.dll",SetLastError=true)]
        public static extern IntPtr OpenService(IntPtr SCHANDLE,string lpSvcName,int dwNumServiceArgs);
        
        [DllImport("advapi32.dll")]
        public static extern int DeleteService(IntPtr SVHANDLE);
 
        [DllImport("kernel32.dll")]
        public static extern int GetLastError();
        #endregion DLLImport
/*
        #region test
        [STAThread]
        static void Test(string[] args)
        {
    
            // TODO: Add code to start application here
    
    
            #region Testing
            //  Testing --------------
            string svcPath;
            string svcName;
            string svcDispName;
     
            //path to the service that you want to install
            svcPath = @"C:\build\service\Debug\Service.exe";
            svcDispName="Service Display Name";
            svcName= "Service Name";
 
            DirectServiceInstaller c = new DirectServiceInstaller();
            c.InstallService(svcPath, svcName, svcDispName);
 
            Console.Read();
            #endregion Testing
        }
        #endregion test - Commented
*/
        /// <summary>
        /// Installs and runs service.
        /// </summary>
        /// <param name="svcPath">Full path of the service.</param>
        /// <param name="svcName">Name of the service.</param>
        /// <param name="svcDispName">Display name of the service.</param>
        /// <returns></returns>
        public bool InstallService(string svcPath, string svcName, string svcDispName)
        {
            #region Constants declaration.
            int SC_MANAGER_CREATE_SERVICE = 0x0002;
            int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
            //int SERVICE_DEMAND_START = 0x00000003;
            int SERVICE_ERROR_NORMAL = 0x00000001;
 
            int STANDARD_RIGHTS_REQUIRED       = 0xF0000;
            int SERVICE_QUERY_CONFIG           = 0x0001;
            int SERVICE_CHANGE_CONFIG          = 0x0002;
            int SERVICE_QUERY_STATUS           = 0x0004;
            int SERVICE_ENUMERATE_DEPENDENTS   = 0x0008;
            int SERVICE_START                  = 0x0010;
            int SERVICE_STOP                   = 0x0020;
            int SERVICE_PAUSE_CONTINUE         = 0x0040;
            int SERVICE_INTERROGATE            = 0x0080;
            int SERVICE_USER_DEFINED_CONTROL   = 0x0100;
 
            int SERVICE_ALL_ACCESS             =  (STANDARD_RIGHTS_REQUIRED     |
                SERVICE_QUERY_CONFIG         |
                SERVICE_CHANGE_CONFIG        |
                SERVICE_QUERY_STATUS         |
                SERVICE_ENUMERATE_DEPENDENTS |
                SERVICE_START                |
                SERVICE_STOP                 |
                SERVICE_PAUSE_CONTINUE       |
                SERVICE_INTERROGATE          |
                SERVICE_USER_DEFINED_CONTROL);
            int SERVICE_AUTO_START = 0x00000002;
            #endregion Constants declaration.
 
            try
            {
                IntPtr  sc_handle = OpenSCManager(null,null,SC_MANAGER_CREATE_SERVICE);
 
                if (sc_handle.ToInt32() != 0)
                {
                    IntPtr sv_handle = CreateService(sc_handle,
                        svcName,
                        svcDispName,
                        SERVICE_ALL_ACCESS,
                        SERVICE_WIN32_OWN_PROCESS, 
                        SERVICE_AUTO_START,
                        SERVICE_ERROR_NORMAL,
                        svcPath,
                        null,
                        0,
                        null,
                        null,
                        null);
 
                    if(sv_handle.ToInt32() == 0)
                    {
 
                        CloseServiceHandle(sc_handle);
                        return false;
                    }
                    else
                    {
                        //now trying to start the service
                        int i = StartService(sv_handle, 0, null);
                        // If the value i is zero, then there was an error starting the service.
                        // note: error may arise if the service is already running or some other problem.
                        if (i == 0)
                        {
                            //Console.WriteLine("Couldnt start service");
                            return false;
                        }
                        //Console.WriteLine("Success");
                        CloseServiceHandle(sc_handle);
                        return true;
                    }
                }
                else
                    //Console.WriteLine("SCM not opened successfully");
                    return false;
 
            }
            catch (Exception)
            {}
        }
 
  
        /// <summary>
        /// Uninstalls service.
        /// </summary>
        /// <param name="svcName">Name of the service to uninstall.</param>
        public bool UnInstallService(string svcName)
        {
            int GENERIC_WRITE = 0x40000000;
            IntPtr sc_hndl = OpenSCManager(null,null,GENERIC_WRITE);
 
            if(sc_hndl.ToInt32() !=0)
            {
                int DELETE = 0x10000;
                IntPtr svc_hndl = OpenService(sc_hndl,svcName,DELETE);
                //Console.WriteLine(svc_hndl.ToInt32());
                if(svc_hndl.ToInt32() !=0)
                { 
                    int i = DeleteService(svc_hndl);
                    if (i != 0)
                    {
                        CloseServiceHandle(sc_hndl);
                        return true;
                    }
                    else
                    {
                        CloseServiceHandle(sc_hndl);
                        return false;
                    }
                }
                else
                    return false;
            }
            else
                return false;
        }
    }
}


PM MAIL   Вверх
ZeroMem
Дата 7.1.2007, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 24.8.2004
Где: Комсомольск-на-Ам уре

Репутация: нет
Всего: нет



Все бы да хорошо, но я как раз искалл более простой метод установки, чем через WinAPI. Понимаете, уже как бы разобрался практически во всем. Только одного не могу понять: в Installer.Install там функция принимает параметр типа IDictionary для временного сохранения информации об установочных параметрах дабы потом моно было откатить все изменения. Вопрос в том, что ну не могу найим какой класс можно использовать для этого дела! Ну хоть ты тресни! smile  smile  smile  Hashtable пробовал - не помогло. Свой писать - не хочется  smile тоже (((.
PM MAIL ICQ   Вверх
mr.DUDA
Дата 7.1.2007, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Цитата(ZeroMem @  7.1.2007,  19:04 Найти цитируемый пост)
 Вопрос в том, что ну не могу найим какой класс можно использовать для этого дела! Ну хоть ты тресни!       Hashtable пробовал - не помогло. Свой писать - не хочется   тоже (((.

Как насчёт Dictionary<object, object> ?


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0716 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.