使用winapi安装Windows服务示例程序
using system;
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;
}
}
}