Agente CtrlStation - MacOS

CtrlStationAgent - MacOS

Este documento é voltado ao CtrlStationAgent em estações de trabalho macOS gerenciadas. Ele explica o que o agente faz, como instalá-lo e desinstalá-lo, como conceder as permissões necessárias e como ler os logs em caso de problemas.


O que o agente faz

O CtrlStationAgent é um pequeno agente em segundo plano (sem ícone no Dock e sem janela principal) que aplica a política de sessão da estação de trabalho em nome do backend do CtrlStation. No Mac de cada usuário, ele:

Ele é executado uma vez por usuário logado, inicia automaticamente no login e é reiniciado automaticamente caso pare.

Atenção ao impacto no usuário: quando o backend bloqueia um usuário, a tela dele será bloqueada ou ele será deslogado — possivelmente de forma repetida até que o backend remova o bloqueio. Certifique-se de que a política do backend esteja correta antes de uma implantação ampla.


Requisitos

Requisito Detalhe
Versão do macOS macOS 26.0 ou superior (deployment target do build). Macs mais antigos não executarão o agente, a menos que o app seja recompilado com um target menor.
Privilégios Direitos de administrador para instalar (o pacote grava em /Applications e /Library).
Rede HTTPS de saída para o backend configurado, atualmente https://[cliente].ctrlstation.com/api.
Permissões Automação (Apple Events) e Acessibilidade — ver Seção 4.
Assinatura O pacote é assinado com um Developer ID da LAB3 e notarizado, portanto instala sem avisos do Gatekeeper.

Instalação

O entregável é um pacote instalador assinado e notarizado, por exemplo CtrlStationAgent-v1.3.3.pkg. O link para download é fornecido pela LAB3 ou pelo seu parceiro de revenda

Opção A — Interativa (máquina única)

  1. Dê um duplo-clique no .pkg.
  2. Siga o instalador e autentique-se como administrador quando solicitado.

Opção B — Linha de comando / script

sudo installer -pkg /caminho/para/CtrlStationAgent-v1.3.3.pkg -target /

Opção C — MDM (implantação em frota)

Envie o .pkg para o seu MDM (Jamf, Kandji, Mosyle, Intune, etc.) e direcione-o às máquinas-alvo. Envie também o perfil de privacidade (PPPC) descrito na Seção 4 para que o agente funcione sem prompts de permissão por usuário.

O que o instalador faz

O script postinstall do pacote automaticamente:

Não é necessário reiniciar.


Permissões 

Sob a proteção de privacidade do macOS (TCC), o agente precisa de duas permissões para executar todas as suas ações:

Permissão Por quê Quando é necessária
Automação → System Events (Apple Events) Usada para encerrar a sessão do usuário de forma controlada. Quando a ação do backend é "logout".
Acessibilidade Mecanismo alternativo para bloquear a tela via simulação de tecla, caso o método principal de bloqueio não esteja disponível em determinada versão do macOS. Raramente — apenas se o método de bloqueio silencioso preferencial falhar.

Em um Mac não gerenciado, o macOS exibirá um prompt único na primeira vez que o agente tentar essas ações (por exemplo, "CtrlStationAgent deseja controlar o System Events"). O usuário precisa clicar em OK / ativar a opção em Ajustes do Sistema → Privacidade e Segurança.

Para implantação em frota, pré-aprove essas permissões com um perfil PPPC (Privacy Preferences Policy Control) via MDM, para que os usuários nunca vejam prompts e a aplicação da política nunca seja bloqueada:

Em algumas versões do macOS, a Acessibilidade não pode ser concedida por um payload PPPC isolado; a maioria dos MDMs oferece um controle dedicado de "Acessibilidade" no editor de PPPC. Conceda por lá.


Verificar se está em execução

Execute na máquina-alvo (como o usuário logado):

# O processo está ativo?
pgrep -lf CtrlStationAgent

# Status do LaunchAgent (procure por "state = running" e o caminho do programa)
launchctl print "gui/$(id -u)/com.lab3dvlp.CtrlStationAgent" | grep -E "state|program"

Um agente saudável reporta state = running e um caminho de programa /Applications/CtrlStationAgent.app/Contents/MacOS/CtrlStationAgent.

Confirme se a configuração foi aplicada corretamente (admin):

sudo cat "/Library/Application Support/CtrlStationAgent/config.json"

Verificar os logs

O agente registra através do sistema de logs unificado do macOS (não há arquivos de log separados). Use o Console.app ou o comando log, filtrando pelo subsistema do agente.

# Acompanhamento ao vivo — deixe rodando e então bloqueie/desbloqueie ou aguarde um heartbeat:
log stream --predicate 'subsystem == "com.lab3dvlp.CtrlStationAgent"'

# Histórico recente (última hora). Adicione --debug para incluir as linhas de nível
# debug (heartbeats, etc.), que NÃO são persistidas por padrão:
log show --debug --predicate 'subsystem == "com.lab3dvlp.CtrlStationAgent"' --last 1h

