SQL Server服务不是由代码启动的

本文关键字:代码 启动 Server 服务 SQL | 更新日期: 2023-09-27 18:24:13

我需要一个自动运行的服务来启动机器上的SQL实例。到目前为止,一切都很好,我可以让它们都工作,但当我在装有Windows7的机器上运行时,我会收到一个错误1053(超时)。但将超时时间更改为180000,错误仍在继续。

我在Windows 10中执行相同的过程,并在SQL Express 2005、2008和2012的实例上100%运行。

我不能确定问题是否真的是Windows 7或SQL Server 2005,如果我手动启动进程,它会正常启动。

代码:

public static bool StartServices()
{
    try
    {
        bool startedWithSuccess = false;
        foreach (var servico in GetInstances())
        {
            using (servico)
            {
                if (servico.Status != ServiceControllerStatus.Running
                    && servico.Status != ServiceControllerStatus.StartPending)
                {
                    servico.Start();
                    startedWithSuccess = TimeoutHelper.RetryUntilSuccessOrTimeout(() =>
                    {
                        servico.Refresh();
                        return servico.Status != ServiceControllerStatus.Running ? false : true;
                    }, TIMEOUT_IN_MILLISECONS);
                }
                else
                {
                    startedWithSuccess = true;
                }
            }
        }
        return startedWithSuccess;
    }
    catch (Exception)
    {
        throw new SqlServerStartServiceException();
    }
}
public static ServiceController[] GetInstances()
{
    ServiceController[] services = ServiceController.GetServices().Where(x => x.ServiceName.Contains("SQL")).ToArray();
    var lista = services.Where(x => x.DisplayName.Contains("Agent") ||
                                        x.DisplayName.Contains("Browser") ||
                                        x.DisplayName.Contains("VSS") ||
                                        x.DisplayName.Contains("Active")).ToArray();
        return services.Except(lista).ToArray();
}

使用cmdnet start xxxx命令也可以。

SQL Server服务不是由代码启动的

mcs将以您的用户身份运行,这与此服务运行的用户身份不同。导航到服务,右键单击>属性,并将用户从本地计算机更改为具有访问权限的用户。试试你的用户,看看这是否有效,而不是安全问题。technet

我解决了在服务中插入依赖项的问题。

this.serviceInstaller.ServicesDependedOn = SqlServerServiceHelper.GetInstances().Select(x => x.ServiceName).ToArray();

public static ServiceController[] GetInstances()
{
     ServiceController[] services = ServiceController.GetServices().Where(x => x.ServiceName.Contains("SQL")).ToArray();
     var servicesToRemove = services.Where(x => x.DisplayName.Contains("Agent") ||
                                           x.DisplayName.Contains("Browser") ||
                                           x.DisplayName.Contains("VSS") ||
                                           x.DisplayName.Contains("Active")).ToArray();
     return services.Except(servicesToRemove).ToArray();
}