Я пытаюсь написать код 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.PerformanceMonitor.Init () в System.Diagnostics.PerformanceCounterLib.GetPerformanceData (элемент String) в System.Diagnostics.NtProcessManager.GetProcessInfos (библиотека производительности) --- Конец трассировки внутреннего стека исключений ---
в System.Diagnostics.NtProcessManager.GetProcessInfos (библиотека PerformanceCounterLib) в System.Diagnostics.NtProcessManager.GetProcessInfos (String machineName, Boolean isRemoteMachine) --- Конец трассировки стека внутренних исключений ---
в System.Diagnostics.NtProcessManager.GetProcessInfos (String machineName, логическое isRemoteMachine) в System.Diagnostics.ProcessManager.GetProcessInfos (String machineName) в System.Diagnostics.Process.GetProcesses (String machineName) в System.Diagnetostics.Processy.Game , String machineName) в (имя метода) в c: (путь): строка 132
Судя по моим ограниченным знаниям, счетчики производительности работают нормально, но я все еще получаю эти ошибки, предполагающие, что это проблема. Почему я получаю эти ошибки?
Учитывая, насколько простым оказался этот ответ, я чувствую себя немного глупо. Я боролся с этой и подобными ей проблемами в течение нескольких недель. Сотрудник узнал об этом и, как оказалось, уже получил ответ как в пакете, так и в C #.
Оказывается, это проблема с разрешениями, а не со счетчиками производительности. Что ответило на большинство моих вопросов. Эта команда решила sc query
проблема:
NET USE \\target\IPC$ /u:user pass
Я не знал о доле IPC $. После подключения я мог свободно использовать sc query
, query process
, и другие удаленные команды на цели. Интересно, что я все еще не мог использовать psList
. Мне это было не нужно, поэтому я не стал в это разбираться.
Код C # был длинным - я поставлю его здесь, когда у меня будет код. По сути, все, что он делал, - это создавал объект Process и вставлял этот фрагмент кода командной строки выше. После этого я мог запустить оставшуюся часть моего кода C #, чтобы получить запущенные процессы от цели.