一个winform程序,有个窗体需要系统启动Print Spooler 服务(RPC),由于有些用户的这个服务没有自动启动,所以在窗体加载的时候先判断是否启动,如果没有,则先启动,代码如下:
// Print Spooler
ServiceController controller = new ServiceController("Spooler");
if (controller.Status == ServiceControllerStatus.Stopped)
{
controller.Start();
controller.Refresh();
}
可现在如果此服务的启动类型是手动或者自动的话,可以正常启动,如果这个服务的启动类型是禁用的话,上面的代码就会出错,我尝试过修改启动类型,可总是不成功,请教.....
// Print Spooler
ServiceController controller = new ServiceController("Spooler");
if (controller.Status == ServiceControllerStatus.Stopped)
{
controller.Start();
controller.Refresh();
}
可现在如果此服务的启动类型是手动或者自动的话,可以正常启动,如果这个服务的启动类型是禁用的话,上面的代码就会出错,我尝试过修改启动类型,可总是不成功,请教.....
解决方案 »
- 关于两个系统结合的问题
- C# winform如何判断窗体上的值是否被修改过
- Pdf文件操作
- C#winform中的datagrid如何保持最右侧的边界线不动,就是在手动调列宽的时候,不会在datagrid中出现空白
- SqlDataAdapter.Update(ds,"Zd");为什么我执行上面的语句不能更新到数据库
- 怎么用代码为HTML下Table1控件的某一格设置背景图片?
- 高分提问C#作的操作ACCESS数据库程序中有关问题
- c# 中调用EnumJobs时出问题,有一个参数值返回不回来,有代码,帮忙看看!
- 如何获得当前目录下文件的完整路径,各位帮忙看看?
- 命名空间问题(谁能告诉我哪错了?)
- c#调用ffmepg视频转换问题
- 怎么把vc++里面的cstring转换为C#中的string 或int float 急急急 一定给分
命令格式如下sc config 服务名称 start= demand
{
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;
}
//设置服务的启动类型//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;
}
} 先试试楼上的
采用gomoku 的方法修改了一下没问题,还是看一下你服务的操作权限吧
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);
}
} }
}
sc config Spooler start= AUTO
net start Spooler
顺风电子书 - 国内最专业的计算机电子书下载站
http://www.1kip.cn
使用C#控制远程计算机的服务
http://blog.csdn.net/zhzuo/archive/2004/03/29/22025.aspx
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
}
使用C#控制远程计算机的服务
http://blog.csdn.net/zhzuo/archive/2004/03/29/22025.aspx