一个winform程序,有个窗体需要系统启动Print Spooler 服务(RPC),由于有些用户的这个服务没有自动启动,所以在窗体加载的时候先判断是否启动,如果没有,则先启动,代码如下:
//  Print Spooler
                ServiceController controller = new ServiceController("Spooler");
                if (controller.Status == ServiceControllerStatus.Stopped)
                {
                    controller.Start();
                    controller.Refresh();
                }
可现在如果此服务的启动类型是手动或者自动的话,可以正常启动,如果这个服务的启动类型是禁用的话,上面的代码就会出错,我尝试过修改启动类型,可总是不成功,请教.....

解决方案 »

  1.   

    通过Process 调用 sc 修改服务启动类型
    命令格式如下sc config 服务名称 start= demand
      

  2.   

    看来CSDN重新开盘人不多呀,继续等待...
      

  3.   

    You might use WMI to change the service's starting mode:    enum StartServiceResult
        {
            Success = 0,
            AccessDenied = 2,
            ServiceAlreadyRunning = 10,
            ServiceDisabled = 14
        }    /// <returns>error message, if any</returns>
        static string StartService(string serviceName)
        {
            string errMsg = string.Format("Unable to open '{0}' service", serviceName);
            string query = string.Format("select * from Win32_Service where Name='{0}'", serviceName);
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);        foreach(ManagementObject obj in searcher.Get())
            {
                uint result = (uint)obj.InvokeMethod("StartService", null);
                switch ((StartServiceResult)result)
                {
                    case StartServiceResult.Success:
                    case StartServiceResult.ServiceAlreadyRunning:
                        errMsg = null;
                        break;
                    case StartServiceResult.ServiceDisabled:
                        result = (uint)obj.InvokeMethod("ChangeStartMode", new string[] { "Automatic" });
                        if ((StartServiceResult)result == StartServiceResult.Success)
                        {
                            errMsg = StartService( serviceName );
                        }
                        else
                        {
                            errMsg = string.Format("Error Changing Service Start Mode: ({0})", result);
                        }
                        break;
                    default:
                        errMsg = string.Format("Error Starting Service: ({0})", result);
                        break;
                }
                break;
            }        if( errMsg != null )
            {
               // wait until service's status is Running or time-out
            }        return errMsg;
        }
      

  4.   

    我找了段代码,还是不行
    //设置服务的启动类型//sServiceName服务名称//iStartType要设置的启动类型//返回成功状态 true:成功,false:失败 public Boolean SetWindowsServiceStartType(String sServiceName, int iStartType)
            {
                try
                {
                    System.Diagnostics.ProcessStartInfo objProcessInf = new System.Diagnostics.ProcessStartInfo();                objProcessInf.FileName = "cmd.exe";                objProcessInf.CreateNoWindow = false;
                    objProcessInf.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;                string sStartState = "boot";                switch (iStartType)
                    {
                        case 1:
                            {
                                sStartState = "system";
                                break;
                            }
                        case 2:
                            {
                                sStartState = "auto";
                                break;
                            }
                        case 3:
                            {
                                sStartState = "demand";
                                break;
                            }
                        case 4:
                            {
                                sStartState = "disabled";
                                break;
                            }
                        default:
                            {
                                break;
                            }
                    }                objProcessInf.Arguments = "/c sc config " + sServiceName + " start= " + sStartState;                System.Diagnostics.Process.Start(objProcessInf);                return true;
                }
                catch
                {
                    return false;
                }
            } 先试试楼上的
      

  5.   

    前一段时间对服务的启动、卸载做过测试,还真没有修改过启动类型
    采用gomoku 的方法修改了一下没问题,还是看一下你服务的操作权限吧
      

  6.   

    从注册表中把要启动的服务修改为自动启动,这是我写的一个小程序,控制台方式,可手动或批处理执行!算是一种变相方式!注册表修改后重启电脑服务自动启动,配置不同参数可以执行注册或卸载服务,这里是用于启动W3SVC相关服务的例子。using System;
    using System.Collections.Generic;
    using System.Text;
    using Microsoft.Win32;
    /*
    author  : xpilot
    */namespace PpmisReg
    {
        class Program
        {
            static void Main(string[] args)
            {            if (args.Length > 0 && !string.IsNullOrEmpty(args[0]))
                {
                    if (args[0].Trim() == "-i" || args[0].Trim() == "/i")
                        RunRegistry(true);
                    else if (args[0].Trim() == "-u" || args[0].Trim() == "/u")
                        RunRegistry(false);
                    else if (args[0].Trim() == "-?" || args[0].Trim() == "/?")
                    {
                        Console.WriteLine("PpmisReg v1.0 用法:\r");
                        Console.WriteLine("Note: RunServices aspnet_state/IISAdmin/W3SVC\n");
                        Console.WriteLine("PpmisReg /i \t执行注册安装\n");
                        Console.WriteLine("PpmisReg /u \t执行注册卸载\n");
                        return;
                    }
                    else
                        return;
                }
                else
                {
                    Console.WriteLine("PpmisReg v1.0 用法:\r");
                    Console.WriteLine("Note: RunServices aspnet_state/IISAdmin/W3SVC\n");
                    Console.WriteLine("PpmisReg /i \t执行注册安装\n");
                    Console.WriteLine("PpmisReg /u \t执行注册卸载\n");
                    return;
                }
            }        /// <summary>
            /// 设置注册表方法
            /// </summary>
            /// <param name="install">执行注册--true,删除注册--false</param>
            private static void RunRegistry(bool install)
            {
                //注册状态服务Aspnetstate
                RegistryKey rkAspNetState = Registry.LocalMachine;
                //注册IIS管理服务
                RegistryKey rkIISADMIN = Registry.LocalMachine;
                //注册W3SVC服务
                RegistryKey rkW3SVC = Registry.LocalMachine;
                if (install)
                {
                    rkAspNetState.OpenSubKey(@"SYSTEM\CurrentControlSet\Services", true).CreateSubKey("aspnet_state").SetValue("Start", 2, RegistryValueKind.DWord);
                    rkIISADMIN.OpenSubKey(@"SYSTEM\CurrentControlSet\Services", true).CreateSubKey("IISADMIN").SetValue("Start", 2, RegistryValueKind.DWord);
                    rkW3SVC.OpenSubKey(@"SYSTEM\CurrentControlSet\Services", true).CreateSubKey("W3SVC").SetValue("Start", 2, RegistryValueKind.DWord);
                }
                else
                {
                    rkAspNetState.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\aspnet_state", true).DeleteValue("Start", false);
                    rkIISADMIN.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\IISADMIN", true).DeleteValue("Start", false);
                    rkW3SVC.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\W3SVC", true).DeleteValue("Start", false);
                }
            }    }
    }
      

  7.   

    用ServiceController类 http://msdn.microsoft.com/zh-cn/library/system.serviceprocess.servicecontroller_members(en-us,VS.71).aspx
      

  8.   

    用C# 执行下面的命令
    sc config Spooler start= AUTO
    net start Spooler
      

  9.   

    试了一下,gomoku的方法可以解决,至于批处理文件启动服务及改注册表的方法,也试过可以实现,不过感觉是临时解决方法,谢谢大家了!
      

  10.   

    推荐一个计算机电子书下载站
    顺风电子书 - 国内最专业的计算机电子书下载站
    http://www.1kip.cn
      

  11.   

    建议使用WMI来做,参考,
    使用C#控制远程计算机的服务
    http://blog.csdn.net/zhzuo/archive/2004/03/29/22025.aspx
      

  12.   

    一下代码供参考 System.ServiceProcess.ServiceController winService = null;
    System.TimeSpan timeOut = new TimeSpan(0,1,0);//Set timeout
    private void btnReStart_Click(object sender, System.EventArgs e)
    {
    try
    {
    InitilizeServiceController();
    if (winService.Status == System.ServiceProcess.ServiceControllerStatus.Running)
    {
    winService.Stop();
    winService.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Stopped,timeOut);//wait service change to stopped status
    this.label1.Text = "service status now is :"+winService.Status;
    this.label1.Update();
    System.Threading.Thread.Sleep(15000);
    winService.Start();
    winService.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.StartPending,timeOut);//wait service change to start pending status
    this.label1.Text = "service status now is :"+winService.Status;
    this.label1.Update();
    winService.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running,timeOut);//wait service change to running status
    this.label1.Text = "service status now is :"+winService.Status;
    this.label1.Update();
    }
    else if (winService.Status == System.ServiceProcess.ServiceControllerStatus.Stopped)
    {
    this.label1.Text = "service status now is :"+winService.Status+",please click start button";
    this.label1.Update();
    }
    else
    {
    this.label1.Text = "service status now is :"+winService.Status;
    this.label1.Update();
    } }
    catch(Exception ex)
    {
    this.label1.Text = ex.Message;
    this.label1.Update();
    }
    } /// <summary>
    /// Initilize Service Controller
    /// </summary>
    private void InitilizeServiceController()
    {
    if (this.txtServiceName.Text.Trim().Length == 0) 
    {
    throw new Exception("please enter service name");
    }
    string serviceName = this.txtServiceName.Text;
    winService = new System.ServiceProcess.ServiceController(serviceName);//Get service by name
    }
      

  13.   

    调用Kernel32的ChangeServiceConfig,第一个参数正好用 ServiceController.ServiceHandle
      

  14.   

    常见的有两种方式实现,可以参考我这里的代码和文章,
    使用C#控制远程计算机的服务
    http://blog.csdn.net/zhzuo/archive/2004/03/29/22025.aspx