2015-05-17 3 views
2

Я работаю над программой, которая собирает информацию об аппарате для устранения неполадок. После некоторой работы над программой, выполняемой как администратор, я не смог заставить ее правильно выводить все файлы в% windir% \ drivers. Я также столкнулся с проблемами с текущими пользователями appdata, где он выбрасывает UnauthorizedAccessException и не выводит anyhing. Я, хотя все в порядке, я напишу сервис, чтобы исправить это. После получения базовой услуги для тестирования. Я все еще не вижу выхода. Вот код для службы:Программа не собирает информацию о директории

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Globalization; 
using System.IO; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Threading.Tasks; 

namespace SVCTest 
{ 
    public partial class Service1 : ServiceBase 
    { 
     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      while (true) 
      { 
       OutputDirStructureToFile(
        Environment.GetEnvironmentVariable("userprofile") + "\\Desktop\\" + Path.GetRandomFileName() + ".txt", 
        Environment.ExpandEnvironmentVariables("windir") + "\\drivers"); 
       System.Threading.Thread.Sleep(30000); 
      } 
     } 

     protected override void OnStop() 
     { 
     } 

     /// <summary> 
     /// Outputs the structure of a directory to a file. 
     /// Uses GetFileStructureRecursive. 
     /// </summary> 
     /// <param name="outputFileName">The file to be outputed to.</param> 
     /// <param name="folder">Directory to get the structure from.</param> 
     /// <param name="searchPatern">What to search for. EXAMPLE: *.*</param> 
     private void OutputDirStructureToFile(string outputFileName, string folder) 
     { 
      using (var file = new StreamWriter(outputFileName)) 
      { 
       file.Write(GetFileStrucutre(new DirectoryInfo(folder), "*.*")); 
      } 
     } 
     private string GetFileStrucutre(DirectoryInfo dirInfo, string searchPattern) 
     { 
      StringBuilder sb = new StringBuilder(); 

      sb.AppendLine(); 
      sb.AppendLine("Root " + dirInfo.Root); 
      sb.AppendLine(); 

      sb.Append(GetFileStructureRecursive(dirInfo, searchPattern)); 

      return sb.ToString(); 

     } 
     private string GetFileStructureRecursive(DirectoryInfo dirInfo, string searchPattern) 
     { 
      StringBuilder sb = new StringBuilder(); 

      sb.AppendLine("\r\n Directory of " + dirInfo.FullName + "\r\n"); 

      foreach (var x in dirInfo.GetFileSystemInfos(searchPattern)) 
      { 
       sb.AppendLine(
        x.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).PadRight(25) 
        + x.Name.PadRight(50) 
        ); 
      } 

      foreach (var dir in dirInfo.GetDirectories()) 
      { 
       sb.Append(GetFileStructureRecursive(dir, searchPattern)); 
      } 

      //try 
      //{ 
      // foreach (var dir in dirInfo.GetDirectories(searchPattern)) 
      // { 

      //  sb.AppendLine(
      //   dir.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).PadRight(25) 
      //   + String.Empty.PadRight(15) 
      //   + dir.Name.PadRight(50) 
      //   + dir.Attributes.ToString().PadRight(50) 
      //   + dir.LastAccessTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).PadRight(25) 
      //   + dir.CreationTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) 
      //   ); 
      // } 
      //} 
      //catch (UnauthorizedAccessException) { } 

      //try 
      //{ 
      // foreach (var file in dirInfo.GetFiles(searchPattern)) 
      // { 

      //  sb.AppendLine(
      //   file.LastWriteTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).PadRight(25) 
      //   + file.Length.ToString("N0").PadRight(15) 
      //   + file.Name.PadRight(50) 
      //   + file.Attributes.ToString().PadRight(50) 
      //   + file.LastAccessTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture).PadRight(25) 
      //   + file.CreationTime.ToString("yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture) 
      //   ); 
      // } 
      //} 
      //catch (UnauthorizedAccessException) { } 

      //try 
      //{ 
      // foreach (var dir in dirInfo.GetDirectories()) 
      // { 
      //  sb.Append(GetFileStructureRecursive(dir, searchPattern)); 
      // } 
      //} 
      //catch (UnauthorizedAccessException) { } 

      return sb.ToString(); 
     } 

    } 
} 

Вы заметите, что я закомментировать кусок мышления я могу получать доступ к слишком много информации сразу. Вот что я получаю после установки и запуска службы:

Root C:\ 

Directory of C:\Windows\System32\drivers 

2011-04-12 01:38:56  en-US            
2009-06-10 15:14:29  gm.dls            
2009-06-10 15:14:29  gmreadme.txt          
2011-04-12 01:38:56  UMDF            
2009-07-13 19:19:10  wimmount.sys          

Directory of C:\Windows\System32\drivers\en-US 

2011-04-12 01:38:25  bfe.dll.mui          
2011-04-12 01:38:22  ndiscap.sys.mui         
2011-04-12 01:38:25  pacer.sys.mui          
2011-04-12 01:38:27  qwavedrv.sys.mui         
2011-04-12 01:38:22  scfilter.sys.mui         
2011-04-12 01:38:20  tcpip.sys.mui          

Directory of C:\Windows\System32\drivers\UMDF 

2011-04-12 01:38:56  en-US            

Directory of C:\Windows\System32\drivers\UMDF\en-US 

Определенно отсутствует некоторые ключевые драйверы там. Для жизни я не могу понять, почему она не собирает информацию. Отсутствует работа AV, только что обновленная Windows 7 и VS. Я проверил все драйверы диспетчера фильтров нечетных файлов, но я их не вижу.

+0

Небольшая коррекция здесь, когда я перемещал код и переписывал вызов 'OutputDirStructureToFile' в две строки. Я ставлю только% windir% \ drivers. а не% windir% \ System32 \, как показано на выходе. Также, когда я упоминаю, что top% windir% \ drivers должен быть% windir% \ System32 \ drivers. Извините за этот путаницу. Но вы можете видеть, что результат начинается с драйверов% windir% \ System32 \, которые показывают, что я запускал его с соответствующими входами. –

+0

Я обнаружил, что если я получаю файлы и пути к каталогам, прежде чем собирать список файлов, я получаю больше информации. Например: 'foreach (var x в Directory.GetDirectories (dirInfo.FullName, searchPattern, SearchOption.AllDirectories) {DirectoryInfo d = new DirectoryInfo (x);' и аналогичным образом делает то же самое для файлов, я получаю больше вывода, но он по-прежнему –

+0

Okay позволяет упростить это. Следующий код не возвращает полную информацию о каталоге. 'IEnumerable files = new DirectoryInfo (" C: \\ Windows \\ System32 \\ drivers "). EnumerateFileSystemInfos (" * " , SearchOption.AllDirectories); ' –

ответ

0

Missing directory and file info

Я упростил мои вопросы и обнаружил, что не рассматривает вопрос о визуализации в пределах окружающей среды.

+0

Я также хотел отметить, что C: \ Windows \ Sysnative вернет родную System32 машины независимо от архитектуры. –