老农如是想,如是说,如是为
天才首页 > 博客 > 玩代码  >  如何用c# 开发系统服务 - 下篇  | 登录
  上次我专门说明了如何用c# 开发系统服务,由于很多时候installutil.exe这个工具用起来还是有点繁琐,一直想着用c#代码自己完成启动服务,删除服务的操作。这就需要调用.NET的DllImport,主要是调用advapi32.dll这个dll来实现。

  关于advapi32.dll的接口,有兴趣的可以查。我这里就写出实现的C#代码。

 
using System;
using System.Runtime.InteropServices;
namespace MyServiceInstaller
{
class ServiceInstaller
{
public static string AppPath{get{return System.Environment.CurrentDirectory;}}
#region Private Variables
//private string _servicePath;
//private string _serviceName;
//private string _serviceDisplayName;
#endregion Private Variables
#region DLLImport
[DllImport("advapi32.dll")]
public static extern IntPtr OpenSCManager(string lpMachineName,string lpSCDB, int scParameter);
[DllImport("Advapi32.dll")]
public static extern IntPtr CreateService(IntPtr SC_HANDLE,string lpSvcName,string lpDisplayName, 
int dwDesiredAccess,int dwServiceType,int dwStartType,int dwErrorControl,string lpPathName, 
string lpLoadOrderGroup,int lpdwTagId,string lpDependencies,string lpServiceStartName,string lpPassword);
[DllImport("advapi32.dll")]
public static extern void CloseServiceHandle(IntPtr SCHANDLE);
[DllImport("advapi32.dll")]
public static extern int StartService(IntPtr SVHANDLE,int dwNumServiceArgs,string lpServiceArgVectors);
[DllImport("advapi32.dll",SetLastError=true)]
public static extern IntPtr OpenService(IntPtr SCHANDLE,string lpSvcName,int dwNumServiceArgs);
[DllImport("advapi32.dll")]
public static extern int DeleteService(IntPtr SVHANDLE);
[DllImport("kernel32.dll")]
public static extern int GetLastError();
#endregion DLLImport
/// <summary>
/// 应用程序入口.
/// </summary>
[STAThread]
static void Main(string[] args)
{    
    int ExeId = (args==null)?0:0;
    if(args!=null && args.Length>0){
        if(Int32.TryParse(args[0],out ExeId)){
            ;
        }
    }
    string svcName= "DSIService";
    ServiceInstaller c = new ServiceInstaller();
    if(ExeId==1){
        string svcPath;
        string svcDispName;
        //服务程序的路径
        svcPath = System.IO.Path.Combine(AppPath,"dsiSer.exe");
        svcDispName="DSIService";
        Console.WriteLine("执行的路径是{0}",svcPath);
        Console.WriteLine("创建的结果是{0}",c.InstallService(svcPath, svcName, svcDispName));
    }else if(ExeId==2){
        Console.WriteLine("卸载的结果是{0}",c.UnInstallService(svcName));
        
    }else{
        Console.WriteLine("你要干什么?{0}","installutil /u dsiSer.exe");
    }
}
/// <summary>
/// 安装和运行
/// </summary>
/// <param name="svcPath">程序路径.</param>
/// <param name="svcName">服务名</param>
/// <param name="svcDispName">服务显示名称.</param>
/// <returns>服务安装是否成功.</returns>
public bool InstallService(string svcPath, string svcName, string svcDispName)
{
#region Constants declaration.
int SC_MANAGER_CREATE_SERVICE = 0x0002;
int SERVICE_WIN32_OWN_PROCESS = 0x00000010;
//int SERVICE_DEMAND_START = 0x00000003;
int SERVICE_ERROR_NORMAL = 0x00000001;
int STANDARD_RIGHTS_REQUIRED = 0xF0000;
int SERVICE_QUERY_CONFIG = 0x0001;
int SERVICE_CHANGE_CONFIG = 0x0002;
int SERVICE_QUERY_STATUS = 0x0004;
int SERVICE_ENUMERATE_DEPENDENTS = 0x0008;
int SERVICE_START =0x0010;
int SERVICE_STOP =0x0020;
int SERVICE_PAUSE_CONTINUE =0x0040;
int SERVICE_INTERROGATE =0x0080;
int SERVICE_USER_DEFINED_CONTROL =0x0100;
int SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED | 
SERVICE_QUERY_CONFIG |
SERVICE_CHANGE_CONFIG |
SERVICE_QUERY_STATUS | 
SERVICE_ENUMERATE_DEPENDENTS | 
SERVICE_START | 
SERVICE_STOP | 
SERVICE_PAUSE_CONTINUE | 
SERVICE_INTERROGATE | 
SERVICE_USER_DEFINED_CONTROL);
int SERVICE_AUTO_START = 0x00000002;
#endregion Constants declaration.
try
{
IntPtr sc_handle = OpenSCManager(null,null,SC_MANAGER_CREATE_SERVICE);
if (sc_handle.ToInt32() != 0)
{
IntPtr sv_handle = CreateService(sc_handle,svcName,svcDispName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,svcPath,null,0,null,null,null);
if(sv_handle.ToInt32() ==0)
{
CloseServiceHandle(sc_handle);
return false;
}
else
{
//试尝启动服务
int i = StartService(sv_handle,0,null);
if(i==0)
{
return false;
}
CloseServiceHandle(sc_handle);
return true;
}
}
else
return false;
}
catch(Exception e)
{
throw e;
}
}
/// <summary>
/// 反安装服务.
/// </summary>
/// <param name="svcName">服务名.</param>
public bool UnInstallService(string svcName){
    int GENERIC_WRITE = 0x40000000;
    IntPtr sc_hndl = OpenSCManager(null,null,GENERIC_WRITE);
    if(sc_hndl.ToInt32() !=0){
        int DELETE = 0x10000;
        IntPtr svc_hndl = OpenService(sc_hndl,svcName,DELETE);
        if(svc_hndl.ToInt32() !=0){ 
            int i = DeleteService(svc_hndl);
            if (i != 0){
                CloseServiceHandle(sc_hndl);
                return true;
            }else{
                CloseServiceHandle(sc_hndl);
                return false;
            }
        }else
            return false;
        }
        else
        return false;
}

};
}




  其中启动服务的是InstallService,删除服务的是UnInstallService,这里面有几个事情要说明。
  第一:在真正执行的代码中
