Я разрабатываю объект помощника браузера Internet Explorer (BHO) на C #. Это BHO обнаруживает URL, по которому пользователь переходит, а затем автоматически вводит имя пользователя и пароль.
BHO связывается с процессом, работающим как служба. Связь происходит по именованным каналам.
Связь работает нормально, когда защищенный режим выключен. Однако, когда защищенный режим включен, это не работает. Если я запускаю iexplore.exe в качестве администратора, тогда он работает.
В защищенном режиме я получаю сообщение об отказе в доступе.
Прочитав об этом, я понимаю, что доступ к каналу запрещен, потому что IE работает
область с низким уровнем целостности.
Я прошел следующую статью
а. Понимание и работа в защищенном режиме Internet Explorer
http://msdn.microsoft.com/en-us/library/bb250462.aspx
b.Также было много предложений по настройке информации о безопасности перед созданием ресурса канала, чтобы позволить процессу более низкой целостности использовать это. Это, однако, не очень полезно для меня.
Я все еще получаю ту же ошибку.
Единственное, что у меня есть в настоящее время - это общение через сокеты. Я проверил, что этот подход работает.
Я бы предпочел использовать подход именованного канала.
Ниже приведен мой исходный код для настройки контекста безопасности перед открытием канала
Сервисный код:
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);
Есть что-то, чего мне не хватает?
Спасибо.