任何人都知道为什么我无法在C#中以编程方式访问winevt文件夹?

时间:2010-06-02 13:24:17

标签: c# events logging

我一直在尝试使用C#以编程方式进入'C:\ Windows \ System32 \ winevt \ Logs'文件夹,因此我可以将事件日志文件复制到备份目录,然后清除事件日志作为每日备份设备,但我似乎无法访问此目录。

我已经尝试将应用程序清单更改为在administrator()下运行,这会在执行程序时向我提供UAC提示,并且我甚至在NT AUHORITY \ SYSTEM标识下生成一个shell来执行代码,但它仍然说它是一个无效的路径,即使我可以手动进入管理shell和SYSTEM shell下的目录。

我把它隔离到了不能进入winevt目录。 我使用此代码来查看是否可以访问该目录。

Environment.CurrentDirectory = System.Environment.SystemDirectory + @“\ winevt \”;

仅接收

System.IO.DirectoryNotFoundException:找不到路径'C:\ Windows \ system32 \ winevt \'的一部分。    在System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)    在System.IO.Directory.SetCurrentDirectory(String path)    at System.Environment.set_CurrentDirectory(String value)    在d:\ SourceCodes \ dev_EventLog \ dev_EventLog \ Program.cs中的dev_EventLog.Program.Main(String [] args):第30行

我已经尝试了许多不同的方法来指定目录,但它们都是一样的,我也尝试过不同的System32子文件夹,而且我尝试过的winevt是唯一一个像这样做的人。

这让我疯了,任何人都知道为什么这不能在C#下运行,或者我被迫使用VBScript来执行此操作,因为以下VBScript代码可以复制事件日志文件。

dim filesys set filesys = CreateObject(“Scripting.FileSystemObject”) filesys.CopyFile“C:\ Windows \ System32 \ winevt \ Logs \ Application.evtx”,“C:\ rusl \ Application.evtx”

2 个答案:

答案 0 :(得分:6)

您的应用程序是否在64位版本的Windows上作为32位应用程序运行?如果是,则对%windir%\System32的任何访问都会重定向到%windir%\SystemWOW64(没有winevt目录)。

如果您使用%windir%\Sysnative\winevt,则应该可以访问它。

答案 1 :(得分:0)

根据John Rasch的建议,在我将system32更改为sysnative后,我现在可以使用的代码。

string LogFileDirectory = @"C:\Windows\Sysnative\winevt\Logs\";
string LogFileExtension = ".evtx";
string Date = DateTime.Now.Year.ToString() + "-" + DateTime.Now.Month.ToString() + "-" + DateTime.Now.Day.ToString();
string BackupDir = @"C:\Backups\" + Date + "\\";
Directory.CreateDirectory(BackupDir);
foreach (EventLog log in EventLog.GetEventLogs())
{
 string source = LogFileDirectory + log.Log + LogFileExtension;
 string dest = BackupDir + log.Log + LogFileExtension;
 try
 {
  File.Copy(source, dest);
 }
 catch (Exception e)
 {
  Console.WriteLine("Error occured :" + e.Message);
  Console.WriteLine(e);
 }
 finally
 {
  if (!File.Exists(dest))
  {
   Console.WriteLine("Backup Failed for " + log.Log);
  }
  else
  {
   Console.WriteLine("Backup Successful for " + log.Log);
   //log.Clear();  // Commented out during development
  }
 }
}