Я разрабатываю вспомогательный объект браузера 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);
Что-то мне не хватает?
Спасибо.