2011-05-10 2 views
1

이벤트 로그를 필요한 형식으로 파일에 보관하는 기능이 있습니다.WMI로 응용 프로그램 이벤트 로그를 백업 할 때 seBackupPrivilige가 필요합니다.

Windows 이벤트 로그 (Application, SecuritySystem)에 대해 테스트하고 있습니다. 모든 테스트에서 코드는 로컬 관리자 권한으로 실행됩니다.

내 개발 환경에서 코드는 각 로그 파일을 "* .evt"파일 이름으로 백업합니다. SecuritySystem 로그가 제대로 작동하지만 Application 로그를 처리하는 단계 ManagementException 발생 대상 기준 시스템에서

.

예외의 상호 작용은 아래에 포함되어 있습니다. 내 질문은 이것이 보안 권한 문제라고 생각하는 것이 맞습니까? 내 모든 원하는 경우에이 코드가 작동하도록하는 코드 변경 사항은 무엇입니까? 확실한 답을 얻지 못하면 생각과 생각이 감사하게됩니다.

ErrorCode가 : 매개 변수 정보를

을 ExecMethod : 설명 :

ErrorInformation을 AccessDenied 로그 파일을 오픈하지만 백업하는 데 실패, 특권의 오류

작동 Win32_NTEventlogFile.Name = "C : \ WINDOWS \ system32 \ config \ AppEvent.Evt "

특권 아니 도움말 : - SeBackupPrivilege

PrivilegesRequired : - SeBackupPrivilege

에는 ProviderName : WinMgmt에

상태 코드 : 모든 데이터는 정오표에 대한 사과 있도록 전사된다 2147749891

using System.Management; 
/* ... Omitted for brevity */ 

public static void WMIBackup(String logName, String targetFile) 
{ 
    ManagementScope scope = new ManagementScope("root\\CIMV2"); 
    scope.Options.Impersonation = ImpersonationLevel.Impersonate; 
    scope.Options.EnablePrivileges = true; 

    ObjectQuery query = new ObjectQuery(
     String.Format("SELECT * FROM Win32_NTEventLog WHERE LogFileName={0}", 
      logName) 
    ); 

    using (ManagementObjectSearcher search = 
     new ManagementObjectSearcher(scope, query)) 
    { 
     var logs = search.Get(); 
     if (logs.Count != 1) 
      throw new ArgumentOutOfRangeException("logName not found"); 

     foreach (ManagementObject log in logs) 
     { 
      ManagementClass eventLogClass = 
       new ManagementClass("Win32_NTEventLogFile"); 
      ManangementBaseObject params = 
       eventLogClass.GetMethodParameters("BackupEventLog"); 
      params["ArchiveFileName"] = targetFile; 
      log.InvokeMethod(
       "BackupEventLog", 
       params, 
       new InvokeMethodOptions(
        null, 
        InvokeMethodOptions.InfiniteTimeout) 
      ); 
     } 
    } 
} 

.

+0

Dammit, 나는이 코드를 일대일로 복사했는데 실패했습니다. 이유를보기 위해 잠시 나를 필요로했다. 그는 그가 검색어를 타이핑하는 것을 엉망으로 만든다. 대신 Win32_NTEventLogFile에서 선택 * LogFileName = {0}'이어야합니다. – c00000fd

+0

@ c00000fd가 업데이트되었습니다. – Jodrell

답변

2

과거에 WMI 및/또는 COM 인터페이스에 액세스하는 데 문제가있었습니다. 그것은 한 시스템에서 작동하고 다른 시스템에서는 실패합니다.

다시 시도하면 오류가 발생하지 않는 것으로 나타났습니다. 나는 실패 할 때 짧은 시간 (0.5 초 정도) 기다렸다가 다시 시도 할 것을 제안합니다.

내 코드는 모든 COM 주위에 재시도 루프를 가지고 있으며, WMI는이 샘플과 비슷한 호출

int errorCount = 0; 
bool success = false; 
while (!success || errorCount < maxRetryCount) 
{ 
    try 
    { 
     /* Call to WMI interface */ 
     DoSomething(); 
     success = true; 
    } 
    catch (Exception ex) 
    { 
     if (errorCount < maxRetryCount) 
     { 
      logWarning(ex); 
     } 
     else 
     { 
      logError(ex); 
      throw; /* pass exception up the stack 
      or break and handle failure below */ 
     } 
    } 
} 
if (!success) 
{ 
    /* Handle failure */ 
} 

가 기본이되는 문제가 무엇인지 해결 결코하지 않았다, 그러나 이것은 나를 위해 작동합니다.

+0

음, 이것은 나를 위해 일했습니다. 그것이 실패한 첫 번째 시도가 아니라 응용 프로그램 로그가 빠름을 나타냅니다. – Jodrell

관련 문제