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

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

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

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

1 ответ

Решение

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

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

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

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

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

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