2010-10-31 3 views
5

WCF 명명 된 파이프를 통해 .NET 데스크톱 응용 프로그램과 통신하는 C#으로 작성된 Internet Explorer 추가 기능이 있습니다. 데스크톱 응용 프로그램은 netNamedPipeBinding에 대한 ServiceHost를 만들고 IE 추가 기능의 각 인스턴스는 응용 프로그램과 통신하기 위해 ChannelFactory를 만듭니다. Windows XP에서는 모든 것이 잘 작동하지만 Windows 7의 IE 보호 모드에서는 예외가 발생합니다.WCF 명명 된 파이프의 무결성을 낮추는 방법

System.ServiceModel.CommunicationException : 'net.pipe : //localhost/MyApp.MyID'끝점에 연결할 수 없습니다. ---> System.IO.PipeException : '\. \ pipe ... guid ...'에 대한 파이프 끝 점이 있지만 연결에 실패했습니다. 액세스가 거부되었습니다. (5, 0x5)

보호 모드에서 추가 기능을 실행하려면 지원해야하는 시나리오입니다. 필자가 명명 된 파이프의 무결성 수준을 낮추면 IE 추가 기능이이를 통해 대화 할 수 있다는 것을 이해합니다. 내 질문은 그것을하는 방법입니다. 나는 WCF를 사용하기위한 것들을 가지고 있으며, 그렇게하는 것이 바람직 할 것이다. WCF가 낮은 무결성 수준의 명명 된 파이프를 만들도록 할 수 있습니까? 내가 작성하기 위해 어떤 코드를 작성합니까?

답변

7

나는 이것이 가능할 것이라고 생각하지 않습니다.

명명 된 파이프를 만들 때 제공되는 보안 설명자에 무결성 레이블을 지정해야한다는 점이 문제입니다. 표준 NetNamedPipeBinding에서 CreateNamedPipe에 대한 호출은 내부 WCF 클래스 System.ServiceModel.Channels.PipeConnectionListenerCreatePipe() 개인 메서드에서 발생합니다. 파이프의 초기 보안 설명자를 지정하는 방법을 변경하는 방법을 볼 수 없습니다.

달성해야 할 것에 대한 개요는 this question and answer을 참조하십시오.

사용자 지정 명명 된 파이프 전송 바인딩 요소를 처음부터 작성하는 것이 유일한 방법이며, 앞으로는 Microsoft에서 WCF의 향후 버전에서 일부 활성화 기능을 추가 할 때까지 기다려야합니다. Microsoft Connect에 액세스 할 수있는 경우 add your voice to the others requesting this feature 수 있습니다.

편집 : 나는 너무 비관적이었다. 나는 지금 이것을 할 길을 발견했다.

핵심은 파이프를 만들 때 보안 설명자에 무결성 레이블을 지정할 필요가 없다는 것이었지만 청취자가있을 때 CreateNamedPipe에서 반환 된 핸들을 사용하여 SACL을 수정해야한다는 것이 핵심이었습니다 열렸습니다. 즉, 파이프의 첫 번째 서버 측 핸들입니다. 다른 핸들을 사용하면 무결성 레이블을 추가하려는 시도가 항상 실패합니다. 에 대한 플래그 매개 변수 dwOpenMode은 비트 중 하나의 사용이 FILE_FLAG_FIRST_PIPE_INSTANCEWRITE_OWNER을 모두 의미하기 때문에 오버로드됩니다. 무결성 레이블을 추가하려면 후자의 액세스 권한이 필요하지만 전자의 존재로 인해 첫 번째 파이프 인스턴스 이외에는 호출이 실패합니다.

첫 번째 파이프 손잡이를 잡는 것은 쉬운 일이 아닙니다. WCF는 파이프 연결 수신기가 유지 관리하는 목록에 저장된 System.ServiceModel.Channels.PipeConnectionListener.PendingAccept 형식의 인스턴스를 멀리합니다. 연결 수신기는 채널 수신기와 동일하지 않습니다 (바인딩 요소의 BuildChannelListener<> 메서드를 재정 의하여 직접 잡을 수 있음). 도착하는 것이 훨씬 어렵습니다. 엔드 포인트의 연결 수신기에 대한 참조를 보유하는 끝점에 대한 TransportManager를 찾은 다음 파이프 연결 수신기가 발견 될 때까지 연결 수신기 체인을 추적 (추적 등의 구성에 따라 다름)하는 영웅을 포함합니다. . 운이 좋으면 첫 번째 파이프 핸들을 리스너의 보류중인 수락 목록에서 찾을 수 있습니다 (여기에 경쟁 조건이 있지만 클라이언트가 핸들을 잡기 전에 클라이언트가 연결되면 영원히 사라집니다).

일단 핸들을 사용할 수있게되면 무결성을 낮추어 낮은 무결성 클라이언트가 서비스와 통신 할 수있게하고 무결성 레이블을 추가하기 위해 핸들에 SetSecurityInfo을 호출하면됩니다.

곧 연락 드리겠습니다. my blog에 대한 세부 정보입니다.

관련 문제