O servidor RPC não está disponível. Ao ligar para o ManagementsCope.Connect
-
27-09-2019 - |
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
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.