2011-05-10 60 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

相关问题