none
Windows Service Roda mas não EXECUTA código RRS feed

  • Pergunta

  • Bom Dia ... 

    Estou com um código fonte , testado e aprovado (rs) . Porém preciso rodar ele em um serviço simples do Windows.

    Instalo o Serviço , rodo ele .. Mas ele não executa o código , será que é possível alguém me indicar o que devo fazer ,  Tentei tudo que pude até agora , mas nenhum sucesso , No aguardo... 

    quinta-feira, 23 de outubro de 2014 14:01

Respostas

  • Se preferir, poste seu código. Segue um "checklist":

    Você adicionou a classe de serviço? 

    Implementou o evento OnStart?

    Instalou sua aplicação como serviço? Ele apareceu na lista de serviços do Windows?

    Neste link tem um passo a passo de criação de Serviços Windows:

    http://msdn.microsoft.com/pt-br/library/zt39148a(v=vs.110).aspx


    quinta-feira, 23 de outubro de 2014 14:11
  • Renan, pelo o que entendi seu serviço deve executar as 9-10 e as 15-16, certo? Você testou com a máquina nesse horário, correto?

    Aparentemente está tudo certo, para facilitar adicione logs, segue minha sugestão:

    namespace ServicoNorton
    {
        public partial class Service1 : ServiceBase
        {
    	private static String _path = "C:\TEste\ArquivoDelOgServico.txt";
    
    
    	private static LogMessage(String message)
    	{
    	        using (StreamWriter sw = File.AppendText(_path)) 
            	{
    	            sw.WriteLine(message);
            	}	
    	}
    
            Timer timer = new Timer();
            public Service1()
            {
                InitializeComponent();
            }
    
            protected override void OnStart(string[] args)
            {
    	LogMessage("Start OnStart");
                timer.Elapsed += timer_Elapsed;
                timer.Interval = 5000;
                timer.Enabled = true;
    	LogMessage("End OnStart");
            }
    
            void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
    
    	LogMessage("Start timer_Elapsed");
    
                try
                {
    
                    if ((DateTime.Now.Hour >= 9 && DateTime.Now.Hour <= 10) || (DateTime.Now.Hour >= 15 && DateTime.Now.Hour <= 16))
                    {
    	LogMessage("Enter If");

    • Sugerido como Resposta Deric Ferreira quinta-feira, 23 de outubro de 2014 23:21
    • Marcado como Resposta Renan C. Pereira quinta-feira, 23 de outubro de 2014 23:54
    quinta-feira, 23 de outubro de 2014 23:21
  • Renan, como tem certeza que está rodado se ele não "executa" a rotina que você precisa? Adicionou os logs? É uma forma simples de ter certeza que está entrando nos pontos que precisa enquanto testa.
    • Sugerido como Resposta Deric Ferreira quinta-feira, 23 de outubro de 2014 23:46
    • Marcado como Resposta Renan C. Pereira quinta-feira, 23 de outubro de 2014 23:54
    quinta-feira, 23 de outubro de 2014 23:46

Todas as Respostas

  • Se preferir, poste seu código. Segue um "checklist":

    Você adicionou a classe de serviço? 

    Implementou o evento OnStart?

    Instalou sua aplicação como serviço? Ele apareceu na lista de serviços do Windows?

    Neste link tem um passo a passo de criação de Serviços Windows:

    http://msdn.microsoft.com/pt-br/library/zt39148a(v=vs.110).aspx


    quinta-feira, 23 de outubro de 2014 14:11
  • Fiquei sem net agora a tarde  , segue meu código .. Segui o tutorial pra criar um staller , o serviço tá rodando no Windows , mas não entra no código 

    namespace ServicoNorton
    {
        public partial class Service1 : ServiceBase
        {
            Timer timer = new Timer();
            public Service1()
            {
                InitializeComponent();
            }

            protected override void OnStart(string[] args)
            {
                timer.Elapsed += timer_Elapsed;
                timer.Interval = 5000;
                timer.Enabled = true;
            }

            void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                try
                {

                    if ((DateTime.Now.Hour >= 9 && DateTime.Now.Hour <= 10) || (DateTime.Now.Hour >= 15 && DateTime.Now.Hour <= 16))
                    {
                        string ArquivoIni = LeIni.GetIniValue("Dados", "DataAtual");

                        DateTime DataArquivoIni = DateTime.Parse(ArquivoIni.ToString());

                        string ArquivoAtual = LeIni.GetIniValue("Dados", "Caminho");
                        DirectoryInfo dir = new DirectoryInfo(ArquivoAtual);
                        ArquivoAtual += dir.GetFiles()[0].Name;


                        FileInfo FILE = new FileInfo(ArquivoAtual);
                        DateTime dataArq = FILE.CreationTime.Date;

                        if (DataArquivoIni < dataArq)
                        {
                            string dirDestino = LeIni.GetIniValue("Dados", "CaminhoLocal");
                            string destino = dirDestino + dir.GetFiles()[0].Name;

                            if (!Directory.Exists(dirDestino))
                            {
                                Directory.CreateDirectory(dirDestino);
                            }

                            CopiarArquivoBinario(ArquivoAtual, destino);
                            LeIni.WriteIniValue("Dados", "DataAtual", dataArq.ToShortDateString()); // gravou no ini

                            if (File.Exists(destino))
                            {
                                string fileProcess = dir.GetFiles()[0].Name.Split('.')[0];

                                if (System.Diagnostics.Process.GetProcessesByName(fileProcess).Length <= 0)
                                    System.Diagnostics.Process.Start(destino, "/q");//atualizou o norton   
                            }

    quinta-feira, 23 de outubro de 2014 22:48
  • Renan, pelo o que entendi seu serviço deve executar as 9-10 e as 15-16, certo? Você testou com a máquina nesse horário, correto?

    Aparentemente está tudo certo, para facilitar adicione logs, segue minha sugestão:

    namespace ServicoNorton
    {
        public partial class Service1 : ServiceBase
        {
    	private static String _path = "C:\TEste\ArquivoDelOgServico.txt";
    
    
    	private static LogMessage(String message)
    	{
    	        using (StreamWriter sw = File.AppendText(_path)) 
            	{
    	            sw.WriteLine(message);
            	}	
    	}
    
            Timer timer = new Timer();
            public Service1()
            {
                InitializeComponent();
            }
    
            protected override void OnStart(string[] args)
            {
    	LogMessage("Start OnStart");
                timer.Elapsed += timer_Elapsed;
                timer.Interval = 5000;
                timer.Enabled = true;
    	LogMessage("End OnStart");
            }
    
            void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
    
    	LogMessage("Start timer_Elapsed");
    
                try
                {
    
                    if ((DateTime.Now.Hour >= 9 && DateTime.Now.Hour <= 10) || (DateTime.Now.Hour >= 15 && DateTime.Now.Hour <= 16))
                    {
    	LogMessage("Enter If");

    • Sugerido como Resposta Deric Ferreira quinta-feira, 23 de outubro de 2014 23:21
    • Marcado como Resposta Renan C. Pereira quinta-feira, 23 de outubro de 2014 23:54
    quinta-feira, 23 de outubro de 2014 23:21
  • Sim , o serviço tá ativo .. Rodando , inclusive voltei varias vezes o horario pra ver se rodava mas nada .. O código eu testei faz tudo como planejado , por isso acho que o problema tá no serviço . Continuo tentando , se conseguir falo o que tava de errado .
    quinta-feira, 23 de outubro de 2014 23:42
  • Renan, como tem certeza que está rodado se ele não "executa" a rotina que você precisa? Adicionou os logs? É uma forma simples de ter certeza que está entrando nos pontos que precisa enquanto testa.
    • Sugerido como Resposta Deric Ferreira quinta-feira, 23 de outubro de 2014 23:46
    • Marcado como Resposta Renan C. Pereira quinta-feira, 23 de outubro de 2014 23:54
    quinta-feira, 23 de outubro de 2014 23:46
  • O Serviço tá em execução lá no lugar dos serviços , mas vou modificar e adicionar os logs  como sugeriu ... 
    quinta-feira, 23 de outubro de 2014 23:54
  • É uma boa Renan, estou no aguardo para ajudar!

    sexta-feira, 24 de outubro de 2014 00:14
  • Deric , O serviço está rodando perfeitamente .. *-* Aleluia !!!    Mas ainda não terminei o trabalho com esse programa , quero melhorar o código . Pois como deve ter percebido , faço cópia de algum lugar , esse lugar é meu servidor local.

    Preciso de algum código , que na hora que pedir pra fazer á cópia do arquivo do MEU SERVIDOR LOCAL , peça o Usuário  e a senha da pessoa pra logar no servidor , pra evitar o erro . Deu pra entender o que quero ? Se alguém puder me ajudar , Maravilha ! 


    quinta-feira, 30 de outubro de 2014 19:58
  • Olá, é possível fazer isso programaticamente, mas vejo sentido em fazer isso. A ideia principal de Windows Service é rodar em brackground e sem intervenção de um usuário. Para que não tenha problema de permissões, configure seu serviço com um usuário de rede que tenha permissão:

    Botão direito no serviço -> Aba Logon -> "Procurar" e coloque um usuário de domínio ou que tenha permissão para acesso a seu diretório.

    Marque como resposta se foi útil.

    quinta-feira, 30 de outubro de 2014 20:23
  • O que acontece , é que existem maquinas que não estão no domínio , e usam a rede também, e precisam desse serviço executando . Já fiz esse  precedimento , porem não funcionou . Mas olhando bem , não tinha pensado , eu posso colocar um mesmo usuário , pra por exemplo 50 usuários do Serviço que não vai dar problema ?

    sexta-feira, 31 de outubro de 2014 00:23
  • Oi Renan C. Pereira, o procedimento funciona. O que provavelmente aconteceu foi que o usuário que configurou não tinha permissão para acessar o(s) diretório(s) em questão. Não existe nenhum problema em utilizar um mesmo usuário em N máquinas.
    sexta-feira, 31 de outubro de 2014 11:04
  • Ok , cheguei e testei o que me falou , mas não deu certo . a Maquina Não está no dominio , ela e muitas mais . Só pra confirmar , no Loggon quando um usuário não está no dominio eu coloco  DOMINIO\Usuario e em baixo a senha correto ?  
    sexta-feira, 31 de outubro de 2014 11:16
  • Renan C. Pereira, vamos lá...a máquina não está no domínio e precisa acessar um diretório no dominío? O que sugeri está certo, mas você deve saber como aplicar...Você tem uma problema de infraestrutura (redes).
    sexta-feira, 31 de outubro de 2014 11:41
  • Deixa eu explicar melhor .

    A Máquina não está no domínio . Porem o arquivo que copio , ele está dentro de um diretório no servidor local , e é preciso ser membro do Domínio pra acessa-lo , certo ?  Então quando eu tento instalar o serviço com uma maquina fora do domínio , no meu código ele aparece um erro contendo o seguinte "acesso ao caminho \\servidor\\ti\\drivers\\atualizador foi negado . Isso porque o serviço está rodando local , e o usuário local não tem permissão no domínio. OH Deus , como resolver?

    sexta-feira, 31 de outubro de 2014 12:11
  • Meu caro, compartilhe a pasta com usuário específicos no Windows. Adicione o usuário que deseja permitir. Use este usuário no seu serviço.

    Novamente, sugiro que repense sua estrutura.

    sexta-feira, 31 de outubro de 2014 12:43
  • Eu já fiz isso Deric , ele não instala o serviço corretamente . Por isso to buscando outras formas ! 
    sexta-feira, 31 de outubro de 2014 12:49