Если вы можете быть уверены, что:
- процессы никогда не запускаются
повышенные привилегии (Запуск от имени
Администратор); и
- Вы всегда будете работать на Vista / Win7 или более поздней версии
тогда вы получите то, что вы хотите по умолчанию, используя WCF.
Это связано с тем, что механизм разделяемой памяти, используемый NetNamedPipeBinding для публикации фактического имени канала (который основан на GUID), автоматически ограничивается сессией входа в систему, если процесс, в котором размещена служба WCF, не имеет достаточных прав (SeCreateGlobalPrivilege) для сделать его глобально видимым: именованная область общей памяти помещается в пространство имен ядра «Global», только если процесс имеет эту привилегию, в противном случае она помещается в пространство имен ядра «Local», относящееся к сеансу пользователя.
К сожалению, WCF не предоставляет никакого способа указать, что вы не хотите, чтобы он даже рассматривал публикацию канала через пространство имен Global. Поэтому, если эти условия 1 и 2 выше не могут быть гарантированы, единственный способ, которым я могу придумать, - это назвать ваши конечные точки именами, основанными на уникальном идентификаторе сеанса входа в систему, как вы предложили. Получение SID для входа в систему немного трудоемко, требует нетривиального P / Invoke API Win32, но я вижу, что вы уже нашли ответ на SO, который показывает, как это сделать .