2010-11-21 4 views
1

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

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

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

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

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

Благодаря

+0

Проверка работоспособности: вы пытались подключиться только к 'othermachine', а не root/cimv2? – MPelletier

ответ

2

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

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

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

["netapi32.dll"]NetShareGetInfo 

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

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

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

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

+0

Хорошее мышление об обходном пути. Эта ситуация меняет весь вопрос, теперь, когда это проблема VPN ... – MPelletier

+0

Это действительно стало ясно после того, как я вчера был в офисе, и мой код работал, где не было накануне. Единственным отличием было подключение VPN Juniper. –

0

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

Проверьте, что этот парень did.

EDIT:

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

+0

Нет, я в домене. Код работает, если я непосредственно подключен к локальной сети в офисе, однако это всего два дня в неделю. В остальное время я подключен через VPN-соединение, и код не работает по этой ссылке. SC и PSEXEC работают нормально в обоих местах, что заставляет меня думать, что есть фундаментальные различия, но см. Сообщение ниже ... –

+0

Если честно, у меня есть еще одно исключение, отказ RPC запрещен, и я понял, что, по крайней мере, что-то работало правильно, если бы я мог дойти до отказа. – MPelletier

Смежные вопросы