Можете ли вы определить, какие процессы используют внешнюю точку RPC ncalrpc? - PullRequest
0 голосов
/ 27 февраля 2019

Когда наши разработчики пытаются отладить RPC-сервер C ++ / Winrt ncalrpc после присоединения вновь построенного и запущенного серверного процесса к отладчику VS2017, они не могут установить точки останова для новых или измененных строк кода, даже если разрешить точку останова для кода, которыйне совсем то же самое;в IDE появляется непредвиденное сообщение об ошибке символа.

Один из членов команды сообщил мне, что это происходит из-за длительных подключений RPC к конечным точкам RPC из других приложений и служб, которые используют основную службу.Я не знаю много о RPC, но читал.Проверка источника основной службы, кажется, указывает на то, что они все делают правильно для остановки сервера ,

RPC_STATUS rs = 0;
rs = RpcMgmtStopServerListening(NULL);
//...
rs = RpcServerUnregisterIf(RPC_IF_SPEC, nullptr, 0);
//...
rs = RpcEpUnregister(RPC_IF_SPEC, BindingVector, nullptr);

Но, если честно, это также может быть то, что они должны использовать rs = RpcServerUnregisterIf(NULL, NULL, 0); вместо этого я действительно не могу сказать.

Сейчас нам нужно либо вручную отследить все процессы, которые подключаются к этому сервису, и убить / остановить их, либо выбрать «легкий» выход и выполнить перезагрузку.после установки нового сервиса, позволяющего нам отлаживать в правильных местах файлов при подключении процесса к VS2017.

Моя полезная идея, чтобы обойти это, состояла в том, чтобы посмотреть, смогу ли я сгенерировать список процессов, подключающихся к RPCКонечная точка, сбросьте их с нуля, установите новую службу и перезапустите их.

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

Сама ассоциация подсчитывается по ссылкам, и когда все ссылки ушли, он останавливает и закрывает все соединения.Каждый дескриптор привязки и каждый дескриптор контекста содержат ссылку на ассоциацию.Когда все закрыты, связь исчезает.

Обновление:

Принятый ответ указывает, что это невозможно с внешним процессом;это не способ достичь этой цели с помощью внешнего процесса.

1 Ответ

0 голосов
/ 09 марта 2019

RPC имеет функцию RpcServerInqCallAttributes , которую сервер RPC может использовать во время клиентского вызова для получения атрибутов контекста безопасности клиента и другой информации.

Вы должны передать RPC_CALL_ATTRIBUTES_V2 доступно только в Windows Vista и более поздних версиях Windows (или RPC_CALL_ATTRIBUTES_V3 доступно в Windows 8 и более поздних версиях), поэтому что-то вроде этого:

// the code depends on the minimal platform you compile for
RPC_CALL_ATTRIBUTES atts = { 0 }; // should map to RPC_CALL_ATTRIBUTES_V2 or RPC_CALL_ATTRIBUTES_V3

atts.Version = RPC_CALL_ATTRIBUTES_VERSION; // should be 2 or 3
atts.Flags = RPC_QUERY_CLIENT_PID;
RpcServerInqCallAttributes(0, &atts);
... pid is in atts.ClientPID ...

Это можно вызвать только с самого сервера RPC, так что вы 'Я должен был как-то записать все клиентские pids и добавить API на сервер, чтобы иметь возможность их перечислять.

...