2010-05-06 4 views
4

WMI 및 C#을 사용하여 원격 컴퓨터의 이벤트 뷰어에서 알림을 얻으려고합니다. 시스템에 연결할 수 있으며 ManagementObjectSearcher을 사용하여 이벤트 로그를 가져올 수 있습니다. 하지만 ManagementEventWatcher.Start 메서드를 사용하려고하면 예외가 발생합니다.ManagementEventWatcher (WMI)가 원격 컴퓨터에서 이벤트를 알리는 동안 예외가 발생했습니다.

액세스가 거부되었습니다. (HRESULT에서 예외 : 0x80070005와 (E_ACCESSDENIED))

나는 root\cimv2에 WMI 컨트롤의 권한 '을 부여하고 또한 DCOM 구성에서 사용자의 계정에 관리자 권한을 부여했다.

나는 정상적인 Windows 응용 프로그램을 사용하고 있으므로 ASP.net (ASPNET 사용자)을 사용하지 않습니다.

내 코드는 다음과 같습니다

ConnectionOptions connectionOptions = new ConnectionOptions(); 
connectionOptions.Username = @"Domain\UName";//txtUserName.Text; 
connectionOptions.Password = "pass";//txtPassword.Text; 
connectionOptions.Impersonation = ImpersonationLevel.Impersonate; 
ManagementScope managementScope = new ManagementScope(@"\\server\root\cimv2",connectionOptions); 
managementScope.Options.EnablePrivileges = true; 
managementScope.Connect(); // this line is executing fine. 
eventWatcher = new ManagementEventWatcher(managementScope, new EventQuery("Select * From __InstanceCreationEvent WHERE TargetInstance ISA 'Win32_NTLogEvent' and TargetInstance.LogFile = 'Application'")); 
eventWatcher.EventArrived += new EventArrivedEventHandler(Arrived); 
eventWatcher.Scope.Options.EnablePrivileges = true; 
eventWatcher.Start(); // Error occurs here 

답변

4

