我正在尝试编写 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 查询 ( 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.PerformanceCounterLib.GetPerformanceData(String item) 的 System.Diagnostics.PerformanceMonitor.Init() 找不到网络路径。 --- 内部异常堆栈跟踪结束 ---
在 System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib library) 在 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) at (methodname) in c:(pathname):line 132
- 文件和打印机共享已开启
- Admin$ 共享已启用
- 我公司使用的网络监控服务(由于 wi-fi 问题我不能依赖它,因此我正在编写代码)能够访问目标计算机上的进程并告诉我它们是否正在运行。所以我知道它们是可以访问的。
- 我在 FAILED 5 上做了一些阅读,但没有结果
- 我已经从 Microsoft 完成了此操作(关于对可用于远程访问的注册表项进行故障排除)
- 我也从微软经历过这个。(与上面类似)
- 我从微软那里读到了关于使用性能计数器的大部分内容
- 我查看了 Perfmon 中的东西,它们似乎做得很好(下拉列表中有每个问题排查人员都会引导您访问的项目,而不是数字或空白)
- 我浏览了其他一些我忘记的问题和想法
根据我有限的知识,性能计数器似乎工作正常,但我仍然收到这些错误,表明它们是问题所在。为什么我会收到这些错误?
考虑到这个答案最终变得多么容易,我对此感到有些愚蠢。几个星期以来,我一直在努力解决这个问题和类似的问题。一位同事发现并碰巧已经在批处理和 C# 中得到了答案。
事实证明这是一个权限问题,而不是性能计数器。这回答了我的大部分问题。这个命令解决了这个
sc query
问题:NET USE \\target\IPC$ /u:user pass
我不知道 IPC$ 份额。插入后,我可以在目标上自由使用
sc query
,query process
和其他远程命令。有趣的是,虽然我仍然无法使用psList
. 虽然我不需要它,所以没有研究它。C# 代码很长——当我拿到代码时,我会把它放在这里。基本上,它所做的只是创建一个 Process 对象并插入上面的那段命令行代码。之后,我可以运行其余的 C# 代码以从目标中获取正在运行的进程。