Windows服务依赖注入

时间:2009-05-13 10:37:17

标签: c# .net windows-services

有没有办法将一个“myWindowsService”的依赖关系设置为在同一台机器上运行的另一个服务,例如“SqlService”?

问题是,如果您不知道将安装“myWindowsService”的“sql服务”的名称,但我的服务依赖于sql已经在运行..

感谢名单

2 个答案:

答案 0 :(得分:0)

编辑: 没有正确阅读问题。

解决方法(不是最优雅的解决方案)是针对具有已知实例名称的已知白名单枚举所有服务。


使用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;
    }

答案 1 :(得分:0)

如果您正在使用

sc create <service>

语法,您可以为此提供其他服务,这将使您安装的服务依赖于正在启动的服务。

sc create <service> depend= mssqlserver

如果您使用的是ServiceInstaller类,也可以自动完成。该控制器的属性中有一个区域用于定义启动依赖项。

我知道你说你可能不知道其他服务的名称,但更改依赖关系也很简单。