Erro de acesso negado ao conectar a impressora por USB

Como resolver o erro Acesso negado (Permission denied) ao conectar a impressora térmica por USB. No Windows, trocando o driver da porta pra WinUSB com o Zadig. No Linux, ajustando a permissão do dispositivo com uma regra de udev.

O erro acontece porque o sistema operacional já reivindicou a porta USB da impressora para o driver de impressão padrão, e o navegador não consegue reivindicar a mesma interface para falar diretamente com o dispositivo via WebUSB. A causa exata e a solução mudam entre Windows e Linux, então esse tutorial tem uma seção pra cada sistema.

Assistente de cadastro de impressora do FidMenu mostrando o erro Failed to execute open on USBDevice, Access denied
É esse o erro que aparece no assistente de cadastro de impressora quando o sistema operacional já reivindicou a porta USB para o driver de impressão padrão, seja no Windows ou no Linux.

Windows

No Windows, a solução é trocar o driver dessa porta USB por um chamado WinUSB, usando um programa gratuito chamado Zadig.

Antes de começar

Depois de trocar o driver para WinUSB, essa impressora normalmente some da lista de impressoras do Windows e para de funcionar em outros programas que imprimem nela como impressora comum, como o Word ou um leitor de PDF. Não é um defeito, é uma troca deliberada de como o Windows enxerga o dispositivo. Se isso for um problema pra sua loja, existe uma alternativa que não exige trocar driver nenhum: o agente local do FidMenu, disponível como opção Agente local no assistente de cadastro de impressora.

O que você vai precisar

  • Um computador com Windows.
  • Acesso de administrador nesse computador.
  • A impressora ligada e conectada por USB.

Passo a passo

  1. Feche o FidMenu e qualquer outro programa que esteja tentando imprimir antes de mexer no driver.
  2. Baixe o Zadig no site oficial, zadig.akeo.ie. Nunca baixe por espelhos ou links de terceiros.
  3. Clique com o botão direito no arquivo baixado e escolha Executar como administrador.
  4. No menu Options do Zadig, marque List All Devices. Sem essa opção marcada, a impressora não aparece, porque ela já tem um driver instalado.
Menu Options do Zadig aberto, com a opção List All Devices marcada
Menu Options do Zadig com List All Devices marcado. É esse passo que faz o dispositivo aparecer na lista principal mesmo já tendo um driver instalado.
  1. No menu principal, selecione o dispositivo certo pelo nome da impressora ou pelo par de números entre colchetes, chamado VID:PID. Se a impressora tiver mais de uma interface, use as setas ao lado do nome para navegar entre elas até achar a interface de impressão.
  2. No campo de driver à direita, use as setas verdes até aparecer WinUSB.
Zadig com o dispositivo selecionado e WinUSB já escolhido no campo de driver
Dispositivo selecionado no Zadig com WinUSB escolhido no campo de driver. Se o driver já bate, o botão aparece como Reinstall WCID Driver. Se for diferente do atual, aparece como Replace Driver.
  1. Clique no botão de instalar (o texto muda conforme o estado do dispositivo: Install Driver, Replace Driver, Upgrade Driver ou Reinstall WCID Driver) e aguarde a barra de progresso terminar.
Janela do Zadig confirmando The driver was installed successfully, com o status Driver Installation SUCCESS
Confirmação de sucesso do Zadig. O botão de instalar muda de nome conforme o estado do dispositivo (Install, Replace ou Upgrade Driver), mas a mensagem final é sempre essa.
  1. Desconecte e reconecte o cabo USB da impressora, para garantir que o Windows carregue o driver novo.
  2. Volte ao FidMenu, no assistente de cadastro de impressora escolha USB e tente conectar de novo. O navegador deve pedir permissão e listar o dispositivo normalmente.

Se ainda não funcionar

Abra o Gerenciador de Dispositivos do Windows e procure pela impressora. Se a troca de driver funcionou, ela aparece em Controladores USB (barramento serial universal), chamado de Universal Serial Bus devices no Windows em inglês, e não mais em Filas de impressão.

Gerenciador de Dispositivos do Windows com a árvore Controladores USB (barramento serial universal) expandida
É nessa seção, Controladores USB (barramento serial universal), que o dispositivo aparece depois da troca de driver. Se ele continuar em Filas de impressão, a troca ainda não pegou.

Se a impressora continuar aparecendo em Impressoras, repita o passo 5 conferindo se a interface selecionada é mesmo a de impressão, e não uma interface auxiliar do mesmo dispositivo.

Linux (Fedora e outras distribuições)

No Linux não existe driver pra trocar. O problema quase sempre é de permissão: por padrão, o arquivo de dispositivo da impressora no /dev pertence ao usuário root, e o navegador roda com o seu usuário comum, sem permissão pra abrir esse dispositivo diretamente. A solução é criar uma regra de udev liberando o acesso pra essa impressora específica.

O que você vai precisar

  • Um terminal com acesso a sudo.
  • A impressora ligada e conectada por USB.

Passo a passo

  1. Conecte a impressora e abra um terminal.
  2. Rode o comando lsusb. Se o comando não existir, instale o pacote com sudo dnf install usbutils no Fedora, ou sudo apt install usbutils no Ubuntu e Debian.
  3. Procure a linha da sua impressora na lista e anote o par de números depois de ID, no formato vendor:product. No exemplo abaixo, a impressora é a linha Philips (or NXP) USB Printer, com o par 0471:0055.
Terminal do Linux mostrando a saída do comando lsusb, com a linha Philips (or NXP) USB Printer destacada
Saída de lsusb com a linha da impressora destacada. O par de números depois de ID, aqui 0471:0055, é o vendor:product que vai na regra de udev.
  1. Crie um arquivo de regra em /etc/udev/rules.d/, por exemplo com sudo nano /etc/udev/rules.d/99-fidmenu-impressora.rules, e cole a linha abaixo trocando os números pelos que você anotou:
