Сервер RPC недоступен. при вызове ManagementScope.Connect

Мне нужно создать службу удаленно, и я бы предпочел не вызывать команду и запустить команду "sc \remotemachine create ......", а захотеть сделать это в коде C#.

Однако при выполнении кода, даже если команда sc работает довольно успешно и, таким образом, управляет удаленной системой, вызов ManagementScope.Connect вызывает исключение: "Сервер RPC недоступен".

Фрагмент кода, который делает это

string machineName = "othermachine";
string path = string.Format(@"\\{0}\root\cimv2", machineName);
ManagementScope scope = new ManagementScope(path);
scope.Connect();

так как это примерно первый шаг в путешествии, я немного застрял в том, куда идти дальше. Команда sc работает, так что же она делает по-другому (кроме использования библиотек.net - может быть, мне нужно сильнее ударить по winapi?)

Спасибо

2 ответа

Решение

После обдумывания этого на некоторое время, увидев, что время, отведенное для этой задачи, было разрушено, я вытащил старую документацию по API для WIN32 и [DllImport] отредактировал вызовы, которые мне нужны, чтобы сделать это "старомодным способом". Будучи старой собакой Си, я привык разбираться с этими вызовами, удивительно, сколько всего возвращается даже после нескольких лет использования управляемых библиотек.

Мне нужно было создать сервак, запустить его, выполнить полезную работу, остановить и удалить его. Создание, запуск, остановка и удаление - это механика, и я хотел сосредоточиться на части "выполнить полезную работу".

Сначала я скопировал exe-файл сервиса в общий ресурс ADMIN$ и проверил локальный путь к нему (с нашими администраторами серверов это не известно!). Для этого я звоню

["netapi32.dll"]NetShareGetInfo 

и затем я использовал следующее с advapi32.dll

  • OpenSCManager
  • CreateService
  • StartService
  • OpenService (для случаев, когда я хочу остановить и удалить его - не держите ручки открытыми, так как это может занять некоторое время, чтобы очистить хранилища самостоятельно)
  • ControlService
  • QueryServiceStatus
  • CloseServiceHandle

Это все работает даже через соединение VPN.

Я могу только догадываться, что управляемый API-интерфейс пытается сделать гораздо больше, чем мне действительно нужно - разница во времени, затрачиваемом на использование управляемого API-интерфейса и API-интерфейса Windows, довольно велика, и никаких гарантий того, что управляемый API-интерфейс пройдет через него, не было. Неподходящий путь вперед.

Очевидно, что фондовый код от MSDN не рисует всю картину. Я получаю те же результаты, что и вы.

Посмотри, что сделал этот парень.

РЕДАКТИРОВАТЬ:

Я полагаю, вы пытаетесь сделать это в рабочей группе, а не в домене, верно? Это хитрость, рабочие группы требуют немного больше работы, чтобы пройти. Ссылка выше, кажется, имеет обходной путь. Я попробую снова из дома сегодня вечером.

Другие вопросы по тегам