2013-04-12 3 views
20

우리 응용 프로그램은 명명 된 파이프를 통해 WCF를 사용하여 두 프로세스간에 통신합니다 (두 프로세스 모두 Windows 서비스 없음). 우리 응용 프로그램은 몇 년 동안 아무런 문제없이 현장에서 실행되었습니다.타사 응용 프로그램이 WCF 응용 프로그램을 중단 함

이제 타사 응용 프로그램 (특히 Garmin Express)이 우리 회사를 침해한다는 신고가 접수되었습니다. Garmin Express를 집에 설치하고 동작을 확인했습니다. 특히 Garmin Core Update Service를 실행하면 응용 프로그램이 실패하게됩니다.

Garmin 서비스가 실행 중일 때 응용 프로그램의 "서비스"쪽이 시작되고 WCF 끝점을 만드는 데 문제가 없습니다. 그러나 클라이언트가 시작되어 서비스에 연결하려고하면 서비스가 실행되지 않는 것처럼 EndpointNotFoundException이 발생하여 실패합니다.

이 시점에서 필자는 문자 그대로 서비스 제어판에서 Garmin 서비스를 중단 한 다음 자체 서비스를 다시 시작하지 않고도 클라이언트를 성공적으로 다시 실행할 수 있습니다. Garmin 서비스를 다시 시작하면 클라이언트를 시작하려는 시도가 더 이상 실패합니다. 따라서 적어도 WCF 서비스가 계속 실행되고 Garmin 소프트웨어가 클라이언트의 연결 기능을 차단하고 있음을 증명합니다.

엔드 포인트 주소에 고유 한 이름을 사용하고 있습니다 (예 : "net.pipe : // localhost/MyPrivateApplication"). 이 주소를 다양한 다른 이름으로 변경하려고 시도했지만 문제에는 아무런 영향이 없습니다.

어떻게하면 다른 응용 프로그램을 실행해도 응용 프로그램의 WCF 사용 기능이 손상 될 수 있습니까?

업데이트 : 요청에 따라 서비스 측 코드 스 니펫이 있습니다. 문제를 격리하기 위해 원래 코드에서 코드를 단순화했습니다. 지금까지 한 가지 변화 만이 이슈에 영향을 미치지 않았습니다. 귀하의 질문에

MyService service = new MyService(); 
ServiceHost host = new ServiceHost(service); 
string hostAddress = new Uri("net.pipe://localhost/MyWCFConnection"); 
host.AddServiceEndpoint(typeof(IMyService), new NetNamedPipeBinding(), hostAddress); 
host.Open(); 
+0

서비스가 서비스 URL을 어떻게 지정합니까? 기본 + 상대 주소 또는 부주의 한 주소입니까? 어쩌면 당신은 당신의 서비스 엔드 포인트가 어떻게 설정되어 있는지 보여주는 code/config의 추출물을 게시 할 수 있습니다. –

+0

내 게시물을 코드 스 니펫으로 업데이트했습니다. 나는 이것이 절대 주소라고 확신한다, 맞습니까? 이 서비스 측 코드는 Garmin 서비스가 실행 중인지 여부에 관계없이 성공적으로 실행됩니다. 클라이언트 측만 영향을받습니다. – ObjetDart

+0

네, 그 주소는 절대 주소입니다. 그래서 제 첫 제안보다 더 미묘한 일이 있습니다. –

답변

12

한 가지 가능한 대답은 "다른 응용 프로그램으로, 간단하게 실행하여, 우리 자신의 응용 프로그램을 깰 수있는 방법은 ..."

  1. 다른 응용 프로그램은 또한 WCF NetNamedPipeBinding을 사용합니다.
  2. 두 응용 프로그램 모두 기본 + 상대 URL을 사용하여 서비스 끝점을 만듭니다.
  3. 응용 프로그램의 기본 주소 선택 및 HostNameComparisonMode는 응용 프로그램 간의 이름 충돌이 one of the URL variants used by the client-side WCF stack to locate the metadata for the service에있는 것과 같습니다.

