using system.runtime.interopservices;
namespace myserviceinstaller
{
class serviceinstaller
{
#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)
{
string svcpath;
string svcname;
string svcdispname;
//服务程序的路径
svcpath = @"c:\myservice.exe";
svcdispname="myservice";
svcname= "myservice";
serviceinstaller c = new serviceinstaller();
c.installservice(svcpath, svcname, svcdispname);
console.read();
}
/// <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;
}
}
}
文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




