Por que estou recebendo erros no contador de desempenho?

1

Estou tentando escrever código C # para acessar um computador (XP sp2) remotamente para descobrir se um processo está em execução. Eu não sei muito sobre contadores de desempenho além do que tenho lido nos últimos dias, mas aqui está o meu problema:

Para a solução de problemas, quando eu uso psList ( pslist \target -u user -p pass ) para acessar o computador de destino, recebo este erro:

Cannot connect to remote registry on <computer>
Access is denied.
Failed to take process snapshot on <computer>
Make sure that Remote Registy service is running on the remote system, that you have firewall ports allow RPC access, and your account has read access the following key on the remote system: HKLM\Software\Microsoft\Windows NT\CurrentVersion\perflib

Quando uso o psList como administrador, recebo o mesmo erro, exceto que diz The network path was not found em vez de Access is denied . Eu entendo isso se eu "Executar como administrador" na minha conta normal ou se eu realmente entrar na minha conta de administrador e executar o comando de lá.

O registro remoto está em execução no computador de destino.

Quando uso a consulta sc ( sc \target query ) como administrador, recebo este erro:

[SC] OpenSCManager FAILED 5:
 Access is Denied

Quando esta parte do código C # é executada, Process[] targetProcess = Process.GetProcessesByName(string process, string ip); (eu uso um endereço IP aqui como minha string, não um nome de computador), recebo este erro:

System.InvalidOperationException: Couldn't connect to remote machine. ---> System.InvalidOperationException: Couldn't get process information from performance counter. ---> System.ComponentModel.Win32Exception: The network path was not found at System.Diagnostics.PerformanceMonitor.Init() at System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item) at System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib library) --- End of inner exception stack trace ---

at System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib library) at System.Diagnostics.NtProcessManager.GetProcessInfos(String machineName, Boolean isRemoteMachine) --- End of inner exception stack trace ---

at System.Diagnostics.NtProcessManager.GetProcessInfos(String machineName, Boolean isRemoteMachine) at System.Diagnostics.ProcessManager.GetProcessInfos(String machineName) at System.Diagnostics.Process.GetProcesses(String machineName) at System.Diagnostics.Process.GetProcessesByName(String processName, String machineName) at (methodname) in c:(pathname):line 132

  • O compartilhamento de arquivos e impressoras está em
  • O compartilhamento do Admin $ está ativado
  • Um serviço de monitoramento de rede usado pela minha empresa (que não posso confiar devido a problemas de wi-fi, portanto estou escrevendo código) é capaz de acessar os processos no computador de destino e me informar se eles estão em execução ou não. Então eu sei que eles são acessíveis.
  • Eu fiz algumas leituras no FAILED 5 para nenhum resultado
  • Eu passei por este da Microsoft (sobre como solucionar problemas de chaves de registro que funcionam com acesso remoto)
  • Eu também passei por este da Microsoft. (semelhante ao acima)
  • Eu li a maior parte esta da Microsoft sobre como trabalhar com contadores de desempenho
  • Eu observei as coisas no Perfmon e elas parecem estar indo bem (há itens na lista suspensa que cada solucionador de problemas direciona para você, em vez de números ou um espaço em branco)
  • Analisei algumas outras perguntas e ideias das quais perdi o controle

Do meu conhecimento limitado, parece que os contadores de desempenho estão funcionando bem, mas ainda estou recebendo esses erros, sugerindo que eles são o problema. Por que estou recebendo esses erros?

    
por Alamb 30.03.2016 / 23:35

1 resposta

0

Considerando o quão fácil esta resposta acabou sendo, eu me sinto um pouco burra sobre isso. Eu tenho lutado com isso e problemas semelhantes a ele por semanas. Um colega de trabalho descobriu e passou a já ter a resposta tanto em lote quanto em C #.

Acontece que era um problema de permissões e não de contadores de desempenho. Qual respondeu a maioria de minha pergunta. Este comando resolveu o problema sc query :

NET USE \target\IPC$ /u:user pass

Eu não sabia da participação do IPC $. Depois de conectá-lo, eu poderia usar livremente sc query , query process e outros comandos remotos no destino. Curiosamente, apesar de ainda não conseguir usar psList . Eu não precisava disso, então não olhe para isso.

O código C # foi longo - vou colocá-lo aqui quando eu tiver o código em mim. Basicamente, tudo o que ele fez foi criar um objeto Process e conectar esse pedaço de código de linha de comando acima. Depois disso, eu poderia executar o resto do meu código c # para obter os processos em execução do destino.

    
por 01.04.2016 / 22:29