Как использовать WCF NetNamedPipesBinding для связи между процессами только в сеансе входа в систему одного и того же пользователя? - PullRequest
1 голос
/ 19 мая 2011

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

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

Одним из решений было бы добавить уникальный идентификатор сеанса входа в систему к адресу конечной точки, но я не уверен, как получить уникальный сеанс входа в систему (см. мой вопрос по этому вопросу здесь ). Я подумал, что для этого может быть какой-то способ запекаться в WCF или стандартный подход к этому.

1 Ответ

1 голос
/ 22 мая 2011

Если вы можете быть уверены, что:

  1. процессы никогда не запускаются повышенные привилегии (Запуск от имени Администратор); и
  2. Вы всегда будете работать на Vista / Win7 или более поздней версии

тогда вы получите то, что вы хотите по умолчанию, используя WCF.

Это связано с тем, что механизм разделяемой памяти, используемый NetNamedPipeBinding для публикации фактического имени канала (который основан на GUID), автоматически ограничивается сессией входа в систему, если процесс, в котором размещена служба WCF, не имеет достаточных прав (SeCreateGlobalPrivilege) для сделать его глобально видимым: именованная область общей памяти помещается в пространство имен ядра «Global», только если процесс имеет эту привилегию, в противном случае она помещается в пространство имен ядра «Local», относящееся к сеансу пользователя.

К сожалению, WCF не предоставляет никакого способа указать, что вы не хотите, чтобы он даже рассматривал публикацию канала через пространство имен Global. Поэтому, если эти условия 1 и 2 выше не могут быть гарантированы, единственный способ, которым я могу придумать, - это назвать ваши конечные точки именами, основанными на уникальном идентификаторе сеанса входа в систему, как вы предложили. Получение SID для входа в систему немного трудоемко, требует нетривиального P / Invoke API Win32, но я вижу, что вы уже нашли ответ на SO, который показывает, как это сделать .

...