는) WaitForNextEvent (과 반 기적 듣고 시도해보십시오

var managementScope = new ManagementScope(@"\\mysever\root\onguard"); 
    managementScope.Connect(); 

    var query = new EventQuery("select * from lnl_AccessEvent"); 
    var eventWatcher = new ManagementEventWatcher(managementScope, query); 
    var wmiEvent = eventWatcher.WaitForNextEvent(); 
    Console.Out.WriteLine(wmiEvent.GetPropertyValue("Description")); 

우리는 또한 유용 Wbemtest.exe를 발견했습니다. Notification Query ... 단추를 클릭하여 이벤트를 수신하십시오. 다양한 연결 방법 (동기, 비동기 또는 반 동기)을 시도 할 수 있습니다. 로컬 컴퓨터에 연결할 때 모든 연결 방법이 작동하지만 반동기만 원격으로 작동 할 수있었습니다. 서버가 클라이언트와 다시 연결해야하기 때문에 비동기 (사용중인)는 더 복잡합니다.

보안 및 구성 설정에 대한 몇 가지 좋은 정보 : http://www.packettrap.com/network/Knowledge-Base/PacketTrap-MSP/WMI-Troubleshooting.aspx#_Toc239699682

+3

이것은 분명히 받아 들여진 답변 일 것입니다. 이 오류를 해결하기 위해 많은 시간을 소비하지만 비동기 버전은 단순히 인증과 작동하지 않습니다. 이 답변에 감사드립니다. –

+0

@Pieter - 가능합니다. 제 답변을 참조하십시오. Microsoft는 여전히 semi-synchronous 방법을 권장합니다. –

4

먼저, (브라이언 제안) Microsoft recommends the use of semi-synchronous operations 것을 명심 : 당신이 할 수있는 경우

, 우리는 당신이 반을 사용하는 것이 좋습니다 대신 동기 동작 . 성능 효과가 작고 반 동기식 작업은 동일한 기능을 허용하지만 반대로 연결을 필요로하지 않습니다.

Setting Security on an Asynchronous Call in VBScript도 참조하십시오.

여전히 다음 문서를 참조 비동기 작업을 사용하려면 : (YMMV

,하지만 나를 위해 클라이언트 : Win7 x64 SP1 서버 : Windows Server 20 E_ACCESSDENIED 예외에 대한 솔루션이 세 번째 기사에서 발견되었다) 방화벽 O/승 08 기업 SP2 :

  1. 시작을 클릭, 실행을, DCOMCNFG을 클릭 한 다음 확인을 클릭합니다.구성 요소 서비스 대화 상자에서
  2. 구성 요소 서비스을 확장 컴퓨터를 확장 한 다음 내 컴퓨터을 마우스 오른쪽 버튼으로 클릭하고 속성을 클릭합니다.
  3. 내 컴퓨터 속성 대화 상자에서 COM 보안 탭을 누릅니다.
  4. 액세스 권한을 클릭하고 편집 제한을 클릭하십시오. 액세스 권한 대화 상자에서
  5. 그룹 또는 사용자 이름 상자에 ANONYMOUS LOGON 이름을 선택합니다. 아래의 열을 허용 에 대한 사용 권한 원격 액세스을 선택하고 확인을 클릭하십시오.

위의 내용은 고객에 있습니다. DCOM 사용 권한 문제가 해결되었지만 WMI 액세스 거부 오류 (0x80041003)가 발생했습니다. 그것은 두 번째 기사에서 언급 한 레지스트리 키 때문 밝혀 :

설정이 원격 연결이 신뢰 관계가없는 컴퓨터 사이 경우 업데이트 할 필요가있는 CIMOM; 그렇지 않으면 비동기 연결이 실패합니다. 이 설정은 동일한 도메인 또는 트러스트 된 도메인에있는 컴퓨터의 경우 으로 수정하면 안됩니다.

다음 레지스트리 항목이 익명 콜백을 허용하도록 수정해야합니다 : 마이크로 소프트 \ HKLM \ 소프트웨어를 \ WBEM \ CIMOM \ AllowAnonymousCallback AllowAnonymousCallback 키를 0으로 설정하면

는 WMI 서비스 는 익명 콜백을 방지 클라이언트. 값을 1로 설정하면 WMI 서비스에서 클라이언트에 익명 콜백을 허용합니다.

위의 내용은 서버에 설정해야합니다. 일단 그렇게하면 비동기 콜백이 작동합니다. 시도 할 수있는 다른 방법은 클라이언트를 관리자로 실행하고 ConnectionOptions.EnablePrivileges을 true로 설정하는 것입니다. 문제 해결을위한

참조 :

, 당신이 마이크로 소프트의 WMI 테스터를 활용하는 것이 좋습니다 (%windir%\system32\wbem\wbemtest.exe)

0

나는 시간을 보냈다 피규어 이거 하나 꺼내. 위의 어느 것도 나를 위해 일하지 않았다.

기계 - 기본 권한 설정이 수행

내 IIS 서버의 이벤트 로그를 분석 한 후 나는 내가 ManagementEventWatcher 개체의 시작 방법을 호출 할 때마다 시스템 로그에 receivingthe 다음과 같은 오류 사건이었다 발견 CLSID로 COM 서버 응용 프로그램에 대한 로컬 활성화 권한을 부여하지 {49BD2028-1523-11D1 - AD79-00C04FD8FDFF} 사용자에게이 IIS AppPool을 \을 DefaultAppPool SID {49BD2028-1523-11D1-AD79-00C04FD8FDFF} 및 APPID (S-1-5-82-3006700770-424185619-1745488364-794895919-4004696415)에서Address LocalHost (LRPC 사용). 이 보안 권한은 구성 요소 서비스 관리 도구를 사용하여 으로 수정할 수 있습니다.

레지스트리 검색 오류에 지정된 APPID와 응용 프로그램이 로컬 활성화 권한을 부여 할 필요가 비동기 콜백 작업을하려면

마이크로 소프트 WBEM 무담보 아파트

로 나타났다 이 COM 개체를 IIS APPPOOL \ DefaultAppPool 사용자에게 보냅니다. 사용자가 보안 데이터베이스에 유효한 계정으로 표시되지 않는다는 사실을 제외하고는 쉽게 들립니다. 이것은 IIS 응용 프로그램 풀이 만들어 질 때 자동으로 생성되는 시스템 생성 사용자 계정이기 때문입니다.

과정은 다음과 같이이 작품은 만들려면 :

  1. 실행 MMC를 구성 요소 서비스
  2. 열기 Computers-> 내 컴퓨터 -> DCOM 구성
  3. 스크롤 아래로 스냅인 추가 " Microsoft WBEM 무보증 아파트 개체 "
  4. 오른쪽을 클릭하고 속성을 선택하십시오.
  5. 보안 탭을 클릭하고"시작 및 활성화 권한 "섹션에서 사용자 지정 옵션을 선택하고
  6. IIS 서버가 도메인의 일부인 경우 도메인이 아닌 위치 필드에 로컬 컴퓨터가 지정되어 있는지 확인하십시오.
  7. 추가 단추를 누르고 "IIS APPPool \ DefaultAppPool"을 입력란에 입력하고 이름 확인 단추를 누릅니다. DefaultAppPool을 사용하지 않는 경우 사용중인 응용 프로그램 풀의 이름으로 대체하십시오.
  8. 상자에 유효한 사용자가 표시되면 확인을 누릅니다.
  9. 목록에서 사용자를 선택하고 로컬 시작 및 로컬 활성화를 위해 상자 허용을 선택하십시오.
  10. WMI 이벤트 수신기에 대한 asynch 콜백에서 E_ACCESSDENIED가 더 이상 표시되지 않습니다.
관련 문제