/// <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(); }
/// <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; }
/// <summary> /// метод для удаления строк из таблицы /// </summary> private void deleteRow() { BindingSource bindingSource = new BindingSource(); SoftGridView softGridView = (SoftGridView)tabControl.SelectedTab.Controls[0]; //из ArrayList со списком результатов удаления foreach (string[] array in resultList) { int error = Convert.ToInt32(array[3]); string uninstallException = new Win32Exception(error).Message; ComputerEntry entry = new ComputerEntry(array[1], uninstallException); bindingSource.Add(entry); int rowIndex; //если в процессе удаления не произошло ошибки if (error == 0) { string searchString = array[0]; //ищем программу в таблице и удаляем foreach (DataGridViewRow row in softGridView.Rows) { if (row.Cells[1].Value.ToString().Equals(searchString)) { rowIndex = row.Index; softGridView.Rows.RemoveAt(rowIndex); break; } } } } //отображаем форму с таблицей результатов удаления string formName = Properties.Resources.RemovingResults; string firstColumnName = Properties.Resources.Application; string secondColumnName = Properties.Resources.RemovingResults; ProgressTable progressTable = new ProgressTable(bindingSource, this, formName, firstColumnName, secondColumnName); progressTable.ShowDialog(); }
public WMIProcess(ComputerEntry computerEntry, SoftGridView softGridView, ManualResetEvent doneEvent) { entry = computerEntry; this.softGridView = softGridView; this.doneEvent = doneEvent; }
public WMIProcess(ComputerEntry computerEntry, ManualResetEvent doneEvent) { entry = computerEntry; this.doneEvent = doneEvent; }