2011-05-10 15 views
1

我有一個將事件日誌以所需格式存檔到文件的功能。使用WMI備份應用程序事件日誌時需要seBackupPrivilige

我正在測試Windows事件日誌,ApplicationSecuritySystem。在所有測試中,代碼都以本地管理員權限運行。

在我的開發環境中,代碼將每個日誌文件備份到我們稱爲「* .evt」文件的所有文件中。

在目標參考系統上,SecuritySystem日誌正常工作,但處理Application日誌會拋出ManagementException

以下包括異常的一個interogation。我的問題是,我有權假定這是一個安全特權問題?哪些代碼更改會使此代碼適用於我所需的所有情況?如果沒有明確的答案,你的想法和想法是值得讚賞的。

錯誤碼:存取遭拒

ErrorInformation:說明:打開日誌文件,但未能對其進行備份,privilige錯誤

操作:ExecMethod

的ParameterInfo:Win32_NTEventlogFile.Name =「C:\ WINDOWS \ system32 \ config \ AppEvent.Evt「

特權不可用: - SeBackupPrivilege

PrivilegesRequired: - SeBackupPrivilege

的ProviderName:WINMGMT

的StatusCode: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

該死的,我複製這個代碼一對一,它開始失敗。我花了一段時間才明白爲什麼。事實證明,他搞砸了查詢。它應該是'選擇*從Win32_NTEventLogFile其中LogFileName = {0}'而不是。 – c00000fd 2018-02-25 11:30:21

+0

@ c00000fd已更新。 – Jodrell 2018-02-26 15:03:31

回答

2

我以前在訪問WMI和/或COM接口時遇到問題。它將在一個系統上工作,並在另一個系統上失敗。

我發現如果重試,錯誤不會發生。我建議,當它失敗時,你等待一段時間(半秒左右)然後重試。

我的代碼有周圍所有的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 2011-05-11 12:10:59

相關問題