Categorias
application diret??rio virtual dll iis site windows

Convertendo uma pasta em aplica????o no IIS via c??digo (C#)

Somente pelo IIS ?? poss??vel converter uma pasta em aplica????o? Mais ou menos. Na vers??o 7 do IIS j?? disp??e de m??dulos que simplificam o processo de cria????o de site, diret??rio virtual, pools de aplica????o e as aplica????es em si. Nesse artigo mostrarei bem r??pido como converter uma pasta em uma aplica????o.

Crie sua aplica????o e adicione, como refer??ncia, o bin??rio Microsoft.Web.Administration.dll que fica na pasta C:WindowsSystem32inetsrv . Agora adicione o seguinte c??digo:

using Microsoft.Web.Administration;

private void CriaEntradaIIS(string diretorio)
    {
        try
        {
            // Cria a pasta do site
            if (!Directory.Exists(diretorio))
                Directory.CreateDirectory(diretorio);


            // Servidor de Aplica????o
            ServerManager sm = new ServerManager();


            // Captura o site raiz onde ir?? adicionar a aplica????o
            Site st = sm.Sites[“Default Web Site”];


            // Cria a aplica????o no diret??rio criado apontando o caminho, ex: aplicacao
            Application app = st.Applications.Add(“/aplicacao”, diretorio);
            app.ApplicationPoolName = “ASP.NET v4.0”;
            sm.CommitChanges();


            // Libera
            sm.Dispose();
        }
        catch (Exception erro)
        {
            return;
        }
    }

Se tentar executar dar?? erro… Antes d?? permiss??o total ao grupo Servi??o de Rede (Network Service) ?? pasta C:WindowsSystem32inetsrvconfig . Agora sim ir?? criar. Para mais exemplos veja nesse post aqui.

Categorias
componentes dll scanner windows winform

Scanear um documento com C#

Um dos melhores componentes de scaneamento que j?? utilizei ?? o da VintaSoft. Ele n??o ?? free, mas pode ser utilizado normalmente. O ??nico empecilho ?? que, para cada scan que fizer, ele ir?? solicitar que clique em Evaluate. Quem comprar, vale a pena pois ?? muito bom e seu suporte sempre est?? a disposi????o. Chega de elogios e vamos ao que interessa.

O componente permite tanto utilizar em Windows Form quando Web Form e no site h?? todos os exemplos necess??rios. Baixe o componente e instale. Para nosso exemplo, trabalharemos com um Windows Form. Fiz uma pequena aplica????o de scanear nota fiscal.

V?? na pasta de instala????o do componente, copie o arquivo Vintasoft.Twain.dll para sua aplica????o e adicione como refer??ncia. No Code-Behind do formul??rio a ser trabalhado, adicione o seguinte c??digo para inicializar o componente:

using Vintasoft.Twain;


// Carrega o gerenciador de dispositivo
DeviceManager _deviceManager = new DeviceManager();
Device _device;


// Avalia se ?? um dispositivo ??til
if (!_deviceManager.IsTwainAvailable)
{
           MessageBox.Show(“N??o ?? um dispositivo TWAIN!”, “Erro”, MessageBoxButtons.OK, MessageBoxIcon.Error);
           return;
}


try
{
           // Abre o gerenciador de dispositivo
           _deviceManager.Open();
           // Seta o dispositivo corrente
           _device = _deviceManager.Devices.Current;
           lblDipositivo.Text = _deviceManager.Devices.Current.Info.ProductName;
}
catch (TwainDeviceManagerException ex)
{
           MessageBox.Show(ex.Message, “Gerenciador de Dispositivos”);
           return;
}

Agora, ao clicar no bot??o Scannear, adicionamos o seguinte m??todo:

private void btnScanear_Click(object sender, EventArgs e)
        {
            try
            {
                // Seta as configura????es
                _device.TransferMode = TransferMode.File;
                try
                {
                    _device.ShowUI = false;
                    _device.ShowIndicators = false;
                    _device.DisableAfterAcquire = true;
                }
                catch { }


                // Abre o dispositivo
                _device.Open();


                // Propriedades do scaneamento
                try
                {
                    _device.UnitOfMeasure = UnitOfMeasure.Inches;
                    _device.Resolution = new Resolution(float.Parse(resolucaoX.SelectedItem.ToString()), float.Parse(resolucaoY.SelectedItem.ToString()));
                }
                catch { }


                // Informa????o sobre o arquivo
                _arquivo = “LJ_” + _loja + “_Scan_” + DateTime.Now.ToString(“yyyy_MM_dd_HH_mm_ss”) + “.jpg”;
                _device.FileName = _directoryForImages + _arquivo;
                //_device.FileFormat = TwainImageFileFormat.Jpeg;


                // Captura a imagem
                AcquireModalState acquireModalState = AcquireModalState.None;
                do
                {
                    acquireModalState = _device.AcquireModal();
                    switch (acquireModalState)
                    {
                        case AcquireModalState.ImageAcquired:


                            _device.FileName = _directoryForImages + _arquivo;
                            //_device.FileFormat = TwainImageFileFormat.Jpeg;
                            break;


                        case AcquireModalState.ScanCompleted:


                            CloseDevice();


                            break;


                        case AcquireModalState.ScanCanceled:


                            CloseDevice();


                            break;


                        case AcquireModalState.ScanFailed:


                            CloseDevice();


                            break;


                        case AcquireModalState.UserInterfaceClosed:


                            CloseDevice();


                            break;
                    }
                }
                while (acquireModalState != AcquireModalState.None);
            }
            catch (TwainException ex)
            {
                MessageBox.Show(ex.Message + ” – “ + ex.StackTrace, “Erro”, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

E outros m??todos s??o necess??rios adicionar ao form, como:

        /// Fecha o dispositivo e a ger??ncia

        private void CloseDeviceAndDeviceManager()
        {
            // Verifica de h?? dispositivo
            if (_device != null)
            {
                if (_device.State != DeviceState.Closed)
                    _device.Close();
            }


            // Fecha a ger??ncia
            if (_deviceManager.State != DeviceManagerState.Closed)
                _deviceManager.Close();
        }

        /// Fecha o dispositivo

        private void CloseDevice()
        {
            // Desabilita o servi??o
            if (_device.State == DeviceState.Enabled)
            {
                if (!_device.ShowUI)
                    _device.Disable();
            }


            // Fecha
            if (_device.State == DeviceState.Opened)
                _device.Close();
        }

        /// Ao fechar o formul??rio, libera o uso

        private void Scan_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (_device != null)
            {
                // Verifica se est?? em uso
                if (_device.State == DeviceState.Transferring ||
                    _device.State == DeviceState.TransferReady)
                {
                    // Envia a solicita????o de cancelamento
                    _device.CancelTransfer();
                    // Aguarda finalizar
                    e.Cancel = true;
                    MessageBox.Show(“O dispositivo est?? em uso! Aguarde alguns instantes enquanto ?? solicitado a libera????o do scanner.”, “Informa????o”);
                    return;
                }
            }


            // Fecha o dispositivo e a ger??ncia
            CloseDeviceAndDeviceManager();
        }

Pronto! O scaneamento ?? realizado e ?? gerado um arquivo JPG. Reparem que est?? comentado o atributo _device.FileFormat porque nem todo scanner d?? a possibilidade de configura????o. Alguns aceitam e outros n??o. Se utilizar alguma configura????o que o scanner n??o suporta, deve aparecer a mensagem: “Failed to get/get to capability”. Ent??o voc?? precisa deixar apenas as configura????es que o scanner suporte.
Bons scans!

Categorias
api hotspot html integra????o ip linux mikrotik rede ssl tcp windows

Adicionando uma p??gina de cadastro de usu??rios (Hotspot) em ASP.NET no Mikrotik

Cada projeto que pego, ?? uma aventura nova a ser encarada! Dessa vez me adentrei no universo de Linux, rede, SSH, infra e tudo o que ?? direito. Quem n??o conhece, a Mikrotik ?? uma empresa de grande refer??ncia no que tange em equipamentos para redes de computadores. Seu principal destaque ?? o RouterOS que ?? sistema operacional que torna o roteador um poderoso gerente de rede. Dentro do Mikrotik (irei me referenciar sempre dessa forma generalizando como um produto), h?? o HotSpot. Com ele pode-se gerenciar quem ir?? autenticar na rede para usar a internet (ou apenas a intranet), banda usada, taxa de transfer??ncia e outras funcionalidades por usu??rio ou de forma geral. Um exemplo de uso desse sistema ?? de quando voc?? vai a uma rede corporativa onde precisa autenticar-se para usar a internet… ?? isso!

Qual ?? o objetivo desse artigo ent??o? A princ??pio ?? apenas obter as p??ginas originais de hotspot do Mikrotik, colocar um redirecionador para uma p??gina externa, criar uma p??gina externa de cadastro de usu??rio (para que possa acessar a rede) e fazer funcionar. N??o ensinarei como configurar ou criar o hotspot. Pela net h?? v??rios tutoriais muito bons sobre o assunto e tamb??m n??o ?? de minha ??rea. Recomendo fortemente o f??rum da Under-Linux que l?? o pessoal manja muito no assunto.

Nesse artigo usei o Mikrotik MKBR100 que ?? bem f??cil de usar: basta plugar o cabo de rede da internet, do servidor e da energia. Pronto!

Para acessar seu SO, deve-se utilizar o Winbox como se fosse um daqueles players de m??quina virtual ou OpenSSH. Vamos l?? colocar a m??o na massa!

Conecte o cabo de rede de seu PC (ou servidor) na porta (interface) ether2 do Mikrotik. Agora conecte outro cabo na ether1 para os outros computadores da rede (ou roteador simples). Porqu?? na ether1? Estou considerando que o hotspot est?? configurado para monitorar essa interface enquanto a ether2 ser?? utilizado para que o servidor de comunique com o aparelho. Seria algo do tipo:

V?? em IP > Address no Mikrotik para que sejam configuradas as interfaces e sejam endere??ados conforme os exemplos abaixo:

  • ether1: 192.168.88.1
  • ether2: 192.168.88.2

Somente atrav??s de IP que ser?? poss??vel enviar os arquivos do hotspot. Se ficar conectando, via MAC, pelo Winbox, voc?? ter?? a mensagem de erro: “router has been disconnected” (logo, conecte-se usando a ether2 – 192.168.88.2). E outra coisa ??: se n??o seguir o esquema acima, outros erros voc?? ter??, como:

could not connect to … no response
could not connect to … connection refused

could not connect to … network is unreachable
could not fetch index from … not found

Tudo isso por causa de configura????o apenas! ?? bom deixar o IP do servidor fixo para que possa dar permiss??o de porta, firewall, etc. No caso deixei como 192.168.88.30 (que no caso era minha pr??pria m??quina). Uma dica: ??s vezes d?? um reboot no aparelho!

O pr??ximo passo ?? ativar a porta da API que o Mikrotik disp??e para integra????o com linguagens de programa????o. ?? atrav??s dela que iremos conectar e fazer a comunica????o. S?? que precisamos ativ??-la. V?? em IP > Services e ative a API na porta 8728.

Tamb??m libere, no Firewall, as portas para conex??o tanto do sistema quanto do Winbox (pelo IP), sen??o quando estiver acessando pela p??gina de cadastro, ir?? surgir o erro: “nenhuma conex??o p??de ser feita porque a m??quina de destino as recusou ativamente ..:8728.”.

Para permitir a navega????o e envio de informa????es, adicione as permiss??es no Walled Garden.

Vejam que at?? o momento tudo ?? configura????o e nada de programa????o. Continuemos…

Agora vamos em Files e selecione todos os arquivos da pasta hotspot, arraste para sua ??rea de trabalho que ser?? copiado. Para enviar fa??a o processo inverso… Se estiver acessando pelo IP vai dar certo, sen??o cair?? a conex??o (lembra que disse acima?).

Abra o HTML da p??gina login.html e acione um link para a p??gina de cadastro que ficar?? hospedada no servidor. Adicionei o link <a href=“http://192.168.88.30/mikrotik/cadastro.aspx”>cadastre-se</a> . Customize as demais p??ginas como desejar e as envie de volta. Praticamente terminamos de trabalhar no Mikrotik.

Agora vem o mais simples: criar a p??gina ASP.NET. Voc?? pode utilizar qualquer linguagem de programa????o que possa usar TCP na comunica????o e que a API suporte: PHP, Delphi, C, C++, C#, Flash, Ruby on Rails, Java, Python, VB.NET, etc.

Fa??a o download da classe MK, em C# (eles j?? disp??e de classes prontas para outras linguagens tamb??m), nesse link aqui e adicione no seu projeto. Agora crie um Web Form adicionando os campos que queira trabalhar. No meu exemplo, s?? quis login (username) e senha. Adicione um Button e um m??todo para executar o cadastro do usu??rio conforme exemplo abaixo:

             // Autentica????o
            MK mikrotik = new MK(“192.168.88.2”);
            if (!mikrotik.Login(“admin”, “”))
            {
                ScriptManager.RegisterStartupScript(Page, typeof(Page), “alert”, “alert(‘Houve um problema de comunica????o com o Hotspot! Por favor, tente mais tarde.’);”, true);
                mikrotik.Close();
                return;
            }

            // Requisi????o
            mikrotik.Send(“/ip/hotspot/user/add”);
            mikrotik.Send(“=name=” + nome.Text);
            mikrotik.Send(“=password=” + senha.Text, true);

            //Retorno
            string retorno = string.Empty;
            foreach (string h in mikrotik.Read())
            {
                if (retorno != string.Empty)
                    retorno += “, “;
                retorno += h;
            }

            // Fecha objeto
            mikrotik.Close();

            // Valida????o
            if (retorno.ToLower().Contains(“!done=ret=”))
                ScriptManager.RegisterStartupScript(Page, typeof(Page), “alert”, “alert(‘Cadastro realizado com sucesso!’); location.href=’http://192.168.88.1/login.html’;”, true);
            else if (retorno.ToLower().Contains(“message=failure: already have user with this name for this server”))
                ScriptManager.RegisterStartupScript(Page, typeof(Page), “alert”, “alert(‘J?? existe um usu??rio com esse nome!’);”, true);
            else
                ScriptManager.RegisterStartupScript(Page, typeof(Page), “alert”, “alert(‘Falha no cadastro: “ + retorno + “!’);”, true);

Voc?? poderia n??o s?? fazer o cadastro de usu??rio no hotspot como tamb??m executar qualquer comando (SSH) no Mikrotik. Lembrando que eu atropelei muita coisa a?? no que diz respeito a configura????o do dispositivo na qual disse logo no in??cio que n??o era minha finalidade. Voc??s observaram que a parte de programa????o ?? bem simples do que configura????o… e com certeza ??! Agora nunca ir?? sair de minha cabe??a a palavra Mikrotik Mikrotik Mikrotik Mikrotik Mikrotik … Por favor, qualquer erro ou informa????o adicional me avise!

[]’s

UPDATE: disponibilizei uma implementa????o no post http://thiagomarcal.blogspot.com.br/2016/09/implementacao-do-aspnet-c-com-o.html

Categorias
dicas iis plesk seguran??a windows

Recuperando a senha da conta identidade do Pool de Aplicativos do Plesk no IIS

Mais um t??tulo longo… um tanto confuso, mas em resposta a uma d??vida de um amigo:

“Exclui um Application Pool no IIS e nela estava configurada uma conta interna do Plesk: IWAM_plesk. N??o sei a senha utilizada. Tem como recuperar a senha para recriar um novo application?”

Sim! O Plesk sempre nos pregando aquela pe??a… Os dois pools que o Plesk utiliza est??o vinculados ?? conta IWAM_plesk (conta interna) para que possam manipular corretamente os arquivos e seus aplicativos (bem como as permiss??es necess??rias) no sistema operacional:

  1. plesk(default)(2.0)(pool)
  2. plesk(default)(4.0)(pool)

 Ent??o fa??amos as seguintes etapas:

  • Abra o Prompt de Comando em Modo Administrador;
  • Navegue para a pasta C:Windowssystem32inetsrv;
  • Execute o comando appcmd.exe list apppool ???plesk(default)(2.0)(pool)??? /text:*
Aparecer?? a descri????o completa desse pool. Procure a entrada referente ao usu??rio e senha do Plesk conforme a figura abaixo:
Agora voc?? tem a senha do usu??rio! No site de Dhiraj tem mais detalhes acerca desse tipo de recupera????o.
Categorias
banco de dados cloud server crystal reports dll erros iis locaweb plesk sql server windows

Mega Post de Erros

Lidar com erros ?? algo realmente muito chato… Chato demais! Esses dias fui convocado para fazer um certo trabalho de migra????o entre servidores. Um desses servidores era um Cloud Server Pro da Locaweb. Em muitos posts que aqui escrevi tem um pouco retratando sobre a Locaweb. Trabalho e j?? trabalhei muito com ela e sei de todos os seus passos e “artimanhas” de atendimento… O antigo Cloud Server foi at?? tranquilo de trabalhar, mas esse novo… Vamos aos problemas!

Uma dica que dou sempre quando algu??m quer contratar um servidor: leiam muito sobre os pr??s e contras. Os pr??s vejam no pr??prio site do prestador, os contras vejam nos relatos de usu??rios. No post a seguir n??o estou jogando a Locaweb contra a parede, apenas estou expondo erros que podem ser sanados de forma f??cil mas que burocraticamente ?? jogado para o cliente se virar (nos 30!).

Nesse Cloud Server vem embutido o Plesk. Em poucas palavras serve para gerenciar a hospedagem atrav??s de uma interface web. ?? uma boa ferramenta de ger??ncia, tem tudo para gerenciar sua hospedagem. S?? que esse demais gera ocupa????o demais (redund??ncia) de espa??o em disco. Dos 50 Gb que voc?? contrata, 40Gb ?? para o sistema operacional e 10Gb para seus arquivos. Sendo que dos 10Gb ?? para todos os seus arquivos, e-mails, banco de dados, etc. Ou seja, apenas usufrui dos 10Gb um pouco menos que 9Gb e olhe l??.

Bem, dizem que vem tudo preparado e instalado para usar… Verdade at?? certa parte! Quem est?? usando e ?? iniciante vai ver que ?? mil maravilhas. D?? para fazer o b??sico de tudo. O problema vem a seguir…

Um cliente contratou o Cloud Server gerenciado pelo cliente (ou seja, sobrou para o usu??rio final) e me passou para configurar e deixar no ponto de uso fazendo toda a migra????o e instala????o. Em um passe de m??gica surgem os problemas…

Os bancos de dados que vem s??o o MS SQL Server 2008 e o MySQL. N??o h?? interface para dump e recovery das bases for??ando a usar o Plesk para isso, mas n??o queria. Onde est?? o Management Studio 2008? Onde est?? o MySQL Workbench? Como vou fazer para migrar as bases? Gerar script de bancos gigantes? Nem pensar! Preciso instalar!

Mas como instalar esses aplicativos? Se fazer download, gera tr??fego. Se pedir para a Locaweb tem que pagar e se pedir, de gra??a, n??o instala! Lembrando que esses aplicativos, no m??nimo, s??o gratuitos e deveriam estar em uma zona em que os usu??rios pudessem obt??-los de forma f??cil e sem cobran??a. Pois bem, feito o download, hora de instalar. Abrindo o execut??vel (lembrando que tem que ser a da vers??o 64bits) d?? aviso de incompatibilidade. ?? preciso instalar o Service Pack 1 do SQL Server 2008 (mais tr??fego). Baixado o SP1 ?? preciso instal??-lo. Tranquilo e instalado sem problemas. Hora de instalar o Management Studio

Ao tentar abrir, outro problema?!?! ?? preciso do Framework 3.5! Incrivel… No Cloud Server vem instalado a vers??o 2.0 e 4.0 do Framework ASP.NET mas n??o tem a 3.5 ativado. Menos mal, porque no Windows Server 2008 ?? nativo, basta ativar. Realize os seguintes passos (retirado do Wiki):

  1. Clique em Start, Administrative Tools e selecione Server Manager;
  2. Na interface, clique em Features e clique em Add Features;
  3. Selecione a primeira op????o .NET Framework 3.5.1 Features e adicione todos seus dependentes;
  4. Conclua a instala????o do Framework.

Agora sim, tudo pronto! Vamos instalar o Management Studio. Clica no instalador e… Erro! Caramba… de novo!

TITLE: SQL Server Setup failure.
——————————-


SQL Server Setup has encountered the following error:


Invoke or BeginInvoke cannot be called on a control until the window handle has been created.

A dica ??: feche o Windows Explorer! Por algum motivo, a instala????o do Management Studio n??o inicia quando o Windows Explorer estiver em aberto. Copie para a ??rea de Trabalho e abra o instalador… Agora sim! Depois de tanta malemol??ncia pelo menos iniciemos a instala????o. Para quem tem d??vidas e um passo-a-passo bem explicativo de como instalar o Management Studio, acesse aqui o post de Marcos dell Antonio. H?? uma dica bem interessante que pode confundir o usu??rio na hora da instala????o. Terminado a instala????o, menos um item da lista de afazeres.

Consegui conectar ao SQL Server local, criei as bases, usu??rios, fiz restores, configurei o backup, providenciei tudo o que tinha que fazer onde o Plesk jamais pensaria em um dia ser. Agora o principal, testar um website. Publiquei o site no IIS e abri o navegador para visualizar. Erro!

Could not load type ‘System.ServiceModel.Activation.HttpModule’ from assembly ‘System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089’.

Sabe o porqu?? disso? Eu instalei o ASP.NET 3.5 depois que eu j?? tinha a vers??o 4.0 instalada por causa do Management Studio ent??o gerou conflito nas DLL’s. Para resolver, fa??a o seguinte:

  1. V?? para a pasta C:WindowsMicrosoft.NETFramework64v4.0.30319;
  2. Execute o comando aspnet_regiis.exe -iru

Agora vamos testar! Abri o navegador e digitei o endere??o e… Mais erro!

There is a duplicate ‘system.web.extensions/scripting/scriptResourceHandler’ section defined

Mais conflitos! Se voc?? tiver outra vers??o do System.Web.Extensions instalado, devido ao ASP.NET AJAX por exemplo, a vers??o que est?? no GAC do sistema difere da que voc?? quer chamar ocorrendo ambiguidade. O correto seria alterar os assemblys mas como isso ?? muito trabalhoso e pode acontecer algum imprevisto para aqueles que n??o sabem manuse??-las, ent??o aconselho o seguinte: remova toda a sectionGroup do seu web.config ou comente-as:

<!–
<sectionGroup name=”system.web.extensions” type=”System.Web.Configuration.SystemWebExtensionsSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
<sectionGroup name=”scripting” type=”System.Web.Configuration.ScriptingSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
<section name=”scriptResourceHandler” type=”System.Web.Configuration.ScriptingScriptResourceHandlerSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication” />
<sectionGroup name=”webServices” type=”System.Web.Configuration.ScriptingWebServicesSectionGroup, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″>
<section name=”jsonSerialization” type=”System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”Everywhere” />
<section name=”profileService” type=”System.Web.Configuration.ScriptingProfileServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication” />
<section name=”authenticationService” type=”System.Web.Configuration.ScriptingAuthenticationServiceSection, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ requirePermission=”false” allowDefinition=”MachineToApplication” />
</sectionGroup>
</sectionGroup>
</sectionGroup>
–>

No caso comentei o sectionGroup do System.Web.Extension que pode estar na vers??o 1.0, 2.0 ou 3.5 que for.

Agora vamos l??! De p??s juntos e m??os dadas: Abre o navegador e… e… e… Funcionou! Depois de um ??rduo trabalho aparentemente tudo estava normal. Vamos testar outros sites e… e… e… Mais erros!

Quem ainda n??o est?? acostumado a trabalhar com Windows Server 2008 e IIS 7 ter?? que aprender muito sobre permiss??es e tratamento de erros. Incontestavelmente a tela do erro 500 ir?? aparecer e muito se sua aplica????o n??o estiver configurada adequadamente para o IIS 7. Nem sempre a mesma aplica????o que est?? no IIS 6 ir?? funcionar no IIS 7. Ent??o eis que surge a tela do Erro 500 Erro Interno do Servidor ou Error 500 Internal Server Error:



Ou ent??o:

D?? para descobrir o que ??? Vou dar a dica: revise seu web.config. “Ah, mas est?? tudo certo, n??o sei porque n??o funciona…”. Engano, est?? errado. J?? disse que o IIS 7 ?? chato, muito chato. O parser dele ?? muito minucioso e se n??o estiver nos padr??es vai dar problema.

Se voc?? n??o sabe utilizar bem o IIS e tem medo de alterar uma coisinha ali e outra acol?? vou dar a maior dica: saia abrindo cada op????o do painel da aplica????o at?? que uma delas acuse um erro de configura????o.

Por exemplo, abra o item Documento Padr??o. Se ele estiver configurado corretamente ent??o abrir?? a pr??xima tela normalmente. Se tiver algum erro, aparecer?? um alerta. Ent??o no web.config voc?? deve corrigir a sess??o correspondente. Ficou claro? Saia clicando um a um at?? que um deles se denuncie podendo ent??o fazer a corre????o.

O que ocorreu comigo foi que um site que estava no IIS 6 podia colocar a mesma p??gina (index.aspx) como padr??o, duas vezes, e n??o tinha problema. Quando foi para o IIS 7, na qual estava herdando a configura????o pai, e foi adicionar a p??gina index.aspx como padr??o novamente, ele dava erro e n??o sabia porqu??. Ent??o removi a entrada do web.config e funcionou. Desabilitar a mensagem de erro amig??vel no navegador vai funcionar (encontrar o erro)? N??o. Desabilitar as p??ginas de erros personaliz??veis do IIS vai funcionar (encontrar o erro)? Talvez ou n??o. Depende muito do ambiente que est?? configurado e quem est?? manipulando.

Pronto! Mais um problema solucionado… Vamos testar outro site e… e… e… Erro! Agora aconteceu um erro 404. Mas como? Erro 404 de p??gina n??o encontrada mas se o caminho est?? l??? Incrivelmente no IIS do Cloud Server possuem dois Applications Pools do Plesk (e mais outros nativos): Plesk(default)(2.0) e Plesk(default)(4.0). O pool do 2.0 quase nem sempre funciona. E um comportamento anormal ?? que se voc?? tem um site pai em 2.0 e um filho em 2.0 ??s vezes p??ra de funcionar. O “correto” ?? ter um pai 2.0 ou 4.0 com filho sempre 4.0. Estranho? Pode crer! E onde est?? o pool do 3.5? Tem que criar na m??o mesmo.

Nota: Se voc?? reiniciar o IIS o Plesk p??ra de vez e n??o volta:

Voc?? ter?? que inici??-lo manualmente. Mas antes ter?? que iniciar seu pool tamb??m (que ?? muito suspeito):

 Ajeitado uma coisinha ali, outra aqui, vamos testar mais algumas coisas e… e… e… Quase tudo certo. Em quest??o de funcionalidade (que deveria ser) est?? quase tudo certo a n??o ser o funcionamento do bom e velho Crystal Reports. Quem j?? leu o post de erros do Crystal aqui e aqui nos deparamos com o erro:

O inicializador de tipo de ‘CrystalDecisions.CrystalReports.Engine.ReportDocument’ acionou uma exce????o

ou

The type initializer for ‘CrystalDecisions.CrystalReports.Engine.ReportDocument’ threw an exception

Cuidado! Esse n??o ?? o descritivo do erro. S?? com isso n??o d?? para saber o motivo. Fa??a o debug, log,  exibi????o da pilha ou na pr??pria tela exiba o erro (sem ter AJAX) que teremos o erro completo. No link dos dois posts anteriores que fiz explica o problema do Crystal na plataforma 64bits e como pode resolver. S?? que o problema no meu caso era permiss??o.

Server Error in ‘/virtual_directory_name’ Application.
Error in File UNKNOWN.RPT:
The request could not be submitted for background processing.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.


Exception Details: System.Runtime.InteropServices.COMException: Error in File UNKNOWN.RPT: The request could not be submitted for background processing.

Os usu??rios listados abaixo, n??o tinham permiss??o na execu????o de scripts DCOM e grava????o em algumas pastas (principalmente as que est??o na unidade C):

  • IWAN_plesk(default)
  • IUSR
  • IIS_IUSR
  • NETWORK SERVICE
  • INTERACTIVE

Esses s??o os usu??rios que devem ter privil??gio (descritos abaixo) nas pastas listadas abaixo:

  • C:WindowsTemp : leitura escrita
  • C:Program Files (x86)Business ObjectsCommon2.8bin : leitura
  • C: : leitura

Obs: Para alguns servidores ?? preciso aplicar o Replace permission entries on all child objects nessas pastas.

Lembrando de reiniciar o IIS e/ou o servidor para recarregar as configura????es.

Se estiver trabalhando com Windows Service ou Windows Form e ocorra o erro:

System.IO.FileNotFoundException: Retrieving the COM class factory for component with CLSID {5FF57840-5172-4482-9CA3-541C7878AE0F} failed due to the following error: 8007007e

Basta compilar sua aplica????o em x86.

E agora, tudo certo? At?? o momento sim. Porque n??o dizer que est?? tudo OK? Depois de ter ocorrido todos esses problemas, fica-se receoso com o futuro. Pode ser que ocorra outro problema posteriormente? Sim e ir??.

Conforme disse anteriormente, o post n??o ?? para dizer mal sobre a Locaweb e/ou Plesk. Acho que eles prestam um servi??o adequado para o n??vel nacional (at?? uso) contudo s??o coisas que acontecem que simplesmente poderiam ser sanadas antes de jogar o pepino para o cliente. Se voc?? tiver algum problema desses e sua ger??ncia for pelo cliente, nem adianta pedir que eles v??o lhe informar: “o gerenciamento ?? por conta do cliente e n??o nos responsabilizamos” ou “a ferramenta (Plesk) ?? terceirizada e n??o prestamos suporte.”. Enfim, espero que o post ajude a voc??, cliente e usu??rio, a corrigir seus problemas/pepinos que ocorrerem. Isso me lembra quando lan??ou o plug-and-play… a velha piadinha do plug-and-pray (ligar e rezar) n??o some da cabe??a quando ocorre esse tipo de problema. Porque ser???

Categorias
dicas som windows winform

Tocando/Emitindo som com C#

Dica r??pida para emitir um som com C# usando a API do Windows: basta importar a fun????o PlaySound. Crie a lista enumerada e importe a DLL utilizando os seguintes c??digos:

        // FLAGS DE SOM
        [System.Flags]
        public enum PlaySoundFlags : int
        {
            SND_SYNC = 0x0000,
            SND_ASYNC = 0x0001,
            SND_NODEFAULT = 0x0002,
            SND_LOOP = 0x0008,
            SND_NOSTOP = 0x0010,
            SND_NOWAIT = 0x00002000,
            SND_FILENAME = 0x00020000,
            SND_RESOURCE = 0x00040004
        }


        // IMPORTA????O DO COMPONENTE DE SOM
        [DllImport(“winmm.dll”, EntryPoint = “PlaySound”, SetLastError = true, CharSet = CharSet.Unicode, ThrowOnUnmappableChar = true)]
        private static extern bool PlaySound(string szSound, System.IntPtr hMod, PlaySoundFlags flags);

N??o precisa copiar a DLL para a aplica????o uma vez que ele busca na biblioteca do pr??prio Windows.

Para tocar, execute o m??todo (exemplo):

PlaySound(“sound.wav”, new System.IntPtr(), PlaySoundFlags.SND_ASYNC);

Sempre use a flag PlaySoundFlags.SND_ASYNC (forma ass??ncrona). ?? aconselh??vel usar ela do que PlaySoundFlags.SND_SYNC (forma s??ncrona) se estiver trabalhando com outro processamento em paralelo. Ou seja, ap??s o som, se for realizar algum outro m??todo ou trecho de c??digo. De forma ass??ncrona ele ir?? tocar e continuar com o processamento do c??digo que tiver logo abaixo (paralelo). De forma s??ncrona pode haver lentid??o no processo pois ?? vezes o som pode demorar a tocar ou ter que esperar terminar para prosseguir (cont??nuo). Fa??a os testes antes para ver o diferencial.

Agora sim! Volte ao post do Microterminal e adicione sua fun????o para tocar um som quando apertar * (asterisco).

Categorias
dicas ip microterminal rede tcp windows

Comunicando com microterminal em ASP.NET

Quem j?? foi em supermercado e nunca viu aquelas maquininhas que o operador fica digitando? Pois ??… estamos falando dela mesma. Parece ser f??cil seu uso, mas quem come??a a trabalhar com elas ?? de perder os cabelos.

Nesse artigo veremos como comunicar com um microterminal via TCP/IP e trocar informa????es (ida e volta). Para isso vamos utilizar o modelo da Gertec MT 720. Uma breve descri????o do aparelho e seu uso (retirado daqui):

“O MT 720 ?? um excelente microterminal que opera em rede Ethernet com protocolos TCP-IP. Seu teclado com 20 teclas program??veis pode ser utilizado com fun????es espec??ficas de atalhos para agilizar a opera????o.

As teclas re-legend??veis permitem a identifica????o da fun????o de cada tecla. O display com back light (iluminado), com 20 caracteres por 2 linhas, permite facilmente a visualiza????o da informa????o, principalmente em ambientes que possuem pouca ilumina????o, como bares noturnos, por exemplo.

Atrav??s de uma porta de teclado (AT/PS2) e mais 3 portas Seriais (RS-232) ?? poss??vel a conex??o de perif??ricos como: Leitor de C??digo de Barras, Display de Cliente, Balan??a, Impressora, etc.

O MT 720 ?? ideal para aplica????es de Cart??o de Consumo, solu????es para Bares, Lanchonetes, Restaurantes Self-Service, Livrarias, Papelarias, apontamento de produ????o em Ind??strias.”

Na pr??pria p??gina do dispositivo (citada acima) tem alguns downloads de arquivos, dentre eles alguns c??digos-fontes com exemplos de como fazer a comunica????o bem como realizar as opera????es pelas quais foi criado. Um por??m: s?? tem dispon??veis nas linguagens C++, Delphi e VB (n??o ?? VB.NET).

Da?? pensamos: “sem problemas! ?? s?? converter pra VB.NET a partir do VB”… Tamb??m pensei nisso e n??o consegui! Dando uma olhada de perto no c??digo-fonte d?? para saber que as proezas encontradas s??o s?? poss??veis por artif??cios que a linguagem oferece: por exemplo, ponteiros. Quem j?? programou em VB via a grande flexibilidade da linguagem de fazer tudo o que quer e do jeito que era mais conveniente. Maravilha! Pena que tenhamos que seguir certos padr??es. Fica a dica: se n??o quiser perder tempo, pegue logo o c??digo prontinho l?? na p??gina do fabricante (vem tamb??m no CD quando compra o aparelho) e utilize. De prefer??ncia use o Delphi e em seguida em VB. Se quiser aventurar vamos com C#…

Se escolheu C# siga lendo pois, em diante, veremos como fazer… Teremos os seguintes objetivos na implementa????o:

  1. Criar uma ??nica aplica????o que ir?? receber e enviar os dados;
  2. Exibir o que foi digitado tanto no microterminal quanto no monitor.

Instala????o

Leia o manual do usu??rio aqui. Em resumo: ligue o microterminal na rede el??trica e conecte na porta traseira um cabo RJ-45 no dispositivo e a rede. Em seguida configure, no microterminal, o IP do Servidor (no meu caso, considerei minha m??quina local com o IP 192.168.1.100, por exemplo). Demais configura????es a seu gosto…

Implementa????o

Criemos um Windows Form. Coloquei alguns controles para embelezar a aplica????o…

O mais importante ?? adicionar um objeto Timer. Os demais coloquei para gerar a aplica????o final (que ficar?? no tray – perto do rel??gio – e outras coisas fru-frus). Configure seu Timer com Interval de 50. Pegue a DLL pmtg.dll e copie para sua aplica????o. Eu disse copie! Voc?? n??o conseguir?? aplicar Reference sobre ela. Clique com o bot??o direito sobre a DLL e escolha Properties. Em Copy to Output Directory coloque Copy Always.

Agora vamos ao c??digo! Clique sobre o WinForm e escolha View Code. Cole os c??digos abaixo para que possamos us??-las no form:

        // VARI??VEIS
        IntPtr v_Hwnd;
        int statusCard;
        int statusSerial;
        int MsgReceiveData = 1;
        string[] dados = new string[255];


        // INICIALIZA????O DE FUN????ES EXTERNAS
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_startserver(IntPtr mywhnd, int conecmsg, int commumsg);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern void mt_finishserver();
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_getkey(int id, StringBuilder str);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_backspace(int id);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_dispstr(int id, string str);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_dispch(int id, char ch);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        public static extern int mt_dispclrln(int id, int lin);
        [DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]]
        public static extern int mt_gotoxy(int id, int lin, int col);

Em seguida adicionamos as duas fun????es primordiais: in??cio (quando carregar o formul??rio) e t??rmino (quando fechar o formul??rio):

        private void MicroTerminal_Load(object sender, EventArgs e)
        {
            v_Hwnd = this.Handle;
            statusCard = 0;
            statusSerial = 0;
            if (mt_startserver(v_Hwnd, 0, MsgReceiveData) == 1)
            {
                temporizadorLista.Enabled = true;
            }
            else
                MessageBox.Show(“N??o foi poss??vel carregar os m??dulos de conex??o ?? leitora!”);
        }

        private void MicroTerminal_FormClosed(object sender, FormClosedEventArgs e)
        {
            temporizadorLista.Enabled = false;
            mt_finishserver();
        }

Lembrando que esses eventos devem estar configurados (n??o ?? apenas copiar e colar o c??digo, lembra? deve-se indicar l?? em Events do Form). Com isso, ao fazer o primeiro teste, sua aplica????o j?? estar?? recebendo dados do microterminal. Em seguida devemos adicionar um evento Tick ao Timer. Ou seja, a cada 50 milisegundos (lembra que colocamos com esse valor) ir?? ser executado um determinado m??todo.

Antes disso vamos criar um m??todo que ir?? limpar a tela do microterminal e reiniciar os dados de entrada:

                 private void ReiniciaEntrada(int i)
        {
            // Limpa as duas linhas e o que foi armazenado
            dados[i] = “”;
            mt_dispclrln(i, 1);
            mt_dispclrln(i, 2);
            // Coloca o cursor na primeira linha e prepara o display
            mt_gotoxy(i, 1, 0);
            mt_dispstr(i, “Numero: “);
            mt_gotoxy(i, 2, 0);
        }

Enfim adicionamos o c??digo que ir?? ler temporariamente cada leitora conectada ?? rede e coletar/processar os dados de acordo com o que desejar. No meu caso deixei o seguinte:

        private void temporizadorLista_Tick(object sender, EventArgs e)
        {
            StringBuilder rntStr = new StringBuilder();
            int i = 0;
            // Loop em toda faixa de Ips ??teis: cada leitora conectada na rede
            while (i < 255)
            {
                // Captura algo do teclado
                if (mt_getkey(i, rntStr) == 1)
                {
                    string chrAsHex = ((int)rntStr[0]).ToString(“x”);
                    // Entrada do display caso seja um n??mero
                    if ((chrAsHex == “3030”) || (chrAsHex == “30”) || (chrAsHex == “31”) || (chrAsHex == “32”) || (chrAsHex == “33”) || (chrAsHex == “34”) || (chrAsHex == “35”) || (chrAsHex == “36”) || (chrAsHex == “37”) || (chrAsHex == “38”) || (chrAsHex == “39”))
                    {
                        if (dados[i].Length >= 20)
                            dados[i] = dados[i].Substring(0, 19) + rntStr[0];
                        else
                            dados[i] += rntStr[0];
                        mt_dispch(i, rntStr[0]);
                    }
                    // Se for um ENTER, d?? a entrada na tela para mostrar
                    else if (chrAsHex == “d”)
                    {
                        // Captura e trata a entrada
                        if (dados[i] != “”)
                        {
                            // Faz o processamento do que desejar em dados[i]
                        }
                        // Limpa tela
                        ReiniciaEntrada(i);
                    }
                    // Se for um ESC, apaga tudo
                    else if (chrAsHex == “1b”)
                    {
                        // Limpa tela
                        ReiniciaEntrada(i);
                    }
                    // Se for backspace apaga ??ltimo caractere do display
                    else if (chrAsHex == “8”)
                    {
                        if (dados[i].Length > 0)
                            dados[i] = dados[i].Substring(0, dados[i].Length – 1);
                        mt_backspace(i);
                    }
                    // Se apertar * toca o som
                    else if (chrAsHex == “2a”)
                    {
                        // Toca um sonzinho… depois publico o c??digo de tocar som!
                    }
                }
                i++;
            }
        }

Feito! Rode sua aplica????o e digite algo no teclado do microterminal e ver?? que o que est?? sendo digitado est?? indo tanto para a aplica????o quanto para o display (no microterminal). A sa??da seria algo do tipo:

Se precisar de sa??da na tela crie um outro WinForm que ocupe toda tela (sua) e captura o que est?? no display do microterminal. Assim ?? mais f??cil! Ou fa??a do jeito que sua imagina????o mandar! O mais dif??cil j?? passou…

Para quem quiser capturar os IPs de cada microterminal, utilize os m??todos:

[DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern TTABSOCK mt_connectlist();

ou

[DllImport(“pmtg.dll”, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
public static extern StringBuilder mt_ipfromid(int id);

Nessas fun????es tem algumas particularidades muito chatinhas de se trabalhar (veja no manual das fun????es) por isso deixei de lado. Principalmente a classe:

    [StructLayout(LayoutKind.Sequential)]
    public struct TTABSOCK
    {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
        public UInt32[] TSOCK;
    }

Quem quiser se aventurar nela, fica a?? a dica. Esse artigo merecia at?? uma v??deo-aula, mas a pregui??a ??s vezes ?? muito forte! ?? at?? legalzinho ter esses desafios, mas ??s vezes se torna muito chato quando n??o consegue. Enfim, quanto menos se estressar, melhor! Ent??o tente usar as implementa????es que j?? a Gertec j?? disponibilizou, caso n??o queira aventurar, a menos que precise de algo mais espec??fico.
Falar que nem Marcoratti: “eu sei, ?? apenas ASP.NET, mas eu gosto!”

Categorias
dicas iis windows

Corrigindo dois erros em uma tacada s??: O provedor ???Microsoft.Jet.OLEDB.4.0??? n??o est?? registrado na m??quina local e O inicializador de tipo de ‘CrystalDecisions.CrystalReports.Engine.ReportDocument’ acionou uma exce????o.

Problema: Porque o sistema operacional ?? 64bits.
Solu????o: Modo de compatibilidade em 32bits.

Bom se todo post fosse assim t??o r??pido para solucionar nossos problemas. Agora vamos alongar mais as respostas e enriquecer nosso conte??do:

1) O provedor ???Microsoft.Jet.OLEDB.4.0??? n??o est?? registrado na m??quina local

Se por ventura voc?? recebeu esse erro ao executar uma query em um banco de dados usando OleDb mesmo que tenha o Microsoft Office instalado corretamente ?? porque provavelmente a vers??o do driver instalado ?? para 32bits. Para corrigir isso, sua aplica????o deve rodar em 32bits (x86). Nesse post aqui ?? mostrado como compilar sua aplica????o desktop em x86 exclusivamente solucionando o problema. Mas para quem usa aplica????es desktop ter?? que mudar a configura????o do pool de aplica????o no IIS. Para isso v?? no IIS, Pools de Aplicativos e selecione o Pool usado pelas suas aplica????es. Clique em Configura????es Avan??adas e no item Habilitar Aplicativos 32bits configure para True.

2) O inicializador de tipo de ‘CrystalDecisions.CrystalReports.Engine.ReportDocument’ acionou uma exce????o

Caso bem semelhante ao anterior ocorre se sua m??quina ?? 64bits e instalar o Crystal Reports 32bits (x86). O modo de compatibilidade que o Windows coloca para aplica????es instaladas n??o funciona no caso. Para resolver isso basta instalar a vers??o 64bits do Crystal Reports (x64). Mas se voc?? realizou o passo acima e est?? habilitado o modo de compatibilidade de 32bits no IIS ent??o ter?? que usar a vers??o 32bits do Crystal de qualquer jeito.

Categorias
certificado digital linux nfe nota fiscal eletr??nica salvador windows xml

Usando Certificado Digital para Nota Fiscal Eletr??nica no Windows Server 2003/2008

Desde que lan??aram a nota fiscal eletr??nica, n??s programadores ficamos com receio do uso das leitoras e cart??es nos sistemas operacionais para a assinatura do XML usando o certificado digital. Geralmente os servidores usufruem de alguma vers??o do Windows Server para acomodar as aplica????es web (que realizam o processo de assinatura) al??m de proporcionar mais robustez e qualidade diante dos trabalhos. Mas as leitoras e cart??es simplesmente n??o funcionam como deveriam! Incompatibilidade… dizem.
Enfim… como fazer? Simplesmente ?? s?? usar outro sistema operacional!

“Mas como vou usar se meu servidor ?? Windows Server e n??o posso instalar outro SO?” (Voc?? se perguntando)

Resposta: Use os dois atrav??s de uma m??quina virtual! H?? v??rios tipos e para v??rios gostos ficando a crit??rio do que voc?? for utilizar. Recomendo o VMware! Ele disp??e de duas vers??es (h?? outras que voc?? pode optar tamb??m) que s??o ??timas para uso: Player e Server. Em resumo, a Player ?? limitada pois seu uso ?? simples mas n??o deixa de ser ??til.

Vamos ao processo que ser?? bem simples:

  1. Instale uma das vers??es do VMware;
  2. Instale um Windows 2000/XP/Vista nela contanto que seja compat??vel com sua leitora/cart??o (a instala????o ?? bem simples e sem dificuldades – ?? mais f??cil do que quando vai instalar no computador “de verdade” bastando seguir o Wizard dela);
  3. Agora conecte a leitora do cart??o no PC. Note que no Windows Server n??o acontecer?? nada, mas no Windows interno come??ar?? a instala????o;
  4. Em seguida espete o cart??o na leitora;
  5. Abra o utilit??rio da leitora (atrav??s do Windows da m??quina virtual) e ver?? que o cart??o foi lido corretamente.

Pronto! Da?? basta compartilhar uma pasta entre o Windows Server e a m??quina virtual (atrav??s do VMWare se faz isso) e, enquanto no Windows Server vai jogando os XMLs nessa pasta, o Windows MV (da m??quina virtual) vai assinando/enviando. Bem louco, n??o? Mas funciona! Pode at?? ter o Linux virtualizando um Windows que a leitora ir?? funcionar.