/// <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> /// Нажатие кнопки OK начинающей установку выбранного пакета /// на выбранные компьютеры /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnInstall_Click(object sender, EventArgs e) { //проверка указаны ли целевые компьютеры и пакет msi для установки //если нет то выход if (compNameField.Text.Length == 0) { string message = Properties.Resources.MustSpecifyComputerName; string caption = Properties.Resources.DataEntryError; MessageBoxButtons button = MessageBoxButtons.OK; DialogResult result; result = MessageBox.Show(message, caption, button); return; } if (filePathField.Text.Length == 0) { string message = Properties.Resources.MustSpecifyDistributive; string caption = Properties.Resources.DataEntryError; MessageBoxButtons button = MessageBoxButtons.OK; DialogResult result; result = MessageBox.Show(message, caption, button); return; } //получение случайного имени для временной папки, которая будет создана //на каждом из целевых компьютеров для копирования установочных файлов randomFolderName = FolderName.GetDirName(); //установка из одного файла или использовать всю папку? oneFile = useOneFile.Checked; //от имени другого пользователя или от текукщего? anotherUser = checkBox1.Checked; //получаем массив с ip-адресами/именами компьютеров выбранных для развертывания selectedComputers = getSelectedComputers(); //создаем ThreadPool для параллельного запуска установки программы на нескольких //ПК одновременно, ограничиваем количество одновременных установок - 5 ThreadPool.SetMaxThreads(5, 5); startInstall(); //открываем окно с таблицей прогресса установки и передаем в него //заполненную данными таблицу dataGridView ProgressTable progressTable = new ProgressTable(bindingSource, this, doneEvents); progressTable.ShowDialog(); }
/// <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(); }