Кто-нибудь знает, почему я не могу получить доступ к папке winevt программно в C #? - PullRequest
2 голосов
/ 02 июня 2010

Я пытался программно войти в папку 'C: \ Windows \ System32 \ winevt \ Logs', используя C #, чтобы я мог скопировать файлы журнала событий в резервную папку и затем очистить журналы событий как часть устройство для ежедневного резервного копирования, но я не могу получить доступ к этому каталогу.

Я попытался изменить манифест приложения, чтобы он запускался под администратором (), который выдает приглашение UAC при запуске программы, и я даже зашел так далеко, что порождал оболочку с идентификатором NT AUHORITY \ SYSTEM для выполнения код, но он по-прежнему говорит, что это неверный путь, хотя я могу вручную войти в каталог как в административной оболочке, так и в оболочке SYSTEM.

Я выделил это, просто не имея возможности войти в каталог 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) в System.Environment.set_CurrentDirectory (строковое значение) в dev_EventLog.Program.Main (String [] args) в D: \ SourceCodes \ dev_EventLog \ dev_EventLog \ Program.cs: строка 30

Я пробовал много разных способов указать каталог, но он все тот же, и я также пробовал разные подпапки System32 и из 10 или около того, что я пробовал 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 ]

6 голосов
/ 02 июня 2010

Ваше приложение работает как 32-разрядное приложение в 64-разрядной версии Windows? В этом случае любой доступ к %windir%\System32 перенаправляется на %windir%\SystemWOW64 (там, где нет каталога winevt).

Если вы используете %windir%\Sysnative\winevt, вы сможете получить к нему доступ.

0 голосов
/ 02 июня 2010

Вот код, который у меня работает, теперь работает после того, как я изменил 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
  }
 }
}
...