Проблема такова:
запущены 2 сервиса, общаются с помощью IPC
на одном запущен сервер:
RemotingConfiguration.ApplicationName = "Video.Service";
IpcVideoServer = new IpcServerChannel("Video");
ChannelServices.RegisterChannel(IpcVideoServer, true);
RemotingConfiguration.RegisterActivatedServiceType(typeof(VideoBuffer));
а на другом — соединение:
_Buffer = (VideoBuffer)Activator.CreateInstance(typeof(VideoBuffer), null, new object[] { new UrlAttribute("ipc://Video") });
при попытке соединится получаем Exception:
Type:
System.Reflection.TargetInvocationException
Message:
Exception has been thrown by the target of an invocation.
Source:
mscorlib
StackTrace:
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache)
at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache)
at System.Activator.CreateInstance(Type type, Boolean nonPublic)
at System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
at Bkc.Lpr.Service.VideoGrabber.CreateVideo()
TargetSite:
System.Object CreateInstance(System.RuntimeType, Boolean, Boolean, Boolean ByRef, System.RuntimeMethodHandle ByRef, Boolean ByRef)
InnerException:
Type:
System.Runtime.Remoting.RemotingException
Message:
An error occurred while processing the request on the server: System.Security.SecurityException: Не удается открыть маркер безопасности анонимного уровня.
at System.Security.Principal.WindowsIdentity.GetCurrentInternal(TokenAccessLevels desiredAccess, Boolean threadOnly)
at System.Security.Principal.WindowsIdentity.GetCurrent()
at System.Runtime.Remoting.Channels.Ipc.IpcServerTransportSink.ServiceRequest(Object state)
The Zone of the assembly that failed was:
MyComputer
Source:
mscorlib
StackTrace:
Server stack trace:
at System.Runtime.Remoting.Channels.Ipc.IpcServerHandler.ReadToEndOfHeaders(BaseTransportHeaders headers)
at System.Runtime.Remoting.Channels.Ipc.IpcClientHandler.ReadHeaders()
at System.Runtime.Remoting.Channels.Ipc.IpcClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at System.Runtime.Remoting.Activation.IActivator.Activate(IConstructionCallMessage msg)
at System.Runtime.Remoting.Activation.LocalActivator.DoRemoteActivation(IConstructionCallMessage ctorMsg)
at System.Runtime.Remoting.Activation.LocalActivator.Activate(IConstructionCallMessage ctorMsg)
at System.Runtime.Remoting.Activation.AppDomainLevelActivator.Activate(IConstructionCallMessage ctorMsg)
at System.Runtime.Remoting.Messaging.ClientContextTerminatorSink.SyncProcessMessage(IMessage reqMsg)
at System.Runtime.Remoting.Activation.ActivationServices.Activate(RemotingProxy remProxy, IConstructionCallMessage ctorMsg)
at System.Runtime.Remoting.Proxies.RemotingProxy.Invoke(IMessage reqMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at Video.VideoBuffer..ctor()
TargetSite:
Void HandleReturnMessage(System.Runtime.Remoting.Messaging.IMessage, System.Runtime.Remoting.Messaging.IMessage)
ZTZ> An error occurred while processing the request on the server: System.Security.SecurityException: Не удается открыть маркер безопасности анонимного уровня.
Похоже, косяк с настройками прав.
Наверное, сервера запускаются от имени разных пользователей, и где-то в Windows Policy установлена слишком злая галочка, из-за которой у одного из сервисов нет прав на доступ к Pipe, открытому другим сервисом.
Здравствуйте, mihailik, Вы писали:
ZTZ>> An error occurred while processing the request on the server: System.Security.SecurityException: Не удается открыть маркер безопасности анонимного уровня.
M>Похоже, косяк с настройками прав.
M>Наверное, сервера запускаются от имени разных пользователей, и где-то в Windows Policy установлена слишком злая галочка, из-за которой у одного из сервисов нет прав на доступ к Pipe, открытому другим сервисом.
Сервисы запущены под одним и тем-же пользователем.
пробовал разное:
NT AUTHORITY\SYSTEM
.\SERVICE_USER
Пользователя .\SERVICE_USER даже включил во все группы
у пользователя .\SERVICE_USER есть права входа в систему в качестве сервиса и на замену маркера уровня процесса
Только одного непонятно причем тут маркер безопасности анонимного уровня, ведь сервис запускается от имени конкретного пользователя, а не анонимно.
ZTZ>Только одного непонятно причем тут маркер безопасности анонимного уровня, ведь сервис запускается от имени конкретного пользователя, а не анонимно.
Может, они у тебя в разных Window Station? Например, один помечен как Allow interact with desktop, а другой — нет.
Здравствуйте, mihailik, Вы писали:
ZTZ>>Только одного непонятно причем тут маркер безопасности анонимного уровня, ведь сервис запускается от имени конкретного пользователя, а не анонимно.
M>Может, они у тебя в разных Window Station? Например, один помечен как Allow interact with desktop, а другой — нет.
Настройки сервисов идентичны
я даже сделал так:
Сервисы стартуют как Локальная система, а потом с помощью LogonUser и Impersonate работаю дальше.
Проблема осталась.
Если логины разные, то получаем:
Failed to connect to an IPC Port: Отказано в доступе.
ЗЫ:
Сделал сервис логирования который работает сходным образом (соединение под отдельным логином для работы с дэсктопными приложениями) — там все впорядке
Здравствуйте, mihailik, Вы писали:
ZTZ>>Настройки сервисов идентичны ZTZ>>я даже сделал так
M>Похоже, нужно оформить минимальный демонстрационный пример, когда это проявляется, и отправлять в Microsoft, пусть что-то решают.
M>Кстати, а ты на других машинах пробовал? Как насчёт WinXP/2003 — везде проявляется? Service Pack влияет?
Спасибо огромное за помощь mihailik!
Оказывается дело вот в чем:
если на клиенте написать
Здравствуйте, Jericho113, Вы писали:
J>Я посмотрел доку по 1.1. там функция RegisterChannel использует один аргумент типа IChannel.
В 2.0 эта перегрузка объявлена obsolete и добавлен второй аргумент.