/// <summary> /// нажатие кнопки удаление программы /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDelete_Click(object sender, EventArgs e) { //создаем ThreadPool для параллельного запуска установки программы на нескольких //ПК одновременно, ограничиваем количество одновременных установок - 5 ThreadPool.SetMaxThreads(5, 5); string[] selectedComputers = getSelectedComputers(); ManualResetEvent[] doneEvents = new ManualResetEvent[selectedComputers.Length]; int i = 0; //создаем источник данных о состоянии удаления, для отображения прогресса в ProgressTable, создаем обьект WMIProcess для каждого компьютера, //и помещаем их ThreadPool foreach (string comp in selectedComputers) { ComputerEntry entry = new ComputerEntry(comp); bindingSource.Add(entry); doneEvent = new ManualResetEvent(false); doneEvents[i] = doneEvent; WMIProcess process = new WMIProcess(entry, doneEvent); process.ProgramName = tbSoftName.Text; process.OptionRestart = optionRestart; process.RemoteMachine = comp; process.UserName = tbAdmin.Text; process.Password = tbPassword.Text; ThreadPool.QueueUserWorkItem(new WaitCallback(process.deleteProgram)); i++; } //создаем ProgressTable с данными о состоянии задач удаления на выбранных компьютерах string formName = Properties.Resources.RemovingResults; string firstColumnName = Properties.Resources.ComputerName; string secondColumnName = Properties.Resources.ProcessStatus; ProgressTable progressTable = new ProgressTable(bindingSource, this, formName, firstColumnName, secondColumnName, doneEvents); progressTable.ShowDialog(); }
// Точка запуска удаления программ private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = sender as BackgroundWorker; try { string computer = selectedTab.Text; SoftGridView softGreedView = ((SoftGridView)selectedTab.Controls[computer]); int count = 0; ArrayList arSoftList = new ArrayList(); double percentOfTask = 0; foreach (DataGridViewRow row in softGreedView.Rows) { //создаем ArrayList содержащий список программ подлежащий удалению if ((Boolean)row.Cells[0].Value == true) { string[] array = new string[4]; array[0] = row.Cells[1].Value.ToString(); array[1] = row.Cells[2].Value.ToString(); array[2] = row.Cells[3].Value.ToString(); arSoftList.Add(array); } } //для подсчета шкалы прогресса int programCount = arSoftList.Count; //удаление foreach (string[] array in arSoftList) { string identifyingNumber = array[0]; string programName = array[1]; string programVersion = array[2]; count++; percentOfTask = ((double)count / programCount) * 100; int returnMessage = WMIProcess.deleteProgram(computer, identifyingNumber, programName, programVersion, admin, password); array[3] = returnMessage.ToString(); worker.ReportProgress((int)percentOfTask, array); } } catch (InvalidOperationException iex) { MessageBox.Show(iex.Message); } }
/// <summary> /// запуск процесса установки выбранной программы на указанные компьютеры /// </summary> private void startInstall() { //события окончания фоновых процессов doneEvents = new ManualResetEvent[selectedComputers.Length]; int i = 0; //для каждого из компьютеров создаем обьект ComputerEntry, поля которого //отображают состояние установки на этот компутер и привязаны в качестве источника //данных для таблицы прогресса dataGridView. А также для каждого компутера создается //обьект InstallProcess который будет выполнять установку пакета на этот компутер и //отображать изменяющююся информацию о процессе установки и запускаем метод pingHost //этого обьекта в потоке помещенном в ThreadPool foreach (string comp in selectedComputers) { if (comp.Length > 0) { ComputerEntry entry = new ComputerEntry(comp); bindingSource.Add(entry); doneEvent = new ManualResetEvent(false); doneEvents[i] = doneEvent; WMIProcess process = new WMIProcess(entry, doneEvent); process.OneFile = oneFile; process.OptionRestart = optionRestart; process.RemoteMachine = comp; process.UserName = userNameField.Text; process.Password = passwordField.Text; process.RandomFolderName = randomFolderName; process.FilePath = filePathField.Text; process.ExeOptions = tbExeOptions.Text; //если программа устанавливается из exe файла if (filePathField.Text.ToLower().EndsWith("exe")) { ThreadPool.QueueUserWorkItem(new WaitCallback(process.exeInstallProcess)); } //msi else { ThreadPool.QueueUserWorkItem(new WaitCallback(process.installProcess)); } } i++; } }
/// <summary> /// Нажатие кнопки сканирования, запускает процессы получения списка установленного ПО на выбранных компьютерах, после завершения сканирования отобразит окно /// FormSoftList со списком установленных программ для каждого компьютера на отдельной вкладке /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnScan_Click(object sender, EventArgs e) { string[] computers = getSelectedComputers(); //doneEvents нужно для того чтобы программа определила что задача сканирования для каждого из компьютеров завершена ManualResetEvent[] doneEvents = new ManualResetEvent[computers.Length]; int i = 0; ArrayList dataViewes = new ArrayList(); ThreadPool.SetMaxThreads(5, 5); foreach (string computer in computers) { SoftGridView softGridView = new SoftGridView(); softGridView.Name = computer; dataViewes.Add(softGridView); ComputerEntry entry = new ComputerEntry(computer); bindingSource.Add(entry); doneEvent = new ManualResetEvent(false); doneEvents[i] = doneEvent; WMIProcess process = new WMIProcess(entry, softGridView, doneEvent); process.ProgramName = tbSoftName.Text; process.OptionRestart = optionRestart; process.RemoteMachine = computer; process.UserName = tbAdmin.Text; process.Password = tbPassword.Text; ThreadPool.QueueUserWorkItem(new WaitCallback(process.getSoftList)); i++; } string formName = Properties.Resources.GettingListOfInstalledPrograms; string firstColumnName = Properties.Resources.ComputerName; string secondColumnName = Properties.Resources.ProcessStatus;; ProgressTable progressTable = new ProgressTable(bindingSource, this, formName, firstColumnName, secondColumnName, doneEvents); progressTable.ShowDialog(); //создаем форму со списком установленного ПО, передаем в него имя пользователя и пароль, для возможности удаления программ с правами укаазанного пользователя //(если он указан) в новом окне FormSoftList softList = new FormSoftList(dataViewes, tbAdmin.Text, tbPassword.Text); softList.Visible = true; }