前两天公司要做一个windows服务,要我提供下。顺手就做了一个壳 现在跟大家分享下:
1.打开VS(我的是2010),新建一个项目选择“Window 服务” :
2. 右击 “Service1.cs 设计” 选择 "添加安装程序" :


3. 在 “Service1.cs 设计” 中 把 ServiceName 设置为 "ServiceTest"(用户可以自己定义),然后 选中serviceInstaller1 把 ServiceName 设置跟之前"Service1.cs 设计"中的一样,还有几个属性设置:
这些属性的作用就不叙述了,自己去了解。
接下来 选中 serviceProcessInstaller1 设置属性:

Ok,现在是写服务的工作了
右击 在 “Service1.cs 设计” 查看代码,打开如图:

这个是用户要写自己的逻辑,我这就不叙述了。
好了,现在服务是写了 该安装了。
新建一个window Form 程序,我就不贴新建图了 直接看最后的图:

现在是贴代码了:
private void btnInstall_Click(object sender, EventArgs e)
{
if (!ServiceIsExisted("ServiceTest"))
{
try
{
string CurrentDirectory = System.Environment.CurrentDirectory;
System.Environment.CurrentDirectory = CurrentDirectory + "\Service";
ManagedInstallerClass.InstallHelper(new string[] { "WindowsServiceTest.exe" });
System.Environment.CurrentDirectory = CurrentDirectory;
LabelTooptip.Text = "安装成功!";
}
catch (Exception ex)
{
LabelTooptip.Text = "安装出错:" + ex.Message;
}
}
else
{
LabelTooptip.Text = "该服务已经安装,如需重装请先卸载!";
}
}
private void btnUnInstall_Click(object sender, EventArgs e)
{
if (ServiceIsExisted("ServiceTest"))
{
try
{
string CurrentDirectory = System.Environment.CurrentDirectory;
System.Environment.CurrentDirectory = CurrentDirectory + "\Service";
ManagedInstallerClass.InstallHelper(new string[] {"/u" ,"WindowsServiceTest.exe" });
System.Environment.CurrentDirectory = CurrentDirectory;
LabelTooptip.Text = "卸载成功!";
}
catch (Exception ex)
{
LabelTooptip.Text = "卸载出错:" + ex.Message;
}
}
else
{
LabelTooptip.Text = "您要卸载的服务不存在!";
}
}
private void btnStart_Click(object sender, EventArgs e)
{
try
{
ServiceController serviceController = new ServiceController("ServiceTest");
serviceController.Start();
LabelTooptip.Text = "服务启动成功!";
}
catch (Exception ex)
{
LabelTooptip.Text = "服务启动出错:" + ex.Message;
}
}
private void btnStop_Click(object sender, EventArgs e)
{
try
{
ServiceController serviceController = new ServiceController("ServiceTest");
if (serviceController.CanStop)
serviceController.Stop();
LabelTooptip.Text = "服务停止成功!";
}
catch (Exception ex)
{
LabelTooptip.Text = "服务停止出错:" + ex.Message;
}
}
private bool ServiceIsExisted(string svcName)
{
ServiceController[] services = ServiceController.GetServices();
foreach (ServiceController s in services)
{
if (s.ServiceName == svcName)
{
return true;
}
}
return false;
}
到这里基本就OK ,但是还有一个问题就是这个程序必须已管理员运行 所以在 Form 程序的 Program.cs 里加上一段代码, 如下代码:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); /** * 当前用户是管理员的时候,直接启动应用程序 * 如果不是管理员,则使用启动对象启动程序,以确保使用管理员身份运行 */ //获得当前登录的Windows用户标示 System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent(); System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity); //判断当前登录用户是否为管理员 if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)) { //如果是管理员,则直接运行 Application.Run(new Form1()); } else { //创建启动对象 System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.UseShellExecute = true; startInfo.WorkingDirectory = Environment.CurrentDirectory; startInfo.FileName = Application.ExecutablePath; //设置启动动作,确保以管理员身份运行 startInfo.Verb = "runas"; try { System.Diagnostics.Process.Start(startInfo); } catch { return; } } }
现在是大功告成了。测试如下:

在这里我声明下,我也是看了网上的一些人的资料才完成的,当时没有记录人家的网址,在这里先谢谢人家提供的资料。
如果有问题或者有更好的处理欢迎指点!
附 源代码:
http://files.cnblogs.com/files/startlearn/WindowsServiceTest.zip