为什么我会收到性能计数器错误?

为什么我会收到性能计数器错误?

我正在尝试编写 C# 代码来远程访问计算机 (XP sp2),以查明某个进程是否正在运行。除了过去几天阅读的内容外,我对性能计数器了解不多,但我的问题如下:

为了进行故障排除,当我使用 psList ( pslist \\target -u user -p pass) 访问目标计算机时,出现此错误:

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

当我以管理员身份使用 psList 时,我收到相同的错误,只是它说的The network path was not found是 而不是Access is denied。无论我是在我的普通帐户中“以管理员身份运行”,还是我实际登录到我的管理员帐户并从那里运行命令,我都会得到这个。

远程注册正在目标计算机上运行。

当我以管理员身份使用 sc query( sc \\target query) 时出现此错误:

[SC] OpenSCManager FAILED 5:
 Access is Denied

当我的 C# 代码的这一部分运行时Process[] targetProcess = Process.GetProcessesByName(string process, string ip);(我在这里使用 IP 地址作为字符串,而不是计算机名称),我收到这个冗长的错误:

System.InvalidOperationException:无法连接到远程计算机。 ---> System.InvalidOperationException:无法从性能计数器获取进程信息。 ---> System.ComponentModel.Win32Exception:未找到网络路径 在 System.Diagnostics.PerformanceMonitor.Init() 在 System.Diagnostics.PerformanceCounterLib.GetPerformanceData(String item) 在 System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib library) --- 内部异常堆栈跟踪结束 ---

在 System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib 库)在 System.Diagnostics.NtProcessManager.GetProcessInfos(String machineName,Boolean isRemoteMachine)---内部异常堆栈跟踪结束---

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

  • 文件和打印机共享已打开
  • Admin$ 共享已启用
  • 我公司使用的网络监控服务(由于 Wi-Fi 问题,我无法依赖该服务,因此我编写了代码)能够访问目标计算机上的进程并告诉我它们是否正在运行。所以我知道它们是可以访问的。
  • 我读了一些关于失败 5 至无结果的文章
  • 我经历过来自 Microsoft(关于对用于远程访问的注册表项进行故障排除)
  • 我经历过来自微软。(与上面类似)
  • 我读了大部分来自 Microsoft 的关于使用性能计数器的
  • 我查看了 Perfmon 中的情况,它们似乎运行良好(下拉列表中有一些项目,每个故障排除程序都会引导您查看,而不是数字或空白)
  • 我查看了一些其他的问题和想法,但我记不清了

从我有限的知识来看,性能计数器似乎工作正常,但我仍然收到这些错误,表明它们就是问题所在。为什么我会收到这些错误?

答案1

考虑到这个答案最终是多么简单,我觉得自己有点愚蠢。我已经为这个问题和类似的问题奋斗了好几个星期。一位同事发现了这个问题,碰巧他已经在批处理和 C# 中找到了答案。

事实证明这是一个权限问题,而不是性能计数器问题。这回答了我的大部分问题。此命令解决了该sc query问题:

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

我不知道 IPC$ 共享。插入后,我可以自由使用sc queryquery process和其他远程命令。但有趣的是,我仍然无法使用psList。但我不需要它,所以没有研究它。

C# 代码很长 - 当我有代码时我会把它放在这里。基本上,它所做的就是创建一个 Process 对象并插入上面的那段命令行代码。之后我可以运行其余的 C# 代码来从目标获取正在运行的进程。

相关内容