Инъекция зависимости служб Windows - PullRequest
0 голосов
/ 13 мая 2009

Есть ли способ установить зависимость одного "myWindowsService" от другого сервиса, работающего на той же машине, например, "SqlService"?

Проблема в том, что если вы не знаете имя «службы sql», где будет установлена ​​«myWindowsService», но моя служба зависит от того, что sql уже запущен ..

* 1005 спасибо *

Ответы [ 2 ]

0 голосов
/ 13 мая 2009

Если вы используете

sc create <service>
Синтаксис

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

sc create <service> depend= mssqlserver

Это также можно сделать автоматически, если вы используете классы ServiceInstaller. В свойствах этого контроллера есть область для определения зависимостей при запуске.

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

0 голосов
/ 13 мая 2009

Edit: Не правильно прочитал вопрос.

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


Используя ManagementObject, вы можете устанавливать зависимости (но вы должны знать название службы):

    bool SetServiceDependencies(string serviceName, string[] dependencies)
    {
        try
        {
            string objPath = string.Format("Win32_Service.Name='{0}'", serviceName);
            //Uses lazy initialization
            ManagementObject mmo = new ManagementObject(new ManagementPath(objPath));
            //Get properties to check if object is valid, if not then it throws a ManagementException
            PropertyDataCollection pc = mmo.Properties;
        }
        catch (ManagementException me)
        {   //Handle errors
            if (me.ErrorCode == ManagementStatus.NotFound) {
                //Service not found
            }
            return false;
        }
        try
        {   
            object[] wmiParams = new object[11];    //parameters for Win32_Service mmo object Change-parameters
            wmiParams[10] = dependencies;

            //Should we remove dependencies, use array containging 1 empty string
            if (dependencies == null || dependencies.Length == 0)
            {
                wmiParams[10] = new string[] { "" };
            }

            //Change dependencies
            string returnStatus = mWmiService.InvokeMethod("Change", wmiParams).ToString();
        }
        catch (Exception)
        {
            return false;
        }
        return true;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...