/** Fonte: http://goo.gl/W3Ku*/using System;using System.Runtime.InteropServices;using System.Windows.Forms;namespace Servicos{public class InstalarServico{private string caminhoServico = "";private string nomeServico = "";private string nomeExibicao = "";private string mensagemStatus = ""; // Armazena o status da operaçãoprivate TextBox txtStatus = null;#region Importando DLL's[DllImport("advapi32.dll")]private static extern IntPtr OpenSCManager(string lpMachineName, string lpSCDB, int scParameter);[DllImport("Advapi32.dll")]private 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")]private static extern void CloseServiceHandle(IntPtr SCHANDLE);[DllImport("advapi32.dll")]private static extern int StartService(IntPtr SVHANDLE, int dwNumServiceArgs, string lpServiceArgVectors);[DllImport("advapi32.dll", SetLastError = true)]private static extern IntPtr OpenService(IntPtr SCHANDLE, string lpSvcName, int dwNumServiceArgs);[DllImport("advapi32.dll")]private static extern int DeleteService(IntPtr SVHANDLE);[DllImport("kernel32.dll")]private static extern int GetLastError();#endregionpublic void setCaminhoServico(string caminho){/*** Altera o caminho do serviço*/this.caminhoServico = caminho;}public void setNomeServico(string nome){/*** Altera o nome do serviço*/this.nomeServico = nome;}public void setNomeExibicao(string nome){/*** Altera o nome para exibição*/this.nomeExibicao = nome;}public void setTxtStatus(TextBox txtStatus){this.txtStatus = txtStatus;}public string getMensagemStatus(){/*** Retorna a mensagem de status da operação.*/return this.mensagemStatus;}public bool instalarServico(){/*** Instala o serviço*/#region Verifica se as variáveis necessárias estão preenchidasif ((this.caminhoServico.Length == 0) ||(this.nomeServico.Length == 0) ||(this.nomeExibicao.Length == 0)){this.mensagemStatus = "Campos não preenchidos";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;this.mensagemStatus = "Campos não preenchidos";return false;}#endregion#region Declaração de constantesint 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, this.nomeServico, this.nomeExibicao,SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,this.caminhoServico, null, 0, null, null, null);if (sv_handle.ToInt32() == 0){CloseServiceHandle(sc_handle);this.mensagemStatus = "Não foi possível instalar o serviço";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;return false;}else{// Inicia o serviçoint i = StartService(sv_handle, 0, null);// Se o valor de i for zero, então houve um erro ao iniciar o serviço.// Obs: O erro pode ocorrer se o serviço já esteja funcionando ou algum outro problema.if (i == 0){this.mensagemStatus = "Não foi possível iniciar o serviço";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;return false;}this.mensagemStatus = "Serviço iniciado com sucesso";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;CloseServiceHandle(sc_handle);return true;}}else{this.mensagemStatus = "SCM não foi aberto com sucesso";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;return false;}}catch (Exception oErro){this.mensagemStatus = oErro.Message;if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;return false;}}public bool desinstalarServico(){/*** Desinstala o serviço*/#region Verifica se as variáveis necessárias estão preenchidasif (this.nomeServico.Length == 0){this.mensagemStatus = "Campos não preenchidos";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;return false;}#endregionint 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, this.nomeServico, DELETE);//Console.WriteLine(svc_hndl.ToInt32());if (svc_hndl.ToInt32() != 0){int i = DeleteService(svc_hndl);if (i != 0){CloseServiceHandle(sc_hndl);this.mensagemStatus = "Serviço deletado com sucesso";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;return true;}else{CloseServiceHandle(sc_hndl);this.mensagemStatus = "Não foi possível excluir o serviço especificado";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;return false;}}else{this.mensagemStatus = "Não foi possível excluir o serviço especificado";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;return false;}}else{this.mensagemStatus = "Não foi possível excluir o serviço especificado";if (this.txtStatus != null)this.txtStatus.Text += "\r\n" + this.mensagemStatus;return false;}}/*public static void Main(){string caminhoServico = @"C:\servico\servico.exe";string nomeServico = "Nome do Serviço";string nomeExibicao = "Nome para exibição";InstalarServico obj = new InstalarServico();obj.setCaminhoServico(caminhoServico);obj.setNomeServico(nomeServico);obj.setNomeExibicao(nomeExibicao);obj.instalarServico();}*/}}
terça-feira, 20 de julho de 2010
Serviços do Windows
Subscrever:
Enviar feedback (Atom)
Sem comentários:
Enviar um comentário