Сервер 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 не рисует всю картину. Я получаю те же результаты, что и вы.
Посмотри, что сделал этот парень.
РЕДАКТИРОВАТЬ:
Я полагаю, вы пытаетесь сделать это в рабочей группе, а не в домене, верно? Это хитрость, рабочие группы требуют немного больше работы, чтобы пройти. Ссылка выше, кажется, имеет обходной путь. Я попробую снова из дома сегодня вечером.