C #: более низкая целостность именованных каналов

Я разрабатываю вспомогательный объект браузера Internet Explorer (BHO) на C #. Этот BHO определяет URL-адрес, по которому пользователь переходит, а затем автоматически заполняет имя пользователя и пароль.

BHO взаимодействует с процессом, работающим как служба. Связь происходит по именованным каналам.

Связь работает нормально, когда защищенный режим выключен. Однако, когда защищенный режим включен, это не работает. Если я запускаю iexplore.exe от имени администратора, он работает.

В защищенном режиме я получаю сообщение об отказе в доступе.

Прочитав об этом, я понял, что доступ к каналу запрещен, потому что IE работает в области с низким уровнем целостности.

Я прочитал следующую статью а. Понимание и работа в защищенном режиме Internet Explorer http://msdn.microsoft.com/en-us/library/bb250462.aspx

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

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

Я бы предпочел использовать подход именованного канала.

Ниже приведен мой исходный код для установки контекста безопасности перед открытием канала.

Код на стороне сервиса:

PipeSecurity security = new PipeSecurity();
security.AddAccessRule(new PipeAccessRule(
new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null),  // @"Users"
            PipeAccessRights.ReadWrite, 
            System.Security.AccessControl.AccessControlType.Allow
            ));

var currentUser = WindowsIdentity.GetCurrent().Name;
security.AddAccessRule(new PipeAccessRule(currentUser, PipeAccessRights.FullControl,   System.Security.AccessControl.AccessControlType.Allow));


NamedPipeServerStream stream;
stream = new NamedPipeServerStream(
            CommandPipeName,
            PipeDirection.InOut, MAX_PIPE_INSTANCE,
            PipeTransmissionMode.Message, PipeOptions.WriteThrough,
            EPHelperCommandPipeServerConsts.MaxPipeRequestLength,
            EPHelperCommandPipeServerConsts.MaxPipeResponseLength,
            security
            );

do
        {
            n++;

            isListening = true;
            stream.WaitForConnection();
            isListening = false;

            var cs = stream;

            stream = new NamedPipeServerStream(
                    CommandPipeName,
                    PipeDirection.InOut, MAX_PIPE_INSTANCE,
                    PipeTransmissionMode.Message, PipeOptions.WriteThrough,
                    EPHelperCommandPipeServerConsts.MaxPipeRequestLength,
                    EPHelperCommandPipeServerConsts.MaxPipeResponseLength,
                    security
                    );

    // some code

        } while (true);

Что-то мне не хватает?

Спасибо.


person Avinash Agarwal    schedule 29.06.2011    source источник
comment
Защищенный режим нет означает: весь код, использующий именованные каналы для запуска кода в службе, работающей с правами администратора, должен быть остановлен, кроме моего. Нет кроме моей оговорки. Все, конечно, подумают, что это применимо к ним, что делает эту функцию бесполезной. Это должно быть очевидно.   -  person Hans Passant    schedule 29.06.2011
comment
Почему вы добавляете текущего пользователя в PipeAccessRule? создатель уже имеет полный контроль по умолчанию как первый владелец канала.   -  person Sheng Jiang 蒋晟    schedule 29.06.2011
comment
Спасибо, Ганс, я не понял твоего комментария. Не могли бы вы подробнее рассказать о своем комментарии? AFAIK я не предполагаю этого.   -  person Avinash Agarwal    schedule 30.06.2011


Ответы (1)


Я предполагаю, что вы не согласны с механизмом уровня целостности, добавленным в Windows в Vista. Этот механизм ортогонален механизмам управления доступом, основанным на записях разрешения и запрета в списке управления доступом.

Идея понижения уровня целостности канала кажется мне правильным подходом, но ваш код вообще этого не делает. В классах .NET Framework пока нет поддержки для внесения изменений в метку целостности, связанную с ресурсом. Вы должны работать с API Win32.

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

person Chris Dickson    schedule 28.07.2011
comment
У меня работает на Windows 7 SP1. Спасибо! - person Dzmitry Lahoda; 20.01.2013