Pergunta

Preciso criar um serviço remotamente e preferir não ir a um comando e executar "sc remotemachine criar ......" e deseja fazê -lo dentro do código C#.

No entanto, ao executar o código, mesmo que o comando SC funcione com bastante prazer e, portanto, esteja gerenciando o sistema remoto, o ManagementScope.Connect Chamada está lançando uma exceção com "o servidor RPC não está disponível".

Um trecho de código que faz isso é

string machineName = "othermachine";
string path = string.Format(@"\\{0}\root\cimv2", machineName);
ManagementScope scope = new ManagementScope(path);
scope.Connect();

Como esse é o primeiro passo na jornada, estou um pouco preso sobre onde ir a seguir. O comando SC funciona, então o que está fazendo diferente (além de não usar as bibliotecas .NET - talvez eu precise acertar o Winapi com mais força?)

Obrigado

Foi útil?

Solução

Depois de refletir sobre isso por um tempo, vendo o tempo atribuído a essa tarefa sendo errôneo, eu tirei a antiga documentação da API Win32 e [Dllimport] 'Ed as ligações que eu precisava para fazer isso da maneira antiga. Sendo um cão C antigo, eu costumava conhecer essas ligações, incrível quanto volta mesmo depois de alguns anos usando as bibliotecas gerenciadas.

O que eu precisava fazer era poder criar um Servcie, iniciá -lo, fazer um trabalho útil, pará -lo e excluí -lo. O Criar, Iniciar, Parar e Excluir são mecânicos e eu queria me concentrar na parte do "trabalho útil" da atividade.

Primeiro copiei o exe do serviço para o admin $ share e verifiquei o caminho local para isso (com nossos administradores de servidor, não há nenhuma narrativa!). Para fazer isso, eu chamo

["netapi32.dll"]NetShareGetInfo 

E então eu usei o seguinte com o advapi32.dll

  • OpenScManager
  • CreateService
  • Começar serviço
  • OpenService (para quando eu quero parar e excluí -lo - não mantenha as alças abertas, pois isso pode demorar um pouco mais para manter o que é contido)
  • ControlService
  • QueryServicestatus
  • ClosseservieHandle

Tudo isso funciona mesmo em toda a conexão VPN.

Só posso adivinhar que a API gerenciada está tentando fazer muito mais do que eu realmente preciso - a diferença de tempo gasta usando a API gerenciada e a API do Windows é bastante, e sem garantias de que a API gerenciada passará por isso não foi Um caminho adequado a seguir.

Outras dicas

Obviamente, o código de estoque da MSDN não mostra o quadro inteiro. Eu recebo os mesmos resultados que você.

Confira o que esse cara fez.

EDITAR:

Eu acredito que você está tentando em um grupo de trabalho e não em um domínio, certo? Esse é o truque, os grupos de trabalho exigem um pouco mais de trabalho para passar. O link acima parece ter uma solução alternativa. Vou tentar novamente em casa esta noite.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top