Você pode restringir a uma área usando o campo category. Categorias disponíveis: app, api, events, heartbeat, session, notifications, action, config.

# Apenas eventos de sessão e atividade de aplicação de política:
log stream --predicate 'subsystem == "com.lab3dvlp.CtrlStationAgent" AND (category == "events" OR category == "action")'

No Console.app: abra-o, inicie o streaming e digite o subsistema com.lab3dvlp.CtrlStationAgent na barra de busca (defina o filtro como "Subsistema").

O que você normalmente verá: Evento detectado: Tela Bloqueada/Desbloqueada, Executando heartbeat..., API confirmou bloqueio; reaplicando em 2s e Exibindo notificação customizada: … para mensagens do servidor.


Solução de problemas

Sintoma Verificação
Agente não está em execução pgrep -lf CtrlStationAgent. Se vazio, confirme que o plist existe em /Library/LaunchAgents/com.lab3dvlp.CtrlStationAgent.plist e o app em /Applications/CtrlStationAgent.app. Peça ao usuário para sair/entrar novamente, ou inicie manualmente (Seção 8).
Agente inicia e encerra Configuração ausente/inválida. O agente encerra se o config.json estiver ausente ou malformado. Verifique /Library/Application Support/CtrlStationAgent/config.json. Consulte a categoria de log config.
Eventos não chegam ao backend Acessibilidade de rede/API. Verifique as categorias de log api e events em busca de erros; confirme o HTTPS de saída para a URL do backend.
Ação de logout não faz nada Permissão de Apple Events (Automação) não concedida. Ver Seção 4. Verifique as categorias action/session.
A tela não bloqueia Raro — verifique a categoria session; o mecanismo alternativo por tecla requer Acessibilidade (Seção 4).
Mensagens do servidor não aparecem Cada mensagem é exibida apenas uma vez por máquina (registrada no arquivo por usuário da Seção 9). Uma mensagem já vista não reaparecerá.

Iniciar / parar / reiniciar o agente manualmente

Execute como o usuário logado (estes comandos atuam na sessão GUI desse usuário):

# Parar (descarregar)
launchctl bootout "gui/$(id -u)/com.lab3dvlp.CtrlStationAgent"

# Iniciar (carregar)
launchctl bootstrap "gui/$(id -u)" /Library/LaunchAgents/com.lab3dvlp.CtrlStationAgent.plist

# Reiniciar = bootout e depois bootstrap

Para atuar na sessão de outro usuário, substitua $(id -u) pelo UID numérico daquele usuário (descubra-o com id -u <nome_do_usuario>); esses comandos exigem admin/root.


Desinstalação

Não há pacote desinstalador; remova os componentes manualmente ou via script no MDM.

# 1. Pare o agente para o usuário logado (repita por usuário logado / UID)
launchctl bootout "gui/$(id -u)/com.lab3dvlp.CtrlStationAgent" 2>/dev/null

# 2. Remova a definição do LaunchAgent (admin)
sudo rm -f /Library/LaunchAgents/com.lab3dvlp.CtrlStationAgent.plist

# 3. Remova o aplicativo (admin)
sudo rm -rf /Applications/CtrlStationAgent.app

# 4. Remova a configuração do sistema (admin) — isto apaga o token do backend
sudo rm -rf "/Library/Application Support/CtrlStationAgent"

# 5. Esqueça o recibo do instalador (admin)
sudo pkgutil --forget com.lab3dvlp.CtrlStationAgent

# 6. Remova os dados por usuário (execute para CADA conta que tenha feito login)
rm -rf "$HOME/Library/Application Support/CtrlStationAgent"

Após a remoção, opcionalmente remova o perfil PPPC do MDM, caso tenha enviado um.

Remover o plist do LaunchAgent e o app e, em seguida, fazer o usuário sair/entrar novamente já é suficiente para interromper a aplicação da política. Os passos 4 a 6 são limpeza.


Referência

Item Valor
Bundle do app /Applications/CtrlStationAgent.app
Identificador do bundle / label do LaunchAgent com.lab3dvlp.CtrlStationAgent
Plist do LaunchAgent /Library/LaunchAgents/com.lab3dvlp.CtrlStationAgent.plist
Arquivo de configuração /Library/Application Support/CtrlStationAgent/config.json
Dados por usuário (mensagens já vistas) ~/Library/Application Support/CtrlStationAgent/
API do backend https://[cliente].ctrlstation.com/api (definida no config.json)
Subsistema de log com.lab3dvlp.CtrlStationAgent
Time (team) do Developer ID S9DE935KXJ (LAB3 Desenvolvimento de Software Ltda ME)
Intervalo do heartbeat 30 segundos
Início/reinício automático LaunchAgent RunAtLoad + KeepAlive

Revisão #5
Criado 29 agosto 2025 12:33:40 por Felipe Weckx
Atualizado: 1 junho 2026 18:41:25 por Felipe Weckx