public static string AppPath{get{return System.Environment.CurrentDirectory;}}
这段是执行的目录,当服务开始执行的时候,都是在系统目录。
  第二:删除服务的UnInstallService这是个消极删除,如果执行过后,刷新,服务还在列表中,但是状态会被标记为禁用,其实已经被删除。
  
  其他没什么好说的,如果需要用户名和密码登录,就在CreateService的最后两个参数去修改。

  查找更多系统服务
天气:大雨,ccdot发表于2008-4-23 15:07:52,阅读了146次,共有个0回复.

暂无评论

  1. 顺其自然,不治而治.
  2. 不要提交任何带有网址URL信息的评论.
  3. 需要更多信息?请使用站内搜索,郁闷了?听听我在听什么吧!
用户名:*验证:看不清楚请点击刷新验证码*
内容:
青花瓷 边做边爱 征途 穷开心 摇啊摇 我们的歌 感动天感动地 白狐 自由飞翔 思念是一种病 分手那天 爱死了昨天
中国话 日不落 求佛 上海滩 等一分钟 天路 老人与海 左边 凤舞九天 有没有人告诉你 遇上你是我的缘 做你的爱人
拉拉爱 大悲咒 周杰伦 刘德华 命运 等爱的玫瑰 凤凰传奇 依然在一起 樱花草 dj flash 私服 为你写诗 你的承诺
杨惠妍 股票 博客 论坛 流行歌曲 小游戏 S.H.E 王力宏 博客 加盟 月亮之上 私服 彩虹 周笔畅 蔡依林 感恩的心
搞笑 流行音乐 mp3歌曲 mp3 股票 招商 歌曲mp3 双人小游戏 dj舞曲 最新歌曲 小游戏 美女 股票 dj mp3歌曲 mp3