2010-06-02 14 views
2

J'ai essayé d'entrer dans le dossier 'C: \ Windows \ System32 \ winevt \ Logs' en utilisant C# pour pouvoir copier les fichiers du journal des événements dans un répertoire de sauvegarde, puis effacer les journaux d'événements dans le cadre d'un appareil de sauvegarde quotidien, mais je ne semble pas pouvoir accéder à ce répertoire. J'ai essayé de changer le manifeste de l'application pour l'exécuter sous administrator() qui me donne l'invite UAC quand j'exécute le programme et je suis même allé jusqu'à engendrer un shell sous l'identité NT AUHORITY \ SYSTEM pour exécuter le code mais il dit toujours que c'est un chemin invalide, même si je peux manuellement aller dans le répertoire sous le shell administratif et le shell SYSTEM.Quelqu'un sait pourquoi je ne peux pas accéder au dossier winevt par programmation en C#?

Je l'ai isolé pour ne pas pouvoir entrer dans le répertoire winevt. J'utilise ce code pour voir si je peux accéder au répertoire.

Environnement.CurrentDirectory = System.Environment.SystemDirectory + @ "\ winevt \";

seulement pour recevoir

System.IO.DirectoryNotFoundException: Impossible de trouver une partie du chemin 'C: \ Windows \ system32 \ Winevt \'. à System.IO .__ Error.WinIOError (Int32 errorCode, String maybeFullPath) à System.IO.Directory.SetCurrentDirectory (chemin String) à System.Environment.set_CurrentDirectory (valeur String) à dev_EventLog.Program.Main (String [ ] args) dans D: \ SourceCodes \ dev_EventLog \ dev_EventLog \ Program.cs: ligne 30

J'ai essayé de nombreuses façons de spécifier le répertoire mais c'est pareil, et j'ai aussi essayé différents sous-dossiers de System32 et de la dizaine, j'ai essayé winevt est le seul à agir comme ça. Cela m'a rendu fou, tout le monde sait pourquoi cela ne fonctionne pas sous C# ou suis-je obligé d'utiliser VBScript pour le faire, puisque le code VBScript suivant fonctionne pour copier le fichier journal des événements.

filesys dim set filesys = CreateObject ("Scripting.FileSystemObject") filesys.CopyFile "C: \ Windows \ System32 \ Winevt \ Logs \ Application.evtx", "C: \ RUSL \ Application.evtx"

+0

Pourriez-vous s'il vous plaît montrer le code complet de ce que vous essayez d'accomplir? Comment est-ce que vous ajoutez le nom de fichier au chemin? –

Répondre

6

Votre application s'exécute-t-elle en tant qu'application 32 bits sur une version 64 bits de Windows? Si c'est le cas, tout accès à %windir%\System32 est redirigé vers %windir%\SystemWOW64 (où il n'y a pas de répertoire winevt). Si vous utilisez %windir%\Sysnative\winevt vous devriez être capable d'y accéder.

+0

Hm, Je ne savais pas qu'il se comportait comme ça. C'est exactement comme tu l'as dit. Je cours Windows 7 64 bits et développait cela comme une application 32 bits. Tout fonctionne maintenant quand j'utilise% windir% \ Systnative :) –

+0

@Johannes: vous devez marquer cela comme une réponse à votre question pour éviter de perdre du temps à regarder des questions qui ont déjà une très bonne réponse. –

+0

Ah, merci pour cela. première fois poser une question ici. –

0

Voici le code que j'ai qui fonctionne maintenant après avoir changé system32 à sysnative selon la suggestion de John Rasch.

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 
    } 
} 
} 
Questions connexes