【问题标题】:Executing sc.exe from .NET Process unable to start and stop service从 .NET 进程执行 sc.exe 无法启动和停止服务
【发布时间】:2009-07-31 12:20:32
【问题描述】:

我正在尝试从远程计算机重新启动服务。这是我的代码。问题是我需要输入startinfo.filename = "sc.exe",因为我输入的是"start /wait sc",这会导致错误。这是我的代码,任何想法。另外,如果有人知道如何在运行后保持 cmd 窗口打开,那么我可以看到运行的代码会很棒。

string strCommandStop1;
string strCommandStop2;
string strCommandStart1;
string strCommandStart2;
string strServer = "\\" + txtServerName.Text;
string strDb1 = "SqlAgent$" + txtInsName.Text;
string strDb2 = "MSSQL$" + txtInsName.Text;

strCommandStop1 = @"start /wait sc " + strServer + " Stop " + strDb1;
strCommandStop2 = @"start /wait sc " + strServer + " Stop " + strDb2;
strCommandStart1 = @"start /wait sc " + strServer + " Start " + strDb2;
strCommandStart2 = @"start /wait sc " + strServer + " Start " + strDb1;

try
{
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.CreateNoWindow = true;

    startInfo.Arguments = strCommandStop1;
    startInfo.Arguments = strCommandStop2;
    startInfo.Arguments = strCommandStart1;
    startInfo.Arguments = strCommandStart2;
    startInfo .FileName = "sc.exe";

    Process.Start(startInfo);

}
catch (Exception e)
{
    MessageBox.Show(e.Message);
}

【问题讨论】:

  • 为什么不使用 SMO 来执行此操作,或者至少使用 System.ServiceProcess.ServiceController 类?
  • 另外,我建议你养成使用e.ToString() 而不是e.Message 的习惯。这样你丢失的信息更少。

标签: sql-server windows-services restart


【解决方案1】:

为什么不使用ServiceController 类?这样您就可以更好地控制正在发生的事情。

【讨论】:

    【解决方案2】:

    “start”是cmd.exe shell中的固有命令,所以使用cmd.exe作为文件名;

    ProcessStartInfo si = new ProcessStartInfo();
    si.CreateNoWindow = true;
    si.Arguments = "/c start /wait sc.exe " + server + " Stop " + database;
    si.FileName = "cmd.exe";
    Process.Start(si);
    

    此外,您对 Arguments 属性的连续重新分配看起来很奇怪。您需要为要执行的每个命令行调用 Process.Start。

    【讨论】:

      【解决方案3】:

      我认为您的问题是您的 startInfo 对象将实际调用:

      sc.exe start /wait sc <strServer> Start <strDb1>
      

      另外,您是否有特殊要求必须使用 sc 而不是使用 System.ServiceProcess 库中的 ServiceController 类?

      【讨论】:

        【解决方案4】:

        感谢所有与我一起使用 ServiceController 类的人,这让一切变得如此简单。感谢你的帮助。 J

        【讨论】:

          【解决方案5】:

          如果您使用 cmd /k 并且没有似乎打开新 cmd 的 start ,控制台可以保持打开状态。 所以它应该类似于 cmd /k sc.exe " + server + " Stop " + database;

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-12-14
            • 1970-01-01
            • 1970-01-01
            • 2014-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多