Garmin 서비스가 실제로 WCF NetNamedPipeBinding을 사용하는지 여부는 알 수 없지만 조사해야 할 한 가지 가능성이 있습니다. 문제는 항상 using absolute URLs for NetNamedPipe endpoints으로 피할 수 있습니다.


OK, 그래서 질문에 대한 업데이트를 다음, 우리는 지금 가민 서비스는 WCF NetNamedPipeBinding을 사용하고 있음을 알고, 우리는 응용 프로그램이 위의 설명이되지 않도록, 절대 주소를 사용하여 서비스를 등록 것을 알고있다 완전한 이야기.

  1. 는 가민 서비스가 보안 권한 SeCreateGlobalPrivilege을 (특별히 권한을 해제하도록 코딩하지 않는 한 Windows 서비스가있을 것이다)가있는 프로세스에서 실행한다고 가정 : 여기

    다른 가설이다.
  2. WCF 명명 된 파이프 끝점에 net.pipe : // localhost 및 상대 끝점 주소의 기본 주소가 등록되어 있다고 가정합니다.
  3. 이제 서비스 네임 스페이스는 전역 네임 스페이스의 이름을 가진 공유 메모리 매핑 개체를 사용하여 게시됩니다.
  4. 서비스 응용 프로그램이 Windows 서비스가 아닙니다. 내 가설은 프로세스에 SeCreateGlobalPrivilege라는 보안 권한이 없다는 것입니다. 이 경우 해당 서비스 메타 데이터는 로컬 세션 네임 스페이스에서만 공유 메모리 매핑 객체를 사용하여 게시됩니다.
  5. Garmin 서비스가 실행 중일 때 클라이언트 프로세스가 연결을 시작하려고합니다 ... WCF 클라이언트 측 채널 스택 NetNamedPipeBinding 요소는 서비스 URL에 기반하여 서비스 메타 데이터를 찾습니다. net.pipe : // localhost/MyWCFConnection. 위의 링크에서 설명한 것처럼 서비스 URL의 다양한 변형을 사용하여 검색을 실행하여 메타 데이터가 포함 된 공유 메모리 개체의 이름을 얻습니다. 로컬 네임 스페이스를 살펴보기 전에 전역 네임 스페이스를 먼저 살펴보고 변형의 전체 목록을 찾습니다.
  6. 이 경우 첫 번째 시도는 "net.pipe : // +/MyWCFConnection"에서 파생 된 이름 일 것이며 아마도 전역 이름 공간에서이 이름을 가진 개체를 찾지 못할 것입니다.
  7. 두 번째 시도는 변형 "net.pipe : // + /"를 기반으로하며 전역 네임 스페이스에 게시 된 Garmin 서비스의 공유 메모리 매핑 이름과 일치합니다. 검색 순서로 인해 로컬 세션 네임 스페이스에 게시 된 서비스의 메타 데이터가 표시되지 않습니다.
  8. 클라이언트가 Garmin 서비스의 파이프에 연결을 시도합니다. Garmin 서비스가 구현 된 보안 기능을 구현했다고 가정하고 액세스 거부로 클라이언트를 리풀이하는 결과가 발생합니다 (예 : set an ACL on its pipe). 그 결과는 EndpointNotFoundException으로 나타날 수 있습니다. [LATER EDIT : 사실, 클라이언트가 Garmin 서비스에 실제로 연결하고 프레이밍 프로토콜의 프리앰블 핸드 셰이크를 시작하고 Via 레코드에서 요청한 URL 때문에 프레이밍 프로토콜 오류 (http://schemas.microsoft.com/ws/2006/05/framing/faults/EndpointNotFound)를 수신하는 경우가 대부분입니다 Garmin 서비스가 기대하는 것과 일치하지 않습니다. 바인딩은 연결을 끊고이 오류를 클라이언트 코드에 EndpointNotFoundException으로 발생시킵니다.]

어떻게 할 수 있습니까? 내가 제안 : // localhost를, 가장 잘 소유에 도착하는 것입니다 :

    위의 가설 또는 유사한 무언가가 확인 될 수있는 경우
  • 및 가민 단지 net.pipe의베이스 주소베이스 + 상대를 사용하는 문제는 기본 주소를 고유 한 가능성이 높은 것으로 변경하여 이러한 문제를 매우 쉽게 해결할 수 있다는 것입니다.
  • SeCreateGlobalPrivilege 보안 서비스 권한으로 서비스 응용 프로그램을 실행할 수있는 방법을 찾으면 해결할 수 있습니다. Windows 서비스 나 관리자로 실행하지 않고도 불가능하지만 불가능하지는 않습니다. 그런 다음 메타 데이터도 전역 네임 스페이스에 게시되고 클라이언트의 검색은 Garmin의 검색 전에 찾을 수 있습니다.
  • [나중에 수정] 바인딩의 HostNameComparisonMode 속성을 Exact로 설정하고 로컬 호스트의 동의어를 서비스 URL의 호스트 부분으로 사용하는 방법이있을 수 있습니다 (예 : net.pipe : //127.0.0.1)./MyWCFConnection). 이렇게하면 Garmin 변형을 검색 할 수 있으므로 클라이언트가 로컬 세션 네임 스페이스에서 이름을 고려할 기회를 갖게됩니다. 나는 그것이 효과가 있을지 모른다. 그러나 시험 할만한 가치가있다, 나는 생각했을 것이다.
  • 매우 긴 샷 : 귀사는 Microsoft와 제품 지원 관계를 맺고 있습니까?아마도 이것이 WCF의 심각한 디자인 결함입니다. 당신이 그것에 대해 소란스럽게한다면 Microsoft에 QFE 패치를 발급받을 수 있습니다. 로컬 네임 스페이스 만 시도하도록 클라이언트 측 스택에 알리는 바인딩 속성을 제공합니다.
+0

Garmin 서비스도 [이 기사] (http://blogs.msdn.com/b/rodneyviana/archive/2011/03/22/named-pipes)의 정보를 기반으로 WCF NetNamedPipeBinding을 사용하고 있다고 확신합니다. -in-wcf-are-by-by-you-by-you-how-to-the-find-the-Windows-object-name.aspx)를 사용합니다. Garmin 서비스가 시작되면 명명 된 파이프를 사용하는 다른 WCF 서비스와 동일한 GUID 스타일 이름의 새 명명 된 파이프가 나타납니다. – ObjetDart

+0

서비스 측 프로세스를 관리자로 실행하면 문제가 없어지는 것을 확인했습니다. 그것은 확실히 두 번째 이론을 뒷받침 해줍니다. 이것은 우리가 현장에서 문제를 해결하는 데 도움이되지는 않지만 적어도 현재 가능한 설명을 가지고 있습니다. – ObjetDart

+0

그래서 우리는 붙어있는 것처럼 들립니다. 우리는 지금이 분야에서이 문제를 해결할 필요가 있습니다. Garmin이 제품 출시주기에 맞추어 수 개월 또는 수 년이 걸릴 때까지 기다릴 수 없습니다. 제품의 서비스 측 프로세스 부분은 최종 사용자의 계정으로 실행되므로 AFAIK는 SeCreateGlobalPrivilege로 실행할 수 없습니다. – ObjetDart

6

Microsoft는 Garmin Core Update Service가 명명 된 파이프를 만드는 방식에 대한 문제를 제로로 처리했습니다. 명명 된 파이프는 다른 범위 - 글로벌 및 로컬에서 만들 수 있습니다. 전역 범위는 본질적으로 기계 전체이며 로컬은 사용자에 따라 다릅니다. Garmin의 응용 프로그램은

a입니다. 시스템 서비스로 실행되므로 명명 된 파이프 서비스를 수신하는 범위는 전역입니다.

b. "net.pipe : // localhost /"의 루트 주소에서 수신 대기 (예 : 하위 경로/세그먼트 없음).

c. StrongWildcard 호스트 이름 비교 모드 사용.

d. 항목 a ~ c는 Garmin의 응용 프로그램이 본질적으로보다 구체적인 무언가와 일치하지 않는 모든 그물 파이프 연결을 의미하는 것을 의미합니다.

e. 또한 Garmin이 로컬 범위를 사용하는 모든 청취자를 완전히 차단하고 있음을 의미합니다.

Garmin 응용 프로그램에서 net.pipe 수신기를보다 구체적인 URL로 등록하도록 변경하는 것이 이상적입니다.

+2

Microsoft는이 문제를 수정하거나 수정해야한다고 생각합니다. 우리는 방금 "HP Support Solutions Framework 서비스"라는 서비스가이 문제를 일으키는 것을 발견했습니다. – Pep

4

나는 net.pipe를 사용하는 응용 프로그램을 표시하는 방법을 발견했습니다 (반드시 잘못 사용하지는 않았지만).

먼저 다운로드 시스 인 터널에서 핸들 응용 프로그램 :

https://technet.microsoft.com/en-us/sysinternals/handle.aspx?f=255&MSPPError=-2147217396

그런 다음 관리자로 명령 프롬프트 를 열고 "Handle.exe의 net.pipe"(마이너스 따옴표)를 실행합니다. 현재 실행중인 net.pipe를 사용하는 모든 응용 프로그램이 나열됩니다. 거기에서, 범인이 발견 될 때까지 한 번에 하나씩 죽이거나 사용 중지 할 수 있습니다. 나는 그것을 사용하는 프로세스가 4 ~ 5 개가 넘는다. 관리자 권한으로 명령 프롬프트를 실행하지 않으면 결과가 0 일 수 있습니다. 다음은

는 net.pipe을 방해 내가 찾은 모든 응용 프로그램입니다 :

  • "HP 지원 솔루션 프레임 워크 서비스"을 - 일부 버전
  • "가민 코어 업데이트 서비스"
  • 영향 - 최신 버전으로 고정되었지만 기한이 만료되었습니다.
  • "WBE 서비스" - 무선 랩톱을 무선 도킹 상태 이온
  • 서비스 "인텔 (R) 보안 지원"- 나는 Win10 몇에서 본 초기
  • 2016 "Baraccuda WSA 서비스" 휴대용 퍼스널 - 웹 보안 에이전트. 아마도이 기능을 사용 중지하면 고객을 화나게 할 것입니다.
  • "DropboxOEM.exe" - 상점에서 구입 한 PC에 포함시키기위한 Dropbox의 변형입니다. 지금까지 Win10에서만 나타났습니다.이것은 내가 윈도우 서비스가 아니라는 것을 처음 발견했기 때문에 독특합니다. 내가 말할 수있는 최선의 방법입니다.
  • "MTC 서비스" - 일부 게 토크 브랜드 PC에 설치됩니다. 그것이 무엇인지 확신하지 못합니다.
  • "pcdrcui.exe" - 서비스는 아니지만 admin으로 실행됩니다. Dell SupportAssist의 구성 요소.

net.pipe가 필요한 응용 프로그램을 지원하므로이 목록을 업데이트하므로이 작업을 수행하는 서비스가 더 많습니다.

+0

이 매우 도움이되는 답장을 보내 주셔서 감사합니다. 많은 두통을 덜어 줬습니다! 우리는 OP와 똑같은 상황이었고 당신의 지시에 따라 범인을 확인할 수있었습니다. 우리의 경우 Wonderware InTouch HMI 시스템과 함께 제공되는 ** "Wonderware InTouch IData Service"** ('SE.Scada.Asb.InTouchDataService.exe')였습니다 (정확히 무엇을하는지 모르겠습니다). 이 프로세스를 종료하면 갑자기 WCF 기반 응용 프로그램이 다시 작동하게되었습니다. – Golvellius