SUBSYSTEM=="usb", ATTRS{idVendor}=="0471", ATTRS{idProduct}=="0055", MODE="0666"
Arquivo de regra de udev aberto no nano, com a linha SUBSYSTEM usb e os números de idVendor e idProduct da impressora
O arquivo de regra aberto no nano, com idVendor e idProduct já preenchidos com os números anotados no lsusb.
  1. Salve o arquivo e recarregue as regras do udev:
sudo udevadm control --reload-rules
sudo udevadm trigger
  1. Desconecte e reconecte o cabo USB da impressora.
  2. Volte ao FidMenu, no assistente de cadastro de impressora escolha USB e tente conectar de novo.

Se ainda não funcionar

Se depois da regra de udev o erro mudar de Acesso negado para Failed to execute 'claimInterface' on 'USBDevice': Unable to claim interface, o driver usblp do kernel, o driver de impressora genérico do Linux, está segurando a interface antes do navegador conseguir reivindicar o dispositivo. Isso acontece com qualquer impressora que se identifique como classe genérica de impressora no USB. Rode lsusb -t pra confirmar: se aparecer Driver=usblp na linha da sua impressora, é isso.

Não tente resolver isso desautorizando a interface, escrevendo 0 em /sys/bus/usb/devices/<endereço>/authorized. Parece a solução mais direta, mas essa chave bloqueia qualquer programa de reivindicar a interface, inclusive o navegador, não só o driver do kernel. O resultado é um erro ainda mais confuso, Dispositivo inexistente (ENODEV, erro 19), e a impressora fica pior do que antes.

O jeito que funciona de verdade é impedir o driver usblp de carregar, no sistema todo:

sudo tee /etc/modprobe.d/blacklist-usblp.conf > /dev/null <<'EOF'
blacklist usblp
EOF
sudo rmmod usblp

Desconecte e reconecte o cabo USB da impressora depois disso, pra forçar o Linux a reconhecer o dispositivo sem o driver. Rode lsusb -t de novo: a linha da impressora deve aparecer sem nenhum driver, ou com Driver=usbfs quando o navegador já estiver com ela aberta. Volte ao FidMenu e tente conectar de novo.

Esse bloqueio é permanente (o arquivo em /etc/modprobe.d/ continua valendo depois de reiniciar) e vale pra qualquer impressora USB que se identifique como classe genérica de impressora nesse computador, não só a impressora térmica do FidMenu. Se esse computador também precisa imprimir documentos comuns numa impressora de verdade pelo CUPS, esse bloqueio vai atrapalhar. O agente local do FidMenu, que evita esse problema inteiro, existe hoje só pra Windows.

Perguntas frequentes

No Windows, depois de usar o Zadig, minha impressora sumiu da lista de impressoras. Isso é normal?

Sim. Trocar o driver para WinUSB muda como o Windows enxerga esse dispositivo: ele deixa de aparecer como uma impressora comum e passa a responder só ao navegador, via WebUSB. Se você ainda precisa imprimir nela por outros programas, use o agente local do FidMenu em vez do Zadig.

Preciso repetir esse processo em todo computador que for usar a impressora?

Sim. A configuração vale para a combinação impressora, computador e porta USB, seja a troca de driver no Windows ou a regra de udev no Linux. Se a loja tem mais de um computador ou tablet conectando na mesma impressora, repita os passos em cada um.

No Windows, o Zadig é seguro?

O Zadig é uma ferramenta open source amplamente usada para instalar drivers WinUSB e libusb no Windows. Baixe sempre pelo site oficial, zadig.akeo.ie, e nunca por espelhos ou links de terceiros.

No Windows, existe outra forma de resolver sem trocar o driver?

Sim. O FidMenu tem um agente local para Windows que imprime pela fila de impressão do próprio sistema, sem precisar trocar driver nenhum. No assistente de cadastro de impressora, escolha a opção Agente local em vez de USB.

No Linux, isso funciona em qualquer distribuição, não só no Fedora?

Sim. O comando lsusb, as regras de udev e o bloqueio do módulo usblp funcionam do mesmo jeito em qualquer distribuição que use udev, como Ubuntu, Debian, Mint e derivados. Só o comando pra instalar o pacote usbutils muda: dnf install usbutils no Fedora, apt install usbutils no Ubuntu e Debian.

No Linux, preciso reiniciar o computador depois de criar a regra de udev?

Não. Depois de rodar sudo udevadm control --reload-rules, sudo udevadm trigger e desconectar e reconectar a impressora, a regra já vale. Reiniciar só ajuda se por algum motivo esses comandos não pegarem o dispositivo.

No Linux, segui a regra de udev mas o Chrome continua dando erro ao reivindicar a interface (claimInterface, Unable to claim interface)?

Rode lsusb -t e veja se a linha da sua impressora mostra Driver=usblp. Se mostrar, o driver de impressora genérico do Linux está segurando a interface antes do navegador. A solução é bloquear esse driver no sistema (seção Se ainda não funcionar do tutorial), não mexer na permissão de novo, que já está certa nesse ponto.

No Linux, tentei desautorizar a interface (authorized=0) pra liberar ela do usblp e piorou. Por quê?

Porque authorized não distingue driver do kernel de programa comum: com ele em 0, nem o navegador consegue reivindicar a interface, e o erro vira Dispositivo inexistente (ENODEV), mais confuso que o original. O jeito certo é deixar authorized em 1 (o padrão) e bloquear especificamente o carregamento do driver usblp, como descrito no tutorial.