Instalando como um aplicativo de serviço
Além de ser executado como um executável de servidor local (EXE), um objeto COM também pode empacotar-se para ser executado como um aplicativo de serviço quando ativado por um cliente local ou remoto. Os serviços suportam vários recursos administrativos integrados e úteis de interface de usuário, incluindo inicialização, parada, pausa e reinicialização local e remota, bem como a capacidade de estabelecer o servidor para ser executado em uma conta de usuário e estação de janela específicas.
Um objeto escrito como um serviço é instalado para uso pelo COM estabelecendo um valor LocalService sob sua chave AppID e executando uma instalação de serviço padrão.
As classes também podem ser configuradas para serem executadas em uma conta de usuário específica quando ativadas por um cliente remoto sem serem gravadas como um aplicativo de serviço. Para fazer isso, a classe instala um nome de usuário e uma senha a serem usados quando o SCM inicia seu processo de servidor local.
Quando uma classe é configurada dessa maneira, as chamadas para CoRegisterClassObject com esse CLSID falharão, a menos que o processo tenha sido iniciado pelo COM em nome de uma solicitação de ativação real. Em outras palavras, as classes configuradas para serem executadas como um usuário específico não podem ser registradas sob qualquer outra identidade.
O nome de usuário é retirado do valor nomeado RunAs sob a chave APPID da classe. Se o nome de usuário for "Usuário interativo", o código de classe será executado no contexto de segurança do usuário conectado no momento e estará conectado à estação de janela interativa.
Caso contrário, a senha será recuperada de uma parte oculta do registro disponível apenas para administradores da máquina e para o sistema. O nome de usuário e a senha são usados para criar uma sessão de logon na qual o código de classe é executado. Quando iniciado dessa maneira, o código de classe é executado com sua própria área de trabalho e estação de janela e não compartilha identificadores de janela, a área de transferência ou outros elementos de interface do usuário com o usuário interativo ou outras classes em execução em outras contas de usuário.
Um servidor registrado com LocalService ou RunAs pode registrar um objeto na tabela de objetos em execução para permitir que qualquer cliente se conecte a ele. Para fazer isso, a chamada do servidor para IRunningObjectTable::Register deve definir o sinalizador ROTFLAGS_ALLOWANYCLIENT. Uma configuração de servidor esse bit deve ter seu nome executável na seção AppID do registro que se refere ao AppID do executável. Um servidor "ativar como ativador" (não registrado como LocalService ou RunAs) não pode registrar um objeto com esse sinalizador.
Tópicos relacionados