//Получаем данные из StartMenu - возвращает список (List) файлов(Prgrm) public async Task <List <Prgrm> > GetFilesListFromStartMenu() { return(await Task.Run(() => { List <Prgrm> Files = new List <Prgrm>(); //Создаем список программ которые будем возвращать string[][] AllUsersAndCurrentUserPATHs = new string[2][]; //Создаем массив, который будет содержать пути к двум папкам автозапуска (для CurrentUSer и AllUsers), а на втором уровне пути к файлам этих веток автозапуска AllUsersAndCurrentUserPATHs[0] = Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Startup)); //Current User AllUsersAndCurrentUserPATHs[1] = Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.CommonStartup)); //All Users for (int i = 0; i < AllUsersAndCurrentUserPATHs.Count(); i++) //Перебираем эти пути к этим веткам { foreach (string filepath in AllUsersAndCurrentUserPATHs[i]) //Перебираем пути к файлам текущей ветки { FileInfo fileinfo = new FileInfo(filepath); if (fileinfo.Extension == ".lnk") //Если расширение текущего файла явл '.lnk' { WshShell shell = new WshShell(); IWshShortcut link = (IWshShortcut)shell.CreateShortcut(filepath); //Создаем эземпляр ярлыка приводя его к типу IWshShortcut //Задаем переменные для св-в Prgrm string FilePath = link.TargetPath; string FileName = fileinfo.Name; string FileParams = link.Arguments; BitmapFrame Icon = GetIcon(FilePath); //Получаем Иконку string StartupType = "Start Menu - Current User"; if (i == 1) { StartupType = "Start Menu - All Users"; } //Если обрабатываемая ветка вторая - то значит это тип AllUSers //Cоздаем экземпляр prgrm для добавления Prgrm prgrm = new Prgrm() { Icon = Icon, FileName = FileName, FilePath = FilePath, CmdlineParams = FileParams, StartupType = StartupType }; //Заполняем информацию о сертификатах и компании из сертификата либо из атрибутов файла при отсутвии сертификата prgrm = FillCertData(prgrm); //Формируем список екземпляров Prgrm для return, заполняя его полученными значениями Files.Add(prgrm); } } } return Files;//Возвращаем список файлов })); }
//Получение данных о сертификате и названии компании (из сертификата или файла (при отсутвии сертификата)) private Prgrm FillCertData(Prgrm InputPrgrm) //Принимаем экземпляр Prgrm, заполняем необходимые св-ва в нем, после чего возвращаем его же { if (!System.IO.File.Exists(InputPrgrm.FilePath)) //Если файл не существуем, помечаем всё false и возвращаем { InputPrgrm.IsSignaturePresent = false; InputPrgrm.IsSignatureCorrect = false; return(InputPrgrm); } try { X509Certificate cert1 = X509Certificate.CreateFromSignedFile(InputPrgrm.FilePath); //Создаем экземпляр сертификата InputPrgrm.IsSignaturePresent = true; //Если мы не получили исключение, значит сертификате есть. Помечаем соотв св-во. InputPrgrm.Company = cert1.Subject.Substring(3).Substring(0, cert1.Subject.IndexOf(",") - 3); //Извлекаем из сертификата название компании InputPrgrm.IsSignatureCorrect = false; //Заранее помечаем св-во корректность сертификата как false if (DateTime.Parse(cert1.GetExpirationDateString()) >= DateTime.Now) //Проверяем что сертификат не устарел { //Проверяем валидность var cert2 = new X509Certificate2(cert1.Handle); if (cert2.Verify() == true) {//Подпись верифицируется InputPrgrm.IsSignatureCorrect = true; } } } catch //Если пришло исключение значит цифровая подпись отсутвует { //Помечаем св-ва как false InputPrgrm.IsSignaturePresent = false; InputPrgrm.IsSignatureCorrect = false; //Извлекаем название компании из ресурсов самомго файла FileVersionInfo myFileVersionInfo = FileVersionInfo.GetVersionInfo(InputPrgrm.FilePath); InputPrgrm.Company = myFileVersionInfo.CompanyName; } return(InputPrgrm); //Возвращаем экземпляр Prgrm }
//Получаем данные из реестра - возвращает список (List) файлов(Prgrm) public async Task <List <Prgrm> > GetFilesListFromRegistry() { return(await Task.Run(() => { List <Prgrm> Files = new List <Prgrm>(); //Создаем список программ которые будем возвращать string RunPath = @"Software\Microsoft\Windows\CurrentVersion\Run"; //Путь до ветки с автозагрузкой string[] CU_Run_Names = Registry.CurrentUser.OpenSubKey(RunPath, false).GetValueNames(); //Массив элеметов в Run в Current_User string[] LM_Run_Names = Registry.LocalMachine.OpenSubKey(RunPath, false).GetValueNames(); //Массив элеметов в Run в Local_Machine string[][] RegistryRoots = new string[2][]; //Двухмерный массив содержащий ветки реестра, на втором уровне имена элементов соответвующей ветки RegistryRoots[0] = CU_Run_Names; RegistryRoots[1] = LM_Run_Names; for (int s = 0; s < RegistryRoots.Count(); s++) //Перебираем ветки реестра HKCU и HKLM { for (int i = 0; i < RegistryRoots[s].Count(); i++) //Перебираем имена элементов текущей ветке { string prefix = @"HKEY_CURRENT_USER\"; //Переключаем префикс в зависимости от того какая в данный момент обрабатывается ветка реестра if (s == 1) { prefix = @"HKEY_LOCAL_MACHINE\"; } string KeyName = RegistryRoots[s][i]; //Имя файла KeyName string KeyValue = (string)Registry.GetValue(prefix + RunPath, KeyName, null); // Получаем значение текущего элемента и отрезаем кавычки если они есть string FileName = ""; string FilePath = ""; string FileParams = ""; BitmapFrame Icon = null; if (KeyValue.Contains('"')) //Если путь к файлу содержит ковычки то возможно содержит и аргументы { FilePath = KeyValue.Substring(KeyValue.IndexOf("\"") + 1); //Отрезаем первую кавычку FileParams = FilePath.Substring(FilePath.IndexOf("\"") + 1).Trim(); // Находим параметры, которые начинаются после второй кавычки и отрезаем проблеы FilePath = FilePath.Substring(0, FilePath.IndexOf("\"")).Trim(); //Отрезаем последнюю кавычку и отрезаем пробелы if (System.IO.File.Exists(FilePath)) { FileInfo fileinfo = new FileInfo(FilePath); //Если файл существет извлечем имя FileName = fileinfo.Name; } } else //Если кавычек нет - то аргументы не содержаться { FilePath = KeyValue; if (System.IO.File.Exists(FilePath)) //Если файл существет извлечем имя { FileInfo fileinfo = new FileInfo(FilePath); FileName = fileinfo.Name; FileParams = ""; //А аргументы командной строки оставляем пустыми, так как если нет ковычек не может быть аргументов } } //Задаем св-во StartupType для нового экземпляра Prgrm string StartupType = "Registry - Current User"; if (s == 1) { StartupType = "Registry - Local Machine"; } //Если индекс перебираемого элемента 1 - значит это HKLM if (System.IO.File.Exists(FilePath)) //Проверим файл на существование по этому пути { //Получаем Иконку Icon = GetIcon(FilePath); //Cоздаем экземпляр prgrm для добавления } Prgrm prgrm = new Prgrm() { Icon = Icon, FileName = FileName, FilePath = FilePath, CmdlineParams = FileParams, StartupType = StartupType }; //Заполняем информацию о сертификатах и компании из сертификата либо из атрибутов файла при отсутвии сертификата prgrm = FillCertData(prgrm); //Формируем список екземпляров Prgrm для return, заполняя его полученными значениями Files.Add(prgrm); } } return Files; //Возвращаем список файлов })); }
//Получаем данные из планировщика - возвращает список (List) файлов(Prgrm) public async Task <List <Prgrm> > GetFilesListFromSheduler() { return(await Task.Run(() => { List <Prgrm> Files = new List <Prgrm>(); //Создаем список программ которые будем возвращать TaskScheduler.TaskScheduler ts = new TaskScheduler.TaskScheduler(); //Создаем экземпляр TaskScheduler ts.Connect(); //Подключаемся к localhost без параметров ITaskFolder folder = ts.GetFolder(@"\"); //Задаем подпапку планировщика IRegisteredTaskCollection Tasks = folder.GetTasks(flags: 0); //Получаем все задания из этой подпапки foreach (IRegisteredTask task in Tasks) //Перебираем эти задания { ITriggerCollection tasktriggers = task.Definition.Triggers; //Коллекция триггеров текущего задания bool HaveDesiredTriggerforCurrentTaskActions = false; //Флаг для помечания, что в задании есть хотябы один триггер, который запускает это задание при запуске системы foreach (ITrigger trigger in tasktriggers) //Перебираем триггеры { //Если нашелся тригер являющийся триггером, срабатывающим при запуске системы, то помечаем флаг как true if (trigger.Type == _TASK_TRIGGER_TYPE2.TASK_TRIGGER_BOOT) { HaveDesiredTriggerforCurrentTaskActions = true; } } if (HaveDesiredTriggerforCurrentTaskActions == true) //Если существует хоть один триггер, запускающий данное задание при запуске систмемы { IActionCollection TaskActions = task.Definition.Actions; //Находим коллекцию действий (Actions) текщего задания foreach (IAction TaskAction in TaskActions) //Перебираем коллекцию Actions { if (TaskAction.Type == _TASK_ACTION_TYPE.TASK_ACTION_EXEC) //Если текущий Action является Action ом для запуска exe приложения { IExecAction execAction = (IExecAction)TaskAction; //Приводим наш TasAction к типу IExecAction, который содержит св-ва которые мы ищем string FilePath = execAction.Path; //Путь к файлу string FileParams = execAction.Arguments; //Аргументы командной строки if (FilePath.Contains('"')) //Если путь к файлу содержит ковычки { FilePath = FilePath.Substring(FilePath.IndexOf("\"") + 1); //Отрезаем первую кавычку FilePath = FilePath.Substring(0, FilePath.IndexOf("\"")).Trim(); //Отрезаем последнюю кавычку и отрезаем пробелы } string StartupType = "Task Scheduler"; //для св-ва тип запуска экземпляра Prgrm BitmapFrame Icon = null; //Для св-ва Icon кземпляра Prgrm string FileName = ""; //Для св-ва FileName кземпляра Prgrm if (System.IO.File.Exists(FilePath)) //Если файл по этому пути существует { FileInfo fileinfo = new FileInfo(FilePath); //Находим имя FileName = fileinfo.Name; //Получаем Иконку Icon = GetIcon(FilePath); } //Cоздаем экземпляр prgrm для добавления Prgrm prgrm = new Prgrm() { Icon = Icon, FileName = FileName, FilePath = FilePath, CmdlineParams = FileParams, StartupType = StartupType }; //Заполняем информацию о сертификатах и компании из сертификата либо из атрибутов файла при отсутвии сертификата prgrm = FillCertData(prgrm); //Формируем список екземпляров Prgrm для return, заполняя его полученными значениями Files.Add(prgrm); } } } } return Files;//Возвращаем список файлов })); }