public CertificateSelectView(ServerSettings settings)
        {
            InitializeComponent();
            _settings = settings;
            Refresh();

            btInstallNewCert.Click += (o, e) =>
            {
                var openFileDialog = new OpenFileDialog();
                openFileDialog.Filter = "Файл сертификата (*.pfx,*.cer,*.p7b)|*.pfx;*.cer;*.p7b";
                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    EnterPasswordView.Show("Введите пароль сертификата...", (pass) =>
                    {
                        try
                        {
                            var certHash = SecurityHelper.AddCertificateInWindows(openFileDialog.FileName, pass, (msg) => _warningHandler.Info(msg));
                            Refresh();
                            certListView.GetItems().Where(x => ((ServerHelper.CertificateInfo)((ItemView)x).Tag).Hash.Equals(certHash)).All(x => x.Selected = true);
                        }
                        catch (Exception exception)
                        {
                            _warningHandler.ErrorFormat(exception, "Ошибка при добавлении сертификата [{0}]", openFileDialog.FileName);
                        }
                    }, null, "Если файл сертификата не имеет пароль, то нажмите \"Применить\"");
                }
            };

            certListView.SelectionChanged += (o, e) => btApply.IsEnabled = true;
            btApply.Click += (o, e) =>
            {
                var selectedCert = (ServerHelper.CertificateInfo)((ItemView)certListView.SelectedItem).Tag;
                _settings.CertificateHash = selectedCert.Hash;
                Selected?.Invoke(settings);
            };
        }
        private void PrepareLazurite(string desktopUser)
        {
            var log = Singleton.Resolve <WarningHandlerBase>();

            var error = false;

            void appendTb(string text)
            {
                Dispatcher.BeginInvoke(new Action(() =>
                {
                    tbInfo.Text += "\r\n" + text;
                }));
            }

            void appendError(string msg, Exception e = null)
            {
                appendTb(msg);
                log.Error(msg, e);
                error = true;
            }

            void appendInfo(string msg)
            {
                appendTb(msg);
                log.Info(msg);
            }

            try
            {
                Dispatcher.BeginInvoke(new Action(() => captionView.StartAnimateProgress()));

                // Prepare environment
                var fileDataManager = Singleton.Resolve <FileDataManager>();
                var assemblyFolder  = Lazurite.Windows.Utils.Utils.GetAssemblyFolder(typeof(App).Assembly);

                // Create data backup
                var dataFolder    = Path.Combine(assemblyFolder, "data");
                var pluginsFolder = Path.Combine(assemblyFolder, "plugins");
                var backupFolder  = Path.Combine(assemblyFolder, "backup");

                try
                {
                    if (Directory.Exists(backupFolder))
                    {
                        // Clear old backups
                        var files = new DirectoryInfo(backupFolder).EnumerateFiles().ToArray();
                        if (files.Length >= 8)
                        {
                            var oldFiles = files
                                           .OrderBy(x => x.Name)
                                           .OrderBy(x => x.LastWriteTime)
                                           .Take(files.Length - 6);

                            foreach (var oldFile in oldFiles)
                            {
                                File.Delete(oldFile.FullName);
                            }
                        }
                    }
                    else
                    {
                        Directory.CreateDirectory(backupFolder);
                    }

                    var dateTimeNowSafeString = DateTime.Now.ToString("dd.MM.yyyy_hh.mm.ss");
                    var zip = new FastZip();
                    zip.CreateZip(Path.Combine(backupFolder, dateTimeNowSafeString + "_data_backup.zip"), dataFolder, true, string.Empty);
                    zip.CreateZip(Path.Combine(backupFolder, dateTimeNowSafeString + "_plugins_backup.zip"), pluginsFolder, true, string.Empty);
                }
                catch (Exception e)
                {
                    appendError("!Ошибка при создании/удалении файлов бэкапов.", e);
                }

                if (!Utils.VcRedistInstallAll())
                {
                    appendError("!Ошибка установки пакетов VcRedist.");
                }
                else
                {
                    appendInfo("Пакеты VcRedist установлены.");
                }

                try
                {
                    if (!fileDataManager.Has(LazuriteServer.SettingsKey))
                    {
                        // Certificate installing
                        var settingsStub = new ServerSettings();
                        settingsStub.CertificateHash = SecurityHelper.AddCertificateInWindows(Path.Combine(assemblyFolder, CertificateFilename), "28021992", (msg) => log.Info(msg));
                        fileDataManager.Set(LazuriteServer.SettingsKey, settingsStub);
                        appendInfo("Настройки сервера созданы.");
                    }
                }
                catch (Exception e)
                {
                    appendError("!Ошибка при создании настроек сервера.", e);
                }

                // Plugins installing
                var pluginsFolderPath = Path.Combine(Lazurite.Windows.Utils.Utils.GetAssemblyFolder(typeof(App).Assembly), "PluginsToInstall");
                var pluginsFiles      = Directory.GetFiles(pluginsFolderPath).Where(x => x.EndsWith(PluginsManager.PluginFileExtension)).ToArray();
                try
                {
                    var pluginsManager = new PluginsManager(false);
                    foreach (var pluginPath in pluginsFiles)
                    {
                        try
                        {
                            pluginsManager.HardReplacePlugin(pluginPath);
                        }
                        catch (Exception e)
                        {
                            appendError($"!Ошибка при установке плагина\r\n[{pluginPath}].", e);
                        }
                    }
                    appendInfo("Плагины установлены.");
                }
                catch (Exception e)
                {
                    appendError("!Ошибка при установке плагинов. Часть функционала может быть недоступна.", e);
                }

                // Autorun installing
                try
                {
                    var mainAppName = Path.Combine(Lazurite.Windows.Utils.Utils.GetAssemblyFolder(typeof(App).Assembly), LauncherExeName);
                    TaskSchedulerUtils.CreateLogonTask(desktopUser, mainAppName);
                    appendInfo($"Программа добавлена в планировщик задач для пользователя [{desktopUser}].");
                    // When task has been added or changed, it immediately starts the launcher
                    appendInfo($"Запуск Lazurite...");
                    Thread.Sleep(1500); // Extra crutch;
                }
                catch (Exception e)
                {
                    appendError($"!Невозможно добавить программу в автозапуск для пользователем [{desktopUser}].\r\n" +
                                $"Программа не будет запускаться автоматически при логине пользователя [{desktopUser}].", e);
                }

                Dispatcher.BeginInvoke(new Action(() => btOk.IsEnabled = true));
                Dispatcher.BeginInvoke(new Action(() => captionView.StopAnimateProgress()));

                if (!error)
                {
                    Dispatcher.BeginInvoke(new Action(() => App.Current.Shutdown()));
                }
            }
            catch (Exception e)
            {
                appendError("Непредвиденная ошибка! " + e.Message, e);
            }
        }