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();
}
使用cmd和net start xxxx命令也可以。
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();
}