terça-feira, 20 de julho de 2010

Serviços do Windows

/*
* 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ção
private 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();
#endregion

public 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 preenchidas
if (
(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 constantes
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, 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ço
int 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 preenchidas
if (this.nomeServico.Length == 0)
{
this.mensagemStatus = "Campos não preenchidos";

if (this.txtStatus != null)
this.txtStatus.Text += "\r\n" + this.mensagemStatus;

return false;
}
#endregion

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, 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();
}
*/
}
}

Sem comentários:

Enviar um comentário