0

현재 C# 및 .net 프레임 워크 4.5를 사용하여 기존 프로그램의 기능을 확장하는 Windows 서비스를 개발 중입니다.이 서비스는 주 응용 프로그램에서 신호가 지정된 명명 된 이벤트를 기다리는 EventWaitHandleClass (msdn link)에서 차단됩니다. 이런 식으로 뭔가 :EventWaitHandle을 사용하여 명명 된 이벤트를 기다리는 Windows 서비스에 문제가 있습니다.

bool boolWithFalse = false; 
string eName = "notification_event"; 
string usr = Environment.UserDomainName + "\\" + Environment.UserName; 
EventWaitHandleSecurity security = new EventWaitHandleSecurity(); //* 
EventWaitHandleAccessRule rule = new EventWaitHandleAccessRule(usr, EventWaitHandleRights.Synchronize, AccessControlType.Allow); 
security.AddAccessRule(rule); 
EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.ManualReset, eName, out boolWithFalse, security); 

//... some non relevant code lines here 

//This is where the it locks waiting for the named event 
var w = EventWaitHandle.WaitAny(new[] { handle }, Timeout.Infinite); 

* : EventWaitHandleSecurity MSDN

지금이 내가, 콘솔 응용 프로그램으로 내 프로그램을 실행 내가 의도 한대로 내가 쉽게 기본 응용 프로그램에서 이벤트를 캐치하고이를 처리 할 수 ​​있는지 매력처럼 작동, 하지만, 응용 프로그램을 서비스로 설치하면 동일한 명명 된 이벤트를 기다리지 만 신호를받지 못합니다. 이 서비스는 NT AUTHORITY \ LOCALSERVICE 계정을 사용하여 실행되도록 설정되어 있습니다. 이미 자신의 계정 (progam이 콘솔 응용 프로그램으로 실행되는 동안 사용함)을 사용해 보았지만 아무런 결과가 없습니다.

신호를 생성 한 응용 프로그램이 내 계정으로 실행되는 데 도움이되는 경우. Windows 용 데스크톱 응용 프로그램을 개발하는 초보자이므로 도움을 주셔서 감사드립니다.

+0

스택 오버플로에 오신 것을 환영합니다. 질문을 수정했습니다. http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-the-titles –

+0

알겠습니다. 감사합니다. – George181716

답변

1

당신은 보안 문제에 빠져 들었습니다. 두 가지 문제. 첫 번째 것은 누군가이 이벤트를 생성해야하고 누군가 다른 사람이을 열어야 만하므로 두 구성 요소가 동일한 이벤트 객체를 공유합니다. 그 중 하나는 EventWaitHandle 생성자를 사용해야하고 다른 하나는 EventWaitHandle.OpenExisting() 메서드를 호출해야합니다. 일반적인 방법은 서비스가 이벤트를 만들고 UI 프로그램이 이벤트를 여는 것입니다.

다음 문제는 이벤트 개체 표시입니다. Windows는 C# 언어로 네임 스페이스를 사용하는 것과 매우 유사한 명명 된 운영 체제 개체의 네임 스페이스를 구현합니다. 루트 네임 스페이스는 세션에 의해 명명됩니다. 그리고 서비스는 사용자의 데스크톱 프로그램과 다른 세션에서 실행됩니다. 데스크탑 세션 프로그램이 서비스 세션에서 작성된 이벤트를 볼 수있게하려면 "전역"이벤트 이름을 사용해야합니다. 어떤 모양입니까?

string eName = "Global\\notification_event"; 

전역으로 표시되는 명명 된 이벤트의 이름을 지정하는 방법에주의하십시오. 언젠가 언젠가 "notification_event"가 이름을위한 좋은 선택이라고 생각하는 또 다른 프로그래머가 있습니다. 너는 그를 만나고 싶지 않아. {guid}는 좋은 이름이고 Tools + Create GUID에서 가져옵니다. 그것은 알려진 우주에서 유일 할 수 있습니다.

+0

그게 흥미 롭군요, 문제는 내가 서비스를 통해 현재 세션에서 생성 된 객체를보기 위해 반대쪽을 달성하려고 시도하고 있다는 것과 어떤 식 으로든 데스크탑 프로그램을 수정할 수 없다는 것입니다. 이것을하기 위해. 그리고 이름 제안, 코드 샘플에 사용되는 이름으로 guid 주셔서 감사합니다, 내 코드의 무례한 아래 예제를 제공하기 위해 =). 어쨌든, 제가 찾을 수있는 것을보기 위해 주제를 파헤 치며, 지침에 대한 감사의 말로 투표를 할 수 있기를 바랍니다. – George181716