├── Resources ├── Thumbs.db ├── database_up.ico └── database_down.ico ├── database_process.ico ├── Libraries ├── Microsoft.SqlServer.Smo.dll ├── Microsoft.SqlServer.SmoExtended.dll ├── Microsoft.SqlServer.ConnectionInfo.dll ├── Microsoft.SqlServer.SqlClrProvider.dll └── Microsoft.SqlServer.Management.Sdk.Sfc.dll ├── Program.cs ├── Logger.cs ├── CommandLineHelper.cs ├── Properties ├── Settings.settings ├── AssemblyInfo.cs ├── Settings.Designer.cs ├── Resources.Designer.cs └── Resources.resx ├── NC.Util.SqlSrv.BackupRestore.sln ├── .gitattributes ├── frmConfigureSqlConn.cs ├── FTPHelper.cs ├── AboutBox.cs ├── frmConfigureSqlConn.resx ├── .gitignore ├── NC.Util.SqlSrv.BackupRestore.csproj ├── Cryptography.cs ├── frmConfigureSqlConn.Designer.cs ├── AboutBox.Designer.cs ├── MainWin.cs └── AboutBox.resx /Resources/Thumbs.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTBlankenship/BackupRestore_Source/HEAD/Resources/Thumbs.db -------------------------------------------------------------------------------- /database_process.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTBlankenship/BackupRestore_Source/HEAD/database_process.ico -------------------------------------------------------------------------------- /Resources/database_up.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTBlankenship/BackupRestore_Source/HEAD/Resources/database_up.ico -------------------------------------------------------------------------------- /Resources/database_down.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTBlankenship/BackupRestore_Source/HEAD/Resources/database_down.ico -------------------------------------------------------------------------------- /Libraries/Microsoft.SqlServer.Smo.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTBlankenship/BackupRestore_Source/HEAD/Libraries/Microsoft.SqlServer.Smo.dll -------------------------------------------------------------------------------- /Libraries/Microsoft.SqlServer.SmoExtended.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTBlankenship/BackupRestore_Source/HEAD/Libraries/Microsoft.SqlServer.SmoExtended.dll -------------------------------------------------------------------------------- /Libraries/Microsoft.SqlServer.ConnectionInfo.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTBlankenship/BackupRestore_Source/HEAD/Libraries/Microsoft.SqlServer.ConnectionInfo.dll -------------------------------------------------------------------------------- /Libraries/Microsoft.SqlServer.SqlClrProvider.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTBlankenship/BackupRestore_Source/HEAD/Libraries/Microsoft.SqlServer.SqlClrProvider.dll -------------------------------------------------------------------------------- /Libraries/Microsoft.SqlServer.Management.Sdk.Sfc.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CTBlankenship/BackupRestore_Source/HEAD/Libraries/Microsoft.SqlServer.Management.Sdk.Sfc.dll -------------------------------------------------------------------------------- /Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Windows.Forms; 4 | 5 | namespace NC.Util.SqlSrv.BackupRestore 6 | { 7 | static class Program 8 | { 9 | /// 10 | /// The main entry point for the application. 11 | /// 12 | [STAThread] 13 | static void Main() 14 | { 15 | Application.EnableVisualStyles(); 16 | Application.SetCompatibleTextRenderingDefault(false); 17 | Application.Run(new MainWin()); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /Logger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | 4 | namespace NC.Util.SqlSrv.BackupRestore 5 | { 6 | public static class Logger 7 | { 8 | // ------------------------------------------------ 9 | // CTB: 2019/10/27 10 | // Prefix the message to log with a date time stamp 11 | // ------------------------------------------------ 12 | public static void LogMessage(string messageToLog) 13 | { 14 | string logFileName = Environment.CurrentDirectory + @"\LogFile.txt"; 15 | 16 | using (StreamWriter file = new StreamWriter(logFileName, true)) 17 | { 18 | messageToLog = $"{DateTime.Now:yyyy.MM.dd hh:mm:ss}: {messageToLog}"; 19 | file.WriteLine(messageToLog); 20 | } 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /CommandLineHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | // ReSharper disable InvalidXmlDocComment 4 | 5 | namespace NC.Util.SqlSrv.BackupRestore 6 | { 7 | public static class CommandLineHelper 8 | { 9 | 10 | public static void LaunchNotepadToViewLogFile() 11 | { 12 | try 13 | { 14 | ProcessStartInfo procStartInfo = new ProcessStartInfo 15 | { 16 | FileName = "notepad.exe", 17 | Arguments = Environment.CurrentDirectory + @"\LogFile.txt" 18 | }; 19 | 20 | Process proc = new Process { StartInfo = procStartInfo }; 21 | proc.Start(); 22 | proc.Dispose(); 23 | } 24 | catch (Exception) 25 | { 26 | throw; 27 | } 28 | 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Properties/Settings.settings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <?xml version="1.0" encoding="utf-16"?> 7 | <SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 8 | <ConnectionString>Data Source=.\SQL2005;Initial Catalog=master;User ID=sa;Password=sqladmin123</ConnectionString> 9 | <ProviderName>System.Data.SqlClient</ProviderName> 10 | </SerializableConnectionString> 11 | Data Source=.\SQL2005;Initial Catalog=master;User ID=sa;Password=sqladmin123 12 | 13 | 14 | -------------------------------------------------------------------------------- /NC.Util.SqlSrv.BackupRestore.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.29418.71 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NC.Util.SqlSrv.BackupRestore", "NC.Util.SqlSrv.BackupRestore.csproj", "{737E2FC3-BAED-4FFA-8360-95CFF86CE34B}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {737E2FC3-BAED-4FFA-8360-95CFF86CE34B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {737E2FC3-BAED-4FFA-8360-95CFF86CE34B}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {737E2FC3-BAED-4FFA-8360-95CFF86CE34B}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {737E2FC3-BAED-4FFA-8360-95CFF86CE34B}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {D57E48C9-589D-43D7-B0BB-1E26ADF7CFE9} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("SqlServer Backup/Restore Utility")] 9 | [assembly: AssemblyDescription("SqlServer Backup/Restore Utility is an utility to help backup and restore SqlServer database without Sql Server Management Studio (/Express) installed. With questions about utility you may write me at: ct@novantconsulting.com")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("Novant Consulting")] 12 | [assembly: AssemblyProduct("BackupRestore")] 13 | [assembly: AssemblyCopyright("Novant Consulting, Inc.")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("44014862-d6a7-4f8b-aa3d-aa6b29f863fc")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | [assembly: AssemblyVersion("1.0.0.1")] 33 | [assembly: AssemblyFileVersion("1.0.0.1")] 34 | -------------------------------------------------------------------------------- /Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace NC.Util.SqlSrv.BackupRestore.Properties { 12 | 13 | 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.3.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { 17 | 18 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 19 | 20 | public static Settings Default { 21 | get { 22 | return defaultInstance; 23 | } 24 | } 25 | 26 | [global::System.Configuration.ApplicationScopedSettingAttribute()] 27 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 28 | [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)] 29 | [global::System.Configuration.DefaultSettingValueAttribute("Data Source=.\\SQL2005;Initial Catalog=master;User ID=sa;Password=sqladmin123")] 30 | public string masterConnectionString { 31 | get { 32 | return ((string)(this["masterConnectionString"])); 33 | } 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace NC.Util.SqlSrv.BackupRestore.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// A strongly-typed resource class, for looking up localized strings, etc. 17 | /// 18 | // This class was auto-generated by the StronglyTypedResourceBuilder 19 | // class via a tool like ResGen or Visual Studio. 20 | // To add or remove a member, edit your .ResX file then rerun ResGen 21 | // with the /str option, or rebuild your VS project. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Returns the cached ResourceManager instance used by this class. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("NC.Util.SqlSrv.BackupRestore.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Overrides the current thread's CurrentUICulture property for all 51 | /// resource lookups using this strongly typed resource class. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Looks up a localized resource of type System.Drawing.Bitmap. 65 | /// 66 | internal static System.Drawing.Bitmap database_down { 67 | get { 68 | object obj = ResourceManager.GetObject("database_down", resourceCulture); 69 | return ((System.Drawing.Bitmap)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Looks up a localized resource of type System.Drawing.Bitmap. 75 | /// 76 | internal static System.Drawing.Bitmap database_up { 77 | get { 78 | object obj = ResourceManager.GetObject("database_up", resourceCulture); 79 | return ((System.Drawing.Bitmap)(obj)); 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /frmConfigureSqlConn.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Data; 3 | using System.Data.Sql; 4 | using System.Data.SqlClient; 5 | using System.Windows.Forms; 6 | 7 | namespace NC.Util.SqlSrv.BackupRestore 8 | { 9 | // ReSharper disable once InconsistentNaming 10 | public partial class frmConfigureSqlConn : Form 11 | { 12 | public string ConnectionString = String.Empty; 13 | 14 | public frmConfigureSqlConn() 15 | { 16 | InitializeComponent(); 17 | PopulateComboBoxes(); 18 | } 19 | 20 | private void cmdGetSqlServers_Click(object sender, EventArgs e) 21 | { 22 | SqlDataSourceEnumerator instance = SqlDataSourceEnumerator.Instance; 23 | DataTable dtServers = instance.GetDataSources(); 24 | if (dtServers.Rows.Count > 0) 25 | { 26 | foreach (DataRow dr in dtServers.Rows) 27 | { 28 | string serverInstanceName; 29 | string serverName = dr["ServerName"].ToString(); 30 | string instanceName = dr["InstanceName"].ToString(); 31 | if (instanceName == String.Empty) 32 | { 33 | serverInstanceName = serverName; 34 | } 35 | else 36 | { 37 | serverInstanceName = serverName + @"\" + instanceName; 38 | } 39 | 40 | cboAvailableSQLServers.Items.Add(serverInstanceName); 41 | } 42 | } 43 | else 44 | { 45 | cboAvailableSQLServers.Items.Add("CTB-MAXIMUS-PC"); 46 | } 47 | 48 | if (cboAvailableSQLServers.Items.Count > 0) 49 | { 50 | cboAvailableSQLServers.SelectedIndex = 0; 51 | } 52 | } 53 | 54 | private void PopulateComboBoxes() 55 | { 56 | cboAuthentication.Items.Add("Windows Authentication"); 57 | cboAuthentication.Items.Add("SQL Server Authentication"); 58 | cboAuthentication.SelectedIndex = 0; 59 | } 60 | 61 | private void cboAuthentication_SelectionChangeCommitted(object sender, EventArgs e) 62 | { 63 | string authentication = cboAuthentication.SelectedItem.ToString(); 64 | if (authentication == "SQL Server Authentication") 65 | { 66 | txtLogin.Enabled = true; 67 | txtPassword.Enabled = true; 68 | } 69 | else 70 | { 71 | txtLogin.Enabled = false; 72 | txtPassword.Enabled = false; 73 | txtLogin.Text = String.Empty; 74 | txtPassword.Text = String.Empty; 75 | } 76 | } 77 | 78 | private void cmdTestConnection_Click(object sender, EventArgs e) 79 | { 80 | string authentication = cboAuthentication.SelectedItem.ToString(); 81 | string connString = ""; 82 | 83 | if (authentication == "Windows Authentication") 84 | { 85 | connString = String.Format("Server={0};Database=master;Trusted_Connection=True", cboAvailableSQLServers.SelectedItem); 86 | } 87 | else if(authentication == "SQL Server Authentication") 88 | { 89 | connString = String.Format("Server={0};Database=master;User Id={1};Password={2};",cboAvailableSQLServers.SelectedItem, txtLogin.Text, txtPassword.Text); 90 | } 91 | 92 | txtConnectionString.Text = connString; 93 | ConnectionString = txtConnectionString.Text; 94 | 95 | try 96 | { 97 | // ReSharper disable once UnusedVariable 98 | using (SqlConnection sqlConn = new SqlConnection(connString)) 99 | { 100 | MessageBox.Show(@"SQL Connection succeeded!!!", @"SQL Backup and Restore Utility"); 101 | } 102 | } 103 | catch (Exception) 104 | { 105 | MessageBox.Show(@"SQL Connection test failed ... see the connection string below for possible anomalies.", @"SQL Backup and Restore Utility"); 106 | } 107 | } 108 | 109 | private void cmdOK_Click(object sender, EventArgs e) 110 | { 111 | Hide(); 112 | } 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /FTPHelper.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using System.Net; 7 | using System.Net.Cache; 8 | using System.IO; 9 | using System.Windows.Forms; 10 | 11 | 12 | namespace NC.Util.SqlSrv.BackupRestore 13 | { 14 | 15 | // -------------------------------------------------------------------------------- 16 | // https://stackoverflow.com/questions/16005388/how-to-copy-a-file-on-an-ftp-server 17 | // -------------------------------------------------------------------------------- 18 | public static class FTPHelper 19 | { 20 | 21 | public static void PostDataToFTP() 22 | { 23 | try 24 | { 25 | FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://novantconsulting.com" + @"/" + "TestFile0.txt"); 26 | request.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.CacheIfAvailable); 27 | request.Method = WebRequestMethods.Ftp.UploadFile; 28 | request.Credentials = new NetworkCredential("CTBlankenship", "Babylon5"); 29 | // Copy the contents of the file to the request stream. 30 | StreamReader sourceStream = new StreamReader(@"E:\StrataFrame.bak"); 31 | byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 32 | sourceStream.Close(); 33 | request.ContentLength = fileContents.Length; 34 | Stream requestStream = request.GetRequestStream(); 35 | requestStream.Write(fileContents, 0, fileContents.Length); 36 | requestStream.Close(); 37 | FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 38 | Console.WriteLine("Upload File Complete, status {0}", response.StatusDescription); 39 | 40 | response.Close(); 41 | } 42 | catch (WebException e) 43 | { 44 | Console.WriteLine(e.Message.ToString()); 45 | String status = ((FtpWebResponse)e.Response).StatusDescription; 46 | Console.WriteLine(status); 47 | } 48 | catch (Exception ex) 49 | { 50 | Console.WriteLine(ex.Message.ToString()); 51 | } 52 | } 53 | 54 | public static bool CopyFile(string FtpSite = @"ftp://novantconsulting.com/SQLBackups/Novant/", string fileName = "StrataFrame.bak", string FileToCopy = @"E:\SEPARCSecurity.txt", string userName = "CTBlankenship75", string password= "Babylon5") 55 | 56 | { 57 | try 58 | { 59 | FtpWebRequest request = (FtpWebRequest) WebRequest.Create(FtpSite + fileName); 60 | request.Method = WebRequestMethods.Ftp.DownloadFile; 61 | request.Credentials = new NetworkCredential(userName, password); 62 | FtpWebResponse response = (FtpWebResponse) request.GetResponse(); 63 | Stream responseStream = response.GetResponseStream(); 64 | Upload(FtpSite + @"\" + FileToCopy, ToByteArray(responseStream), userName, password); 65 | responseStream.Close(); 66 | return true; 67 | } 68 | catch (Exception e) 69 | { 70 | MessageBox.Show(e.ToString()); 71 | 72 | return false; 73 | } 74 | } 75 | 76 | private static Byte[] ToByteArray(Stream stream) 77 | { 78 | MemoryStream ms = new MemoryStream(); 79 | byte[] chunk = new byte[4096]; 80 | int bytesRead; 81 | while ((bytesRead = stream.Read(chunk, 0, chunk.Length)) > 0) 82 | { 83 | ms.Write(chunk, 0, bytesRead); 84 | } 85 | 86 | return ms.ToArray(); 87 | } 88 | 89 | private static bool Upload(string FileName, byte[] Image, string FtpUsername, string FtpPassword) 90 | { 91 | try 92 | { 93 | System.Net.FtpWebRequest clsRequest = (System.Net.FtpWebRequest) System.Net.WebRequest.Create(FileName); 94 | clsRequest.Credentials = new System.Net.NetworkCredential(FtpUsername, FtpPassword); 95 | clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile; 96 | System.IO.Stream clsStream = clsRequest.GetRequestStream(); 97 | clsStream.Write(Image, 0, Image.Length); 98 | 99 | clsStream.Close(); 100 | clsStream.Dispose(); 101 | return true; 102 | } 103 | catch 104 | { 105 | return false; 106 | } 107 | } 108 | 109 | 110 | 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /AboutBox.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Drawing; 5 | using System.Windows.Forms; 6 | using System.Reflection; 7 | 8 | namespace NC.Util.SqlSrv.BackupRestore 9 | { 10 | partial class AboutBox : Form 11 | { 12 | public AboutBox() 13 | { 14 | InitializeComponent(); 15 | 16 | // Initialize the AboutBox to display the product information from the assembly information. 17 | // Change assembly information settings for your application through either: 18 | // - Project->Properties->Application->Assembly Information 19 | // - AssemblyInfo.cs 20 | this.Text = String.Format("About {0}", AssemblyTitle); 21 | this.labelProductName.Text = AssemblyProduct; 22 | this.labelVersion.Text = String.Format("Version {0}", AssemblyVersion); 23 | this.labelCopyright.Text = AssemblyCopyright; 24 | this.labelCompanyName.Text = AssemblyCompany; 25 | this.textBoxDescription.Text = AssemblyDescription; 26 | } 27 | 28 | #region Assembly Attribute Accessors 29 | 30 | public string AssemblyTitle 31 | { 32 | get 33 | { 34 | // Get all Title attributes on this assembly 35 | object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false); 36 | // If there is at least one Title attribute 37 | if (attributes.Length > 0) 38 | { 39 | // Select the first one 40 | AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0]; 41 | // If it is not an empty string, return it 42 | if (titleAttribute.Title != "") 43 | return titleAttribute.Title; 44 | } 45 | // If there was no Title attribute, or if the Title attribute was the empty string, return the .exe name 46 | return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase); 47 | } 48 | } 49 | 50 | public string AssemblyVersion 51 | { 52 | get 53 | { 54 | return Assembly.GetExecutingAssembly().GetName().Version.ToString(); 55 | } 56 | } 57 | 58 | public string AssemblyDescription 59 | { 60 | get 61 | { 62 | // Get all Description attributes on this assembly 63 | object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false); 64 | // If there aren't any Description attributes, return an empty string 65 | if (attributes.Length == 0) 66 | return ""; 67 | // If there is a Description attribute, return its value 68 | return ((AssemblyDescriptionAttribute)attributes[0]).Description; 69 | } 70 | } 71 | 72 | public string AssemblyProduct 73 | { 74 | get 75 | { 76 | // Get all Product attributes on this assembly 77 | object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false); 78 | // If there aren't any Product attributes, return an empty string 79 | if (attributes.Length == 0) 80 | return ""; 81 | // If there is a Product attribute, return its value 82 | return ((AssemblyProductAttribute)attributes[0]).Product; 83 | } 84 | } 85 | 86 | public string AssemblyCopyright 87 | { 88 | get 89 | { 90 | // Get all Copyright attributes on this assembly 91 | object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); 92 | // If there aren't any Copyright attributes, return an empty string 93 | if (attributes.Length == 0) 94 | return ""; 95 | // If there is a Copyright attribute, return its value 96 | return ((AssemblyCopyrightAttribute)attributes[0]).Copyright; 97 | } 98 | } 99 | 100 | public string AssemblyCompany 101 | { 102 | get 103 | { 104 | // Get all Company attributes on this assembly 105 | object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false); 106 | // If there aren't any Company attributes, return an empty string 107 | if (attributes.Length == 0) 108 | return ""; 109 | // If there is a Company attribute, return its value 110 | return ((AssemblyCompanyAttribute)attributes[0]).Company; 111 | } 112 | } 113 | #endregion 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /frmConfigureSqlConn.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | -------------------------------------------------------------------------------- /Properties/Resources.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\Resources\database_down.ico;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | 125 | ..\Resources\database_up.ico;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 126 | 127 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.rsuser 8 | *.suo 9 | *.user 10 | *.userosscache 11 | *.sln.docstates 12 | 13 | # User-specific files (MonoDevelop/Xamarin Studio) 14 | *.userprefs 15 | 16 | # Build results 17 | [Dd]ebug/ 18 | [Dd]ebugPublic/ 19 | [Rr]elease/ 20 | [Rr]eleases/ 21 | x64/ 22 | x86/ 23 | [Aa][Rr][Mm]/ 24 | [Aa][Rr][Mm]64/ 25 | bld/ 26 | [Bb]in/ 27 | [Oo]bj/ 28 | [Ll]og/ 29 | 30 | # Visual Studio 2015/2017 cache/options directory 31 | .vs/ 32 | # Uncomment if you have tasks that create the project's static files in wwwroot 33 | #wwwroot/ 34 | 35 | # Visual Studio 2017 auto generated files 36 | Generated\ Files/ 37 | 38 | # MSTest test Results 39 | [Tt]est[Rr]esult*/ 40 | [Bb]uild[Ll]og.* 41 | 42 | # NUNIT 43 | *.VisualState.xml 44 | TestResult.xml 45 | 46 | # Build Results of an ATL Project 47 | [Dd]ebugPS/ 48 | [Rr]eleasePS/ 49 | dlldata.c 50 | 51 | # Benchmark Results 52 | BenchmarkDotNet.Artifacts/ 53 | 54 | # .NET Core 55 | project.lock.json 56 | project.fragment.lock.json 57 | artifacts/ 58 | 59 | # StyleCop 60 | StyleCopReport.xml 61 | 62 | # Files built by Visual Studio 63 | *_i.c 64 | *_p.c 65 | *_h.h 66 | *.ilk 67 | *.meta 68 | *.obj 69 | *.iobj 70 | *.pch 71 | *.pdb 72 | *.ipdb 73 | *.pgc 74 | *.pgd 75 | *.rsp 76 | *.sbr 77 | *.tlb 78 | *.tli 79 | *.tlh 80 | *.tmp 81 | *.tmp_proj 82 | *_wpftmp.csproj 83 | *.log 84 | *.vspscc 85 | *.vssscc 86 | .builds 87 | *.pidb 88 | *.svclog 89 | *.scc 90 | 91 | # Chutzpah Test files 92 | _Chutzpah* 93 | 94 | # Visual C++ cache files 95 | ipch/ 96 | *.aps 97 | *.ncb 98 | *.opendb 99 | *.opensdf 100 | *.sdf 101 | *.cachefile 102 | *.VC.db 103 | *.VC.VC.opendb 104 | 105 | # Visual Studio profiler 106 | *.psess 107 | *.vsp 108 | *.vspx 109 | *.sap 110 | 111 | # Visual Studio Trace Files 112 | *.e2e 113 | 114 | # TFS 2012 Local Workspace 115 | $tf/ 116 | 117 | # Guidance Automation Toolkit 118 | *.gpState 119 | 120 | # ReSharper is a .NET coding add-in 121 | _ReSharper*/ 122 | *.[Rr]e[Ss]harper 123 | *.DotSettings.user 124 | 125 | # JustCode is a .NET coding add-in 126 | .JustCode 127 | 128 | # TeamCity is a build add-in 129 | _TeamCity* 130 | 131 | # DotCover is a Code Coverage Tool 132 | *.dotCover 133 | 134 | # AxoCover is a Code Coverage Tool 135 | .axoCover/* 136 | !.axoCover/settings.json 137 | 138 | # Visual Studio code coverage results 139 | *.coverage 140 | *.coveragexml 141 | 142 | # NCrunch 143 | _NCrunch_* 144 | .*crunch*.local.xml 145 | nCrunchTemp_* 146 | 147 | # MightyMoose 148 | *.mm.* 149 | AutoTest.Net/ 150 | 151 | # Web workbench (sass) 152 | .sass-cache/ 153 | 154 | # Installshield output folder 155 | [Ee]xpress/ 156 | 157 | # DocProject is a documentation generator add-in 158 | DocProject/buildhelp/ 159 | DocProject/Help/*.HxT 160 | DocProject/Help/*.HxC 161 | DocProject/Help/*.hhc 162 | DocProject/Help/*.hhk 163 | DocProject/Help/*.hhp 164 | DocProject/Help/Html2 165 | DocProject/Help/html 166 | 167 | # Click-Once directory 168 | publish/ 169 | 170 | # Publish Web Output 171 | *.[Pp]ublish.xml 172 | *.azurePubxml 173 | # Note: Comment the next line if you want to checkin your web deploy settings, 174 | # but database connection strings (with potential passwords) will be unencrypted 175 | *.pubxml 176 | *.publishproj 177 | 178 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 179 | # checkin your Azure Web App publish settings, but sensitive information contained 180 | # in these scripts will be unencrypted 181 | PublishScripts/ 182 | 183 | # NuGet Packages 184 | *.nupkg 185 | # The packages folder can be ignored because of Package Restore 186 | **/[Pp]ackages/* 187 | # except build/, which is used as an MSBuild target. 188 | !**/[Pp]ackages/build/ 189 | # Uncomment if necessary however generally it will be regenerated when needed 190 | #!**/[Pp]ackages/repositories.config 191 | # NuGet v3's project.json files produces more ignorable files 192 | *.nuget.props 193 | *.nuget.targets 194 | 195 | # Microsoft Azure Build Output 196 | csx/ 197 | *.build.csdef 198 | 199 | # Microsoft Azure Emulator 200 | ecf/ 201 | rcf/ 202 | 203 | # Windows Store app package directories and files 204 | AppPackages/ 205 | BundleArtifacts/ 206 | Package.StoreAssociation.xml 207 | _pkginfo.txt 208 | *.appx 209 | 210 | # Visual Studio cache files 211 | # files ending in .cache can be ignored 212 | *.[Cc]ache 213 | # but keep track of directories ending in .cache 214 | !?*.[Cc]ache/ 215 | 216 | # Others 217 | ClientBin/ 218 | ~$* 219 | *~ 220 | *.dbmdl 221 | *.dbproj.schemaview 222 | *.jfm 223 | *.pfx 224 | *.publishsettings 225 | orleans.codegen.cs 226 | 227 | # Including strong name files can present a security risk 228 | # (https://github.com/github/gitignore/pull/2483#issue-259490424) 229 | #*.snk 230 | 231 | # Since there are multiple workflows, uncomment next line to ignore bower_components 232 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 233 | #bower_components/ 234 | 235 | # RIA/Silverlight projects 236 | Generated_Code/ 237 | 238 | # Backup & report files from converting an old project file 239 | # to a newer Visual Studio version. Backup files are not needed, 240 | # because we have git ;-) 241 | _UpgradeReport_Files/ 242 | Backup*/ 243 | UpgradeLog*.XML 244 | UpgradeLog*.htm 245 | ServiceFabricBackup/ 246 | *.rptproj.bak 247 | 248 | # SQL Server files 249 | *.mdf 250 | *.ldf 251 | *.ndf 252 | 253 | # Business Intelligence projects 254 | *.rdl.data 255 | *.bim.layout 256 | *.bim_*.settings 257 | *.rptproj.rsuser 258 | *- Backup*.rdl 259 | 260 | # Microsoft Fakes 261 | FakesAssemblies/ 262 | 263 | # GhostDoc plugin setting file 264 | *.GhostDoc.xml 265 | 266 | # Node.js Tools for Visual Studio 267 | .ntvs_analysis.dat 268 | node_modules/ 269 | 270 | # Visual Studio 6 build log 271 | *.plg 272 | 273 | # Visual Studio 6 workspace options file 274 | *.opt 275 | 276 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 277 | *.vbw 278 | 279 | # Visual Studio LightSwitch build output 280 | **/*.HTMLClient/GeneratedArtifacts 281 | **/*.DesktopClient/GeneratedArtifacts 282 | **/*.DesktopClient/ModelManifest.xml 283 | **/*.Server/GeneratedArtifacts 284 | **/*.Server/ModelManifest.xml 285 | _Pvt_Extensions 286 | 287 | # Paket dependency manager 288 | .paket/paket.exe 289 | paket-files/ 290 | 291 | # FAKE - F# Make 292 | .fake/ 293 | 294 | # JetBrains Rider 295 | .idea/ 296 | *.sln.iml 297 | 298 | # CodeRush personal settings 299 | .cr/personal 300 | 301 | # Python Tools for Visual Studio (PTVS) 302 | __pycache__/ 303 | *.pyc 304 | 305 | # Cake - Uncomment if you are using it 306 | # tools/** 307 | # !tools/packages.config 308 | 309 | # Tabs Studio 310 | *.tss 311 | 312 | # Telerik's JustMock configuration file 313 | *.jmconfig 314 | 315 | # BizTalk build output 316 | *.btp.cs 317 | *.btm.cs 318 | *.odx.cs 319 | *.xsd.cs 320 | 321 | # OpenCover UI analysis results 322 | OpenCover/ 323 | 324 | # Azure Stream Analytics local run output 325 | ASALocalRun/ 326 | 327 | # MSBuild Binary and Structured Log 328 | *.binlog 329 | 330 | # NVidia Nsight GPU debugger configuration file 331 | *.nvuser 332 | 333 | # MFractors (Xamarin productivity tool) working folder 334 | .mfractor/ 335 | 336 | # Local History for Visual Studio 337 | .localhistory/ 338 | 339 | # BeatPulse healthcheck temp database 340 | healthchecksdb -------------------------------------------------------------------------------- /NC.Util.SqlSrv.BackupRestore.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Debug 5 | AnyCPU 6 | 8.0.50727 7 | 2.0 8 | {737E2FC3-BAED-4FFA-8360-95CFF86CE34B} 9 | WinExe 10 | Properties 11 | NC.Util.SqlSrv.BackupRestore 12 | BackupRestore 13 | database_process.ico 14 | v4.5.1 15 | 16 | 17 | 18 | 19 | 2.0 20 | false 21 | 22 | publish\ 23 | true 24 | Disk 25 | false 26 | Foreground 27 | 7 28 | Days 29 | false 30 | false 31 | true 32 | 0 33 | 1.0.0.%2a 34 | false 35 | true 36 | 37 | 38 | true 39 | full 40 | false 41 | bin\Debug\ 42 | DEBUG;TRACE 43 | prompt 44 | 4 45 | false 46 | 47 | 48 | pdbonly 49 | true 50 | bin\Release\ 51 | TRACE 52 | prompt 53 | 4 54 | false 55 | 56 | 57 | true 58 | 59 | 60 | 61 | False 62 | Libraries\Microsoft.SqlServer.ConnectionInfo.dll 63 | 64 | 65 | False 66 | Libraries\Microsoft.SqlServer.Management.Sdk.Sfc.dll 67 | 68 | 69 | False 70 | Libraries\Microsoft.SqlServer.Smo.dll 71 | 72 | 73 | False 74 | Libraries\Microsoft.SqlServer.SmoExtended.dll 75 | 76 | 77 | False 78 | Libraries\Microsoft.SqlServer.SqlClrProvider.dll 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | Form 95 | 96 | 97 | AboutBox.cs 98 | 99 | 100 | 101 | 102 | Form 103 | 104 | 105 | frmConfigureSqlConn.cs 106 | 107 | 108 | 109 | 110 | Form 111 | 112 | 113 | MainWin.cs 114 | 115 | 116 | 117 | 118 | Designer 119 | AboutBox.cs 120 | 121 | 122 | frmConfigureSqlConn.cs 123 | 124 | 125 | Designer 126 | MainWin.cs 127 | 128 | 129 | ResXFileCodeGenerator 130 | Resources.Designer.cs 131 | Designer 132 | 133 | 134 | True 135 | Resources.resx 136 | True 137 | 138 | 139 | SettingsSingleFileGenerator 140 | Settings.Designer.cs 141 | 142 | 143 | True 144 | Settings.settings 145 | True 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | False 160 | .NET Framework 3.5 SP1 Client Profile 161 | false 162 | 163 | 164 | False 165 | .NET Framework 3.5 SP1 166 | true 167 | 168 | 169 | 170 | 177 | -------------------------------------------------------------------------------- /Cryptography.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Collections.Generic; 4 | using System.Linq; 5 | using System.Text; 6 | using System.Threading.Tasks; 7 | using System.Security.Cryptography; 8 | 9 | namespace NC.Util.SqlSrv.BackupRestore 10 | { 11 | // ------------------------------------------------------------------------------------------ 12 | // https://www.c-sharpcorner.com/UploadFile/f8fa6c/data-encryption-and-decryption-in-C-Sharp/ 13 | // ------------------------------------------------------------------------------------------ 14 | public static class Cryptography 15 | { 16 | public static string EncryptData(string input, string key) 17 | { 18 | byte[] inputArray = UTF8Encoding.UTF8.GetBytes(input); 19 | TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider(); 20 | tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key); 21 | tripleDES.Mode = CipherMode.ECB; 22 | tripleDES.Padding = PaddingMode.PKCS7; 23 | ICryptoTransform cTransform = tripleDES.CreateEncryptor(); 24 | byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length); 25 | tripleDES.Clear(); 26 | return Convert.ToBase64String(resultArray, 0, resultArray.Length); 27 | } 28 | 29 | public static string DecryptData(string input, string key) 30 | { 31 | byte[] inputArray = Convert.FromBase64String(input); 32 | TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider(); 33 | tripleDES.Key = UTF8Encoding.UTF8.GetBytes(key); 34 | tripleDES.Mode = CipherMode.ECB; 35 | tripleDES.Padding = PaddingMode.PKCS7; 36 | ICryptoTransform cTransform = tripleDES.CreateDecryptor(); 37 | byte[] resultArray = cTransform.TransformFinalBlock(inputArray, 0, inputArray.Length); 38 | tripleDES.Clear(); 39 | return UTF8Encoding.UTF8.GetString(resultArray); 40 | } 41 | 42 | public static string EncryptDataDES(string strData, string strEncDcKey) 43 | { 44 | byte[] key = { }; //Encryption Key 45 | byte[] IV = { 10, 20, 30, 40, 50, 60, 70, 80 }; 46 | byte[] inputByteArray; 47 | try 48 | { 49 | key = Encoding.UTF8.GetBytes(strEncDcKey); 50 | // DESCryptoServiceProvider is a cryptography class defind in c#. 51 | DESCryptoServiceProvider ObjDES = new DESCryptoServiceProvider(); 52 | inputByteArray = Encoding.UTF8.GetBytes(strData); 53 | MemoryStream Objmst = new MemoryStream(); 54 | CryptoStream Objcs = new CryptoStream(Objmst, ObjDES.CreateEncryptor(key, IV), CryptoStreamMode.Write); 55 | Objcs.Write(inputByteArray, 0, inputByteArray.Length); 56 | Objcs.FlushFinalBlock(); 57 | return Convert.ToBase64String(Objmst.ToArray());//encrypted string 58 | } 59 | catch (System.Exception ex) 60 | { 61 | throw ex; 62 | } 63 | } 64 | 65 | public static string DecryptDataDES(string strData, string strEndDcKey) 66 | { 67 | byte[] key = { };// Key 68 | byte[] IV = { 10, 20, 30, 40, 50, 60, 70, 80 }; 69 | byte[] inputByteArray = new byte[strData.Length]; 70 | try 71 | { 72 | key = Encoding.UTF8.GetBytes(strEndDcKey); 73 | DESCryptoServiceProvider ObjDES = new DESCryptoServiceProvider(); 74 | inputByteArray = Convert.FromBase64String(strData); 75 | MemoryStream Objmst = new MemoryStream(); 76 | CryptoStream Objcs = new CryptoStream(Objmst, ObjDES.CreateDecryptor(key, IV), CryptoStreamMode.Write); 77 | Objcs.Write(inputByteArray, 0, inputByteArray.Length); 78 | Objcs.FlushFinalBlock(); 79 | Encoding encoding = Encoding.UTF8; 80 | return encoding.GetString(Objmst.ToArray()); 81 | } 82 | catch (System.Exception ex) 83 | { 84 | throw ex; 85 | } 86 | } 87 | 88 | public static string EncryptDataAES(string textData, string Encryptionkey) 89 | { 90 | RijndaelManaged objrij = new RijndaelManaged(); 91 | //set the mode for operation of the algorithm 92 | objrij.Mode = CipherMode.CBC; 93 | //set the padding mode used in the algorithm. 94 | objrij.Padding = PaddingMode.PKCS7; 95 | //set the size, in bits, for the secret key. 96 | objrij.KeySize = 0x80; 97 | //set the block size in bits for the cryptographic operation. 98 | objrij.BlockSize = 0x80; 99 | //set the symmetric key that is used for encryption & decryption. 100 | byte[] passBytes = Encoding.UTF8.GetBytes(Encryptionkey); 101 | //set the initialization vector (IV) for the symmetric algorithm 102 | byte[] EncryptionkeyBytes = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 103 | int len = passBytes.Length; 104 | if (len > EncryptionkeyBytes.Length) 105 | { 106 | len = EncryptionkeyBytes.Length; 107 | } 108 | Array.Copy(passBytes, EncryptionkeyBytes, len); 109 | objrij.Key = EncryptionkeyBytes; 110 | objrij.IV = EncryptionkeyBytes; 111 | //Creates symmetric AES object with the current key and initialization vector IV. 112 | ICryptoTransform objtransform = objrij.CreateEncryptor(); 113 | byte[] textDataByte = Encoding.UTF8.GetBytes(textData); 114 | //Final transform the test string. 115 | return Convert.ToBase64String(objtransform.TransformFinalBlock(textDataByte, 0, textDataByte.Length)); 116 | } 117 | 118 | public static string DecryptDataAES(string EncryptedText, string Encryptionkey) 119 | { 120 | RijndaelManaged objrij = new RijndaelManaged(); 121 | objrij.Mode = CipherMode.CBC; 122 | objrij.Padding = PaddingMode.PKCS7; 123 | objrij.KeySize = 0x80; 124 | objrij.BlockSize = 0x80; 125 | byte[] encryptedTextByte = Convert.FromBase64String(EncryptedText); 126 | byte[] passBytes = Encoding.UTF8.GetBytes(Encryptionkey); 127 | byte[] EncryptionkeyBytes = new byte[0x10]; 128 | int len = passBytes.Length; 129 | if (len > EncryptionkeyBytes.Length) 130 | { 131 | len = EncryptionkeyBytes.Length; 132 | } 133 | Array.Copy(passBytes, EncryptionkeyBytes, len); 134 | objrij.Key = EncryptionkeyBytes; 135 | objrij.IV = EncryptionkeyBytes; 136 | byte[] TextByte = objrij.CreateDecryptor().TransformFinalBlock(encryptedTextByte, 0, encryptedTextByte.Length); 137 | return Encoding.UTF8.GetString(TextByte); //it will return readable string 138 | } 139 | } 140 | 141 | //--------------------------------------------------------------- 142 | // https://tekeye.uk/visual_studio/encrypt-decrypt-c-sharp-string 143 | //--------------------------------------------------------------- 144 | public static class CryptographyCBC 145 | { 146 | // This size of the IV (in bytes) must = (keysize / 8). Default keysize is 256, so the IV must be 147 | // 32 bytes long. Using a 16 character string here gives us 32 bytes when converted to a byte array. 148 | private const string initVector = "pemgail9uzpgzl88"; 149 | // This constant is used to determine the keysize of the encryption algorithm 150 | private const int keysize = 256; 151 | //Encrypt 152 | public static string EncryptString(string plainText, string passPhrase) 153 | { 154 | byte[] initVectorBytes = Encoding.UTF8.GetBytes(initVector); 155 | byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText); 156 | PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null); 157 | byte[] keyBytes = password.GetBytes(keysize / 8); 158 | RijndaelManaged symmetricKey = new RijndaelManaged(); 159 | symmetricKey.Mode = CipherMode.CBC; 160 | ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes); 161 | MemoryStream memoryStream = new MemoryStream(); 162 | CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write); 163 | cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); 164 | cryptoStream.FlushFinalBlock(); 165 | byte[] cipherTextBytes = memoryStream.ToArray(); 166 | memoryStream.Close(); 167 | cryptoStream.Close(); 168 | return Convert.ToBase64String(cipherTextBytes); 169 | } 170 | //Decrypt 171 | public static string DecryptString(string cipherText, string passPhrase) 172 | { 173 | byte[] initVectorBytes = Encoding.UTF8.GetBytes(initVector); 174 | byte[] cipherTextBytes = Convert.FromBase64String(cipherText); 175 | PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null); 176 | byte[] keyBytes = password.GetBytes(keysize / 8); 177 | RijndaelManaged symmetricKey = new RijndaelManaged(); 178 | symmetricKey.Mode = CipherMode.CBC; 179 | ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes); 180 | MemoryStream memoryStream = new MemoryStream(cipherTextBytes); 181 | CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read); 182 | byte[] plainTextBytes = new byte[cipherTextBytes.Length]; 183 | int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length); 184 | memoryStream.Close(); 185 | cryptoStream.Close(); 186 | return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount); 187 | } 188 | } 189 | 190 | } 191 | -------------------------------------------------------------------------------- /frmConfigureSqlConn.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace NC.Util.SqlSrv.BackupRestore 2 | { 3 | partial class frmConfigureSqlConn 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | private void InitializeComponent() 30 | { 31 | this.cboAvailableSQLServers = new System.Windows.Forms.ComboBox(); 32 | this.cmdGetSqlServers = new System.Windows.Forms.Button(); 33 | this.cboAuthentication = new System.Windows.Forms.ComboBox(); 34 | this.lblAuthentication = new System.Windows.Forms.Label(); 35 | this.txtLogin = new System.Windows.Forms.TextBox(); 36 | this.lblLogin = new System.Windows.Forms.Label(); 37 | this.lblPassword = new System.Windows.Forms.Label(); 38 | this.txtPassword = new System.Windows.Forms.TextBox(); 39 | this.cmdTestConnection = new System.Windows.Forms.Button(); 40 | this.lblConnectionString = new System.Windows.Forms.Label(); 41 | this.txtConnectionString = new System.Windows.Forms.TextBox(); 42 | this.cmdOK = new System.Windows.Forms.Button(); 43 | this.cmdCancel = new System.Windows.Forms.Button(); 44 | this.SuspendLayout(); 45 | // 46 | // cboAvailableSQLServers 47 | // 48 | this.cboAvailableSQLServers.FormattingEnabled = true; 49 | this.cboAvailableSQLServers.Location = new System.Drawing.Point(136, 25); 50 | this.cboAvailableSQLServers.Name = "cboAvailableSQLServers"; 51 | this.cboAvailableSQLServers.Size = new System.Drawing.Size(131, 21); 52 | this.cboAvailableSQLServers.TabIndex = 0; 53 | // 54 | // cmdGetSqlServers 55 | // 56 | this.cmdGetSqlServers.Location = new System.Drawing.Point(27, 26); 57 | this.cmdGetSqlServers.Name = "cmdGetSqlServers"; 58 | this.cmdGetSqlServers.Size = new System.Drawing.Size(104, 23); 59 | this.cmdGetSqlServers.TabIndex = 1; 60 | this.cmdGetSqlServers.Text = "Get SQL Servers"; 61 | this.cmdGetSqlServers.UseVisualStyleBackColor = true; 62 | this.cmdGetSqlServers.Click += new System.EventHandler(this.cmdGetSqlServers_Click); 63 | // 64 | // cboAuthentication 65 | // 66 | this.cboAuthentication.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; 67 | this.cboAuthentication.FormattingEnabled = true; 68 | this.cboAuthentication.Location = new System.Drawing.Point(136, 52); 69 | this.cboAuthentication.Name = "cboAuthentication"; 70 | this.cboAuthentication.Size = new System.Drawing.Size(168, 21); 71 | this.cboAuthentication.TabIndex = 2; 72 | this.cboAuthentication.SelectionChangeCommitted += new System.EventHandler(this.cboAuthentication_SelectionChangeCommitted); 73 | // 74 | // lblAuthentication 75 | // 76 | this.lblAuthentication.AutoSize = true; 77 | this.lblAuthentication.Location = new System.Drawing.Point(47, 56); 78 | this.lblAuthentication.Name = "lblAuthentication"; 79 | this.lblAuthentication.Size = new System.Drawing.Size(78, 13); 80 | this.lblAuthentication.TabIndex = 3; 81 | this.lblAuthentication.Text = "Authentication:"; 82 | // 83 | // txtLogin 84 | // 85 | this.txtLogin.Enabled = false; 86 | this.txtLogin.Location = new System.Drawing.Point(136, 80); 87 | this.txtLogin.Name = "txtLogin"; 88 | this.txtLogin.Size = new System.Drawing.Size(100, 20); 89 | this.txtLogin.TabIndex = 4; 90 | // 91 | // lblLogin 92 | // 93 | this.lblLogin.AutoSize = true; 94 | this.lblLogin.Location = new System.Drawing.Point(89, 83); 95 | this.lblLogin.Name = "lblLogin"; 96 | this.lblLogin.Size = new System.Drawing.Size(36, 13); 97 | this.lblLogin.TabIndex = 5; 98 | this.lblLogin.Text = "Login:"; 99 | // 100 | // lblPassword 101 | // 102 | this.lblPassword.AutoSize = true; 103 | this.lblPassword.Location = new System.Drawing.Point(69, 109); 104 | this.lblPassword.Name = "lblPassword"; 105 | this.lblPassword.Size = new System.Drawing.Size(56, 13); 106 | this.lblPassword.TabIndex = 7; 107 | this.lblPassword.Text = "Password:"; 108 | // 109 | // txtPassword 110 | // 111 | this.txtPassword.Enabled = false; 112 | this.txtPassword.Location = new System.Drawing.Point(136, 109); 113 | this.txtPassword.Name = "txtPassword"; 114 | this.txtPassword.Size = new System.Drawing.Size(100, 20); 115 | this.txtPassword.TabIndex = 6; 116 | // 117 | // cmdTestConnection 118 | // 119 | this.cmdTestConnection.Location = new System.Drawing.Point(136, 135); 120 | this.cmdTestConnection.Name = "cmdTestConnection"; 121 | this.cmdTestConnection.Size = new System.Drawing.Size(104, 23); 122 | this.cmdTestConnection.TabIndex = 8; 123 | this.cmdTestConnection.Text = "Test Connection"; 124 | this.cmdTestConnection.UseVisualStyleBackColor = true; 125 | this.cmdTestConnection.Click += new System.EventHandler(this.cmdTestConnection_Click); 126 | // 127 | // lblConnectionString 128 | // 129 | this.lblConnectionString.AutoSize = true; 130 | this.lblConnectionString.Location = new System.Drawing.Point(57, 167); 131 | this.lblConnectionString.Name = "lblConnectionString"; 132 | this.lblConnectionString.Size = new System.Drawing.Size(68, 13); 133 | this.lblConnectionString.TabIndex = 12; 134 | this.lblConnectionString.Text = "Conn. String:"; 135 | // 136 | // txtConnectionString 137 | // 138 | this.txtConnectionString.Location = new System.Drawing.Point(136, 164); 139 | this.txtConnectionString.Name = "txtConnectionString"; 140 | this.txtConnectionString.Size = new System.Drawing.Size(416, 20); 141 | this.txtConnectionString.TabIndex = 11; 142 | // 143 | // cmdOK 144 | // 145 | this.cmdOK.Location = new System.Drawing.Point(136, 202); 146 | this.cmdOK.Name = "cmdOK"; 147 | this.cmdOK.Size = new System.Drawing.Size(80, 23); 148 | this.cmdOK.TabIndex = 13; 149 | this.cmdOK.Text = "Ok"; 150 | this.cmdOK.UseVisualStyleBackColor = true; 151 | this.cmdOK.Click += new System.EventHandler(this.cmdOK_Click); 152 | // 153 | // cmdCancel 154 | // 155 | this.cmdCancel.Location = new System.Drawing.Point(222, 202); 156 | this.cmdCancel.Name = "cmdCancel"; 157 | this.cmdCancel.Size = new System.Drawing.Size(80, 23); 158 | this.cmdCancel.TabIndex = 14; 159 | this.cmdCancel.Text = "Cancel"; 160 | this.cmdCancel.UseVisualStyleBackColor = true; 161 | // 162 | // frmConfigureSqlConn 163 | // 164 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 165 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 166 | this.ClientSize = new System.Drawing.Size(564, 240); 167 | this.Controls.Add(this.cmdCancel); 168 | this.Controls.Add(this.cmdOK); 169 | this.Controls.Add(this.lblConnectionString); 170 | this.Controls.Add(this.txtConnectionString); 171 | this.Controls.Add(this.cmdTestConnection); 172 | this.Controls.Add(this.lblPassword); 173 | this.Controls.Add(this.txtPassword); 174 | this.Controls.Add(this.lblLogin); 175 | this.Controls.Add(this.txtLogin); 176 | this.Controls.Add(this.lblAuthentication); 177 | this.Controls.Add(this.cboAuthentication); 178 | this.Controls.Add(this.cmdGetSqlServers); 179 | this.Controls.Add(this.cboAvailableSQLServers); 180 | this.Name = "frmConfigureSqlConn"; 181 | this.Text = "Configure SQL Server Connection"; 182 | this.ResumeLayout(false); 183 | this.PerformLayout(); 184 | 185 | } 186 | 187 | #endregion 188 | 189 | private System.Windows.Forms.ComboBox cboAvailableSQLServers; 190 | private System.Windows.Forms.Button cmdGetSqlServers; 191 | private System.Windows.Forms.ComboBox cboAuthentication; 192 | private System.Windows.Forms.Label lblAuthentication; 193 | private System.Windows.Forms.TextBox txtLogin; 194 | private System.Windows.Forms.Label lblLogin; 195 | private System.Windows.Forms.Label lblPassword; 196 | private System.Windows.Forms.TextBox txtPassword; 197 | private System.Windows.Forms.Button cmdTestConnection; 198 | private System.Windows.Forms.Label lblConnectionString; 199 | private System.Windows.Forms.TextBox txtConnectionString; 200 | private System.Windows.Forms.Button cmdOK; 201 | private System.Windows.Forms.Button cmdCancel; 202 | } 203 | } -------------------------------------------------------------------------------- /AboutBox.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace NC.Util.SqlSrv.BackupRestore 2 | { 3 | partial class AboutBox 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | protected override void Dispose(bool disposing) 14 | { 15 | if (disposing && (components != null)) 16 | { 17 | components.Dispose(); 18 | } 19 | base.Dispose(disposing); 20 | } 21 | 22 | #region Windows Form Designer generated code 23 | 24 | /// 25 | /// Required method for Designer support - do not modify 26 | /// the contents of this method with the code editor. 27 | /// 28 | private void InitializeComponent() 29 | { 30 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutBox)); 31 | this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); 32 | this.logoPictureBox = new System.Windows.Forms.PictureBox(); 33 | this.labelProductName = new System.Windows.Forms.Label(); 34 | this.labelVersion = new System.Windows.Forms.Label(); 35 | this.labelCopyright = new System.Windows.Forms.Label(); 36 | this.labelCompanyName = new System.Windows.Forms.Label(); 37 | this.textBoxDescription = new System.Windows.Forms.TextBox(); 38 | this.okButton = new System.Windows.Forms.Button(); 39 | this.tableLayoutPanel.SuspendLayout(); 40 | ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).BeginInit(); 41 | this.SuspendLayout(); 42 | // 43 | // tableLayoutPanel 44 | // 45 | this.tableLayoutPanel.ColumnCount = 2; 46 | this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F)); 47 | this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F)); 48 | this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0); 49 | this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); 50 | this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); 51 | this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2); 52 | this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3); 53 | this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4); 54 | this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5); 55 | this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; 56 | this.tableLayoutPanel.Location = new System.Drawing.Point(9, 9); 57 | this.tableLayoutPanel.Name = "tableLayoutPanel"; 58 | this.tableLayoutPanel.RowCount = 6; 59 | this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); 60 | this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); 61 | this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); 62 | this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); 63 | this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); 64 | this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F)); 65 | this.tableLayoutPanel.Size = new System.Drawing.Size(417, 265); 66 | this.tableLayoutPanel.TabIndex = 0; 67 | // 68 | // logoPictureBox 69 | // 70 | this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; 71 | this.logoPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("logoPictureBox.Image"))); 72 | this.logoPictureBox.Location = new System.Drawing.Point(3, 3); 73 | this.logoPictureBox.Name = "logoPictureBox"; 74 | this.tableLayoutPanel.SetRowSpan(this.logoPictureBox, 6); 75 | this.logoPictureBox.Size = new System.Drawing.Size(131, 259); 76 | this.logoPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; 77 | this.logoPictureBox.TabIndex = 12; 78 | this.logoPictureBox.TabStop = false; 79 | // 80 | // labelProductName 81 | // 82 | this.labelProductName.Dock = System.Windows.Forms.DockStyle.Fill; 83 | this.labelProductName.Location = new System.Drawing.Point(143, 0); 84 | this.labelProductName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); 85 | this.labelProductName.MaximumSize = new System.Drawing.Size(0, 17); 86 | this.labelProductName.Name = "labelProductName"; 87 | this.labelProductName.Size = new System.Drawing.Size(271, 17); 88 | this.labelProductName.TabIndex = 19; 89 | this.labelProductName.Text = "Product Name"; 90 | this.labelProductName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 91 | // 92 | // labelVersion 93 | // 94 | this.labelVersion.Dock = System.Windows.Forms.DockStyle.Fill; 95 | this.labelVersion.Location = new System.Drawing.Point(143, 26); 96 | this.labelVersion.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); 97 | this.labelVersion.MaximumSize = new System.Drawing.Size(0, 17); 98 | this.labelVersion.Name = "labelVersion"; 99 | this.labelVersion.Size = new System.Drawing.Size(271, 17); 100 | this.labelVersion.TabIndex = 0; 101 | this.labelVersion.Text = "Version"; 102 | this.labelVersion.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 103 | // 104 | // labelCopyright 105 | // 106 | this.labelCopyright.Dock = System.Windows.Forms.DockStyle.Fill; 107 | this.labelCopyright.Location = new System.Drawing.Point(143, 52); 108 | this.labelCopyright.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); 109 | this.labelCopyright.MaximumSize = new System.Drawing.Size(0, 17); 110 | this.labelCopyright.Name = "labelCopyright"; 111 | this.labelCopyright.Size = new System.Drawing.Size(271, 17); 112 | this.labelCopyright.TabIndex = 21; 113 | this.labelCopyright.Text = "Copyright"; 114 | this.labelCopyright.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 115 | // 116 | // labelCompanyName 117 | // 118 | this.labelCompanyName.Dock = System.Windows.Forms.DockStyle.Fill; 119 | this.labelCompanyName.Location = new System.Drawing.Point(143, 78); 120 | this.labelCompanyName.Margin = new System.Windows.Forms.Padding(6, 0, 3, 0); 121 | this.labelCompanyName.MaximumSize = new System.Drawing.Size(0, 17); 122 | this.labelCompanyName.Name = "labelCompanyName"; 123 | this.labelCompanyName.Size = new System.Drawing.Size(271, 17); 124 | this.labelCompanyName.TabIndex = 22; 125 | this.labelCompanyName.Text = "Company Name"; 126 | this.labelCompanyName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; 127 | // 128 | // textBoxDescription 129 | // 130 | this.textBoxDescription.AcceptsTab = true; 131 | this.textBoxDescription.Dock = System.Windows.Forms.DockStyle.Fill; 132 | this.textBoxDescription.Location = new System.Drawing.Point(143, 107); 133 | this.textBoxDescription.Margin = new System.Windows.Forms.Padding(6, 3, 3, 3); 134 | this.textBoxDescription.Multiline = true; 135 | this.textBoxDescription.Name = "textBoxDescription"; 136 | this.textBoxDescription.ReadOnly = true; 137 | this.textBoxDescription.ScrollBars = System.Windows.Forms.ScrollBars.Both; 138 | this.textBoxDescription.Size = new System.Drawing.Size(271, 126); 139 | this.textBoxDescription.TabIndex = 23; 140 | this.textBoxDescription.TabStop = false; 141 | this.textBoxDescription.Text = "Description"; 142 | // 143 | // okButton 144 | // 145 | this.okButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); 146 | this.okButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; 147 | this.okButton.Location = new System.Drawing.Point(339, 239); 148 | this.okButton.Name = "okButton"; 149 | this.okButton.Size = new System.Drawing.Size(75, 23); 150 | this.okButton.TabIndex = 24; 151 | this.okButton.Text = "&OK"; 152 | // 153 | // AboutBox 154 | // 155 | this.AcceptButton = this.okButton; 156 | this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 157 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 158 | this.ClientSize = new System.Drawing.Size(435, 283); 159 | this.Controls.Add(this.tableLayoutPanel); 160 | this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 161 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 162 | this.MaximizeBox = false; 163 | this.MinimizeBox = false; 164 | this.Name = "AboutBox"; 165 | this.Padding = new System.Windows.Forms.Padding(9); 166 | this.ShowIcon = false; 167 | this.ShowInTaskbar = false; 168 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; 169 | this.Text = "AboutBox"; 170 | this.tableLayoutPanel.ResumeLayout(false); 171 | this.tableLayoutPanel.PerformLayout(); 172 | ((System.ComponentModel.ISupportInitialize)(this.logoPictureBox)).EndInit(); 173 | this.ResumeLayout(false); 174 | 175 | } 176 | 177 | #endregion 178 | 179 | private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; 180 | private System.Windows.Forms.PictureBox logoPictureBox; 181 | private System.Windows.Forms.Label labelProductName; 182 | private System.Windows.Forms.Label labelVersion; 183 | private System.Windows.Forms.Label labelCopyright; 184 | private System.Windows.Forms.Label labelCompanyName; 185 | private System.Windows.Forms.TextBox textBoxDescription; 186 | private System.Windows.Forms.Button okButton; 187 | } 188 | } 189 | -------------------------------------------------------------------------------- /MainWin.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.ComponentModel; 4 | using System.Data; 5 | using System.Windows.Forms; 6 | using System.Data.SqlClient; 7 | using Microsoft.SqlServer.Management.Smo; 8 | using Microsoft.SqlServer.Management.Common; 9 | using System.Collections.Specialized; 10 | using System.Diagnostics.CodeAnalysis; 11 | using System.Globalization; 12 | using System.IO; 13 | using System.IO.Compression; 14 | using System.Text; 15 | using System.Net; 16 | using System.Net.Mail; 17 | 18 | 19 | namespace NC.Util.SqlSrv.BackupRestore 20 | { 21 | [SuppressMessage("ReSharper", "FieldCanBeMadeReadOnly.Local")] 22 | [SuppressMessage("ReSharper", "RedundantDelegateCreation")] 23 | public partial class MainWin : Form 24 | { 25 | private string _dbName = string.Empty; 26 | private string _backupFileName = String.Empty; 27 | private SqlConnection _sqlConn; 28 | private Server _sqlServer; 29 | private string _dbFileLocation = String.Empty; 30 | private string _devFilesLocation = String.Empty; 31 | private string _developmentZips = string.Empty; 32 | private string _zipFileName = String.Empty; 33 | private string _databaseFileName = String.Empty; 34 | private string _databaseLogFileName = string.Empty; 35 | private string _messageBoxCaption = "SQL Backup and Restore Utility"; 36 | private string _archiveFileName = String.Empty; 37 | 38 | // ----------------------------------------------------------------- 39 | // If you use this app, change your encryption key to something else 40 | // ----------------------------------------------------------------- 41 | private string _encryptionKey = "LazyDog"; 42 | 43 | private Dictionary _configurationSettings = new Dictionary(); 44 | private string _settingsFileName = Environment.CurrentDirectory + @"\ConfigurationSettings.sbu"; 45 | 46 | public MainWin() 47 | { 48 | 49 | InitializeComponent(); 50 | openBakFile.InitialDirectory = Application.StartupPath; 51 | saveBakFile.InitialDirectory = Application.StartupPath; 52 | try 53 | { 54 | InitializeConfigurationSettings(); 55 | ReadConfigurationSettings(); 56 | _configurationSettings.TryGetValue("ConfigurationSettings", out string connectionString); 57 | _sqlConn = new SqlConnection(connectionString); 58 | _sqlServer = new Server(new ServerConnection(_sqlConn)); 59 | PopulateGridWithDatabasesToBeBackedUp(); 60 | GenerateApplicationFileNames(_dbName); 61 | LoadDevelopmentDirectories(); 62 | } 63 | catch (Exception exc) 64 | { 65 | MessageBox.Show($@"Exception occured. Message: {exc.Message}", _messageBoxCaption); 66 | Logger.LogMessage($@"Exception occured. Message: {exc.Message}"); 67 | } 68 | } 69 | 70 | 71 | public void PopulateGridWithDatabasesToBeBackedUp() 72 | { 73 | if (_sqlServer.Databases.Count > 0) 74 | { 75 | dgvDatabases.Rows.Clear(); 76 | 77 | foreach (Database db in _sqlServer.Databases) 78 | { 79 | if (db.Name == "master" || db.Name == "tempdb" || db.Name == "model" || db.Name == "msdb") 80 | { 81 | // Do not display system databases // 82 | } 83 | else 84 | { 85 | dgvDatabases.Rows.Add(0, db.Name, GenerateDBBackupFileName(db.Name) + ".zip"); 86 | } 87 | } 88 | } 89 | } 90 | 91 | // --------------- 92 | // CTB: 2019/10/29 93 | // ------------------------------------------------------------------ 94 | // Sometimes the program might leave a stray file in the scratch pad. 95 | // Makes sure the scratch pad is free of files so we don't have file 96 | // collision during this new running of the program 97 | // ------------------------------------------------------------------ 98 | private void CleanUpScratchPadBakFiles() 99 | { 100 | if (Directory.Exists(txtScratchPad.Text)) 101 | { 102 | string[] files = Directory.GetFiles(txtScratchPad.Text); 103 | foreach (string file in files) 104 | { 105 | // -------------- 106 | // CTB 2019:10:31 107 | //---------------------------------------------------------- 108 | // WARNING: this method deletes ALL of the files in the 109 | // specified folder. We MUST filter to erase 110 | // ONLY .bak files or we'll empty a folder 111 | // of any files in it ... think of what would happen 112 | // if the user selected C:\Temp ... yikes. 113 | // ---------------------------------------------------------- 114 | if (file.Contains(".bak")) 115 | { 116 | File.Delete(file); 117 | } 118 | } 119 | } 120 | } 121 | 122 | private void saveBakFile_FileOk(object sender, CancelEventArgs e) 123 | { 124 | } 125 | 126 | private void openBakFile_FileOk(object sender, CancelEventArgs e) 127 | { 128 | txtFileToRestore.Text = openBakFile.FileName; 129 | } 130 | 131 | private void btnBackupDb_Click(object sender, EventArgs e) 132 | { 133 | for (int i = 0; i < dgvDatabases.Rows.Count; i++) 134 | { 135 | DataGridViewRow row = dgvDatabases.Rows[i]; 136 | string value = row.Cells["colDBSelected"].Value.ToString(); 137 | 138 | if (value == "true") 139 | { 140 | 141 | string databaseName = (string)(dgvDatabases.Rows[i].Cells["colDBName"].Value); 142 | _dbName = databaseName; 143 | string dbDevice = (string) (dgvDatabases.Rows[i].Cells["colDBBackupZipName"].Value); 144 | dbDevice = dbDevice.Replace("zip", "bak"); 145 | 146 | BackupDb(databaseName, dbDevice); 147 | 148 | CompressDbBackupFile(txtBackupZips.Text + (string)(dgvDatabases.Rows[i].Cells["colDBBackupZipName"].Value), dbDevice); 149 | } 150 | } 151 | } 152 | 153 | private void ShrinkDatabaseLogFile(string dbName) 154 | { 155 | string shortLogFileName = dbName + "_log"; 156 | 157 | string sqlCommand = "USE " + dbName; 158 | sqlCommand += " ALTER DATABASE " + dbName; 159 | sqlCommand += " SET RECOVERY SIMPLE"; 160 | sqlCommand += " DBCC SHRINKFILE (" + shortLogFileName + ", 1)"; 161 | sqlCommand += " ALTER DATABASE " + dbName; 162 | sqlCommand += " SET RECOVERY FULL"; 163 | Logger.LogMessage("Shrink Log File Script: " + sqlCommand); 164 | txtBackupScript.Text = sqlCommand; 165 | 166 | try 167 | { 168 | using (SqlCommand command = new SqlCommand(sqlCommand, _sqlConn)) 169 | { 170 | command.ExecuteNonQuery(); 171 | } 172 | MessageBox.Show(@"Shrink Log File succeeded!!!", _messageBoxCaption); 173 | Logger.LogMessage(@"Shrink Log File succeeded!!!"); 174 | Logger.LogMessage("----------"); 175 | } 176 | catch (Exception e) 177 | { 178 | MessageBox.Show(@"Shrink database log file failed, please see log file for details ...", _messageBoxCaption); 179 | Logger.LogMessage(@"ShrinkDatabaseLogFile() failed: " + e); 180 | Logger.LogMessage(@"----------"); 181 | 182 | MessageBox.Show(e.ToString(), _messageBoxCaption); 183 | } 184 | } 185 | 186 | private void ExtractBackupFile(string zipFile) 187 | { 188 | _backupFileName = zipFile.Replace(txtBackupZips.Text, txtScratchPad.Text); 189 | _backupFileName = _backupFileName.Replace(".zip", ".bak"); 190 | 191 | // ---------------- 192 | // CTB: 2019/10/28: 193 | // ---------------------------------------------------------- 194 | // Used only to display the name of the .bak file to the user 195 | // ---------------------------------------------------------- 196 | txtFileToRestore.Text = _backupFileName; 197 | 198 | if (File.Exists(_backupFileName)) 199 | { 200 | File.Delete(_backupFileName); 201 | } 202 | 203 | ZipFile.ExtractToDirectory(zipFile, txtScratchPad.Text); 204 | } 205 | 206 | private void CompressDbBackupFile(string dbDBBAckupZipFile, string dbBackupFile) 207 | { 208 | // --------------- 209 | // CTB: 2019/10/28 210 | // ------------------------------------------------------- 211 | // Zip files are named by HH:MM:SS ... if the user presses 212 | // the backup button more than once in a minute, erase 213 | // the existing .zip file and recreate it 214 | // ------------------------------------------------------- 215 | if (File.Exists(dbDBBAckupZipFile)) 216 | { 217 | File.Delete(dbDBBAckupZipFile); 218 | } 219 | 220 | // --------------- 221 | // CTB: 2019/10/27 222 | // ---------------------------------------------------- 223 | // ZipFile only allows backing up of ALL the files in 224 | // a specified directory, therefore, use a scratch pad 225 | // directory where the .bak file is initially created, 226 | // perform the compression and then erase the .BAK file 227 | // ---------------------------------------------------- 228 | ZipFile.CreateFromDirectory(txtScratchPad.Text, dbDBBAckupZipFile); 229 | File.Delete(dbBackupFile); 230 | } 231 | 232 | private void BackupDb(string dbName, string fileToBackupTo) 233 | { 234 | Backup dbBackup = new Backup(); 235 | 236 | try 237 | { 238 | fileToBackupTo = txtScratchPad.Text + fileToBackupTo; 239 | 240 | dbBackup.Action = BackupActionType.Database; 241 | dbBackup.Database = dbName; 242 | dbBackup.BackupSetName = $"{_dbName} backup set."; 243 | dbBackup.BackupSetDescription = $"Database: {dbName}:Date: {DateTime.Now:dd.MM.yyyy hh:mm}."; 244 | dbBackup.MediaDescription = "Disk"; 245 | 246 | BackupDeviceItem device = new BackupDeviceItem(fileToBackupTo, DeviceType.File); 247 | dbBackup.Devices.Add(device); 248 | 249 | txtBackupScript.Text = dbBackup.Script(_sqlServer); 250 | Logger.LogMessage("SQL Backup Script: " + txtBackupScript.Text); 251 | progBar.Visible = true; 252 | progBar.Value = 0; 253 | 254 | dbBackup.Complete += dbBackup_Complete; 255 | dbBackup.PercentCompleteNotification = 10; 256 | dbBackup.PercentComplete += PercentComplete; 257 | // ---------------------------- 258 | dbBackup.SqlBackup(_sqlServer); 259 | // ---------------------------- 260 | } 261 | catch (Exception exc) 262 | { 263 | dbBackup.Abort(); 264 | Logger.LogMessage($@"Exception occured. Message: {exc.Message}"); 265 | } 266 | 267 | progBar.Visible = false; 268 | } 269 | 270 | void dbBackup_Complete(object sender, ServerMessageEventArgs e) 271 | { 272 | MessageBox.Show(@"Backup of database " + _dbName + " is complete!!!", _messageBoxCaption); 273 | Logger.LogMessage($@"Backup complete!!!"); 274 | Logger.LogMessage("----------"); 275 | 276 | } 277 | 278 | private void btnRestore_Click(object sender, EventArgs e) 279 | { 280 | if (string.IsNullOrEmpty(_backupFileName)) 281 | { 282 | MessageBox.Show(@"Please select a .zip file first", _messageBoxCaption); 283 | } 284 | else 285 | { 286 | if (File.Exists(_backupFileName)) 287 | { 288 | RestoreDb(); 289 | } 290 | else 291 | { 292 | MessageBox.Show(@"The .zip file you specified does not exist!!!", _messageBoxCaption); 293 | Logger.LogMessage("The .zip file you specified does not exist." ); 294 | } 295 | } 296 | 297 | btnRestore.Enabled = false; 298 | txtFileToRestore.Text = String.Empty; 299 | } 300 | 301 | 302 | 303 | private void RestoreDb() 304 | { 305 | string[] dbNameFragments = _backupFileName.Split('_'); 306 | string _dbName = dbNameFragments[0].Replace(txtScratchPad.Text, ""); 307 | 308 | Restore dbRestore = new Restore(); 309 | dbRestore.Database = _dbName; 310 | dbRestore.Action = RestoreActionType.Database; 311 | dbRestore.ReplaceDatabase = true; 312 | 313 | try 314 | { 315 | BackupDeviceItem device = new BackupDeviceItem(_backupFileName, DeviceType.File); 316 | dbRestore.Devices.Add(device); 317 | DataTable dtFiles = dbRestore.ReadFileList(_sqlServer); 318 | string backupDbLogicalName = dtFiles.Rows[0]["LogicalName"].ToString(); 319 | 320 | RelocateFile dbRf = new RelocateFile(backupDbLogicalName, _databaseFileName); 321 | RelocateFile logRf = new RelocateFile($"{backupDbLogicalName}_log", _databaseLogFileName); 322 | dbRestore.RelocateFiles.Add(dbRf); 323 | dbRestore.RelocateFiles.Add(logRf); 324 | 325 | if (!logRf.PhysicalFileName.Contains(@"C:\")) 326 | { 327 | logRf.PhysicalFileName = _dbFileLocation + _databaseLogFileName; 328 | } 329 | 330 | Logger.LogMessage("Physical Log File: " + logRf.PhysicalFileName); 331 | Logger.LogMessage("Physical DB File: " + dbRf.PhysicalFileName); 332 | 333 | 334 | string sql = string.Empty; 335 | StringCollection scriptColl = dbRestore.Script(_sqlServer); 336 | foreach (string str in scriptColl) 337 | { 338 | sql += str; 339 | } 340 | 341 | sql = "USE master ALTER DATABASE " + _dbName + " SET SINGLE_USER WITH ROLLBACK IMMEDIATE " + sql; 342 | sql += " ALTER DATABASE " + _dbName + " SET MULTI_USER "; 343 | 344 | txtRestoreScript.Text = sql; 345 | Logger.LogMessage("SQL Restore Script: " + sql); 346 | progBar.Visible = true; 347 | progBar.Value = 0; 348 | 349 | dbRestore.Complete += new ServerMessageEventHandler(dbRestore_Complete); 350 | dbRestore.PercentComplete += new PercentCompleteEventHandler(PercentComplete); 351 | dbRestore.SqlRestore(_sqlServer); 352 | } 353 | catch (Exception exc) 354 | { 355 | dbRestore.Abort(); 356 | Logger.LogMessage($"RestoreDb(): Exception occured. Message: {exc.Message}"); 357 | MessageBox.Show(@"RestoreDb(): Exception occured. Message:" + exc.Message, _messageBoxCaption); 358 | } 359 | finally 360 | { 361 | if (File.Exists(_backupFileName)) 362 | { 363 | File.Delete(_backupFileName); 364 | } 365 | } 366 | 367 | progBar.Visible = false; 368 | } 369 | 370 | void PercentComplete(object sender, PercentCompleteEventArgs e) 371 | { 372 | if (progBar.Value < progBar.Maximum) 373 | { 374 | if ((progBar.Value + e.Percent) <= 100) 375 | { 376 | progBar.Value += e.Percent; 377 | } 378 | else 379 | progBar.Value = 100; 380 | } 381 | } 382 | 383 | void dbRestore_Complete(object sender, ServerMessageEventArgs e) 384 | { 385 | MessageBox.Show(@"Restore complete", _messageBoxCaption); 386 | Logger.LogMessage(@"Restore complete ... no errors."); 387 | Logger.LogMessage(@"----------"); 388 | 389 | } 390 | 391 | private void aboutToolStripMenuItem_Click(object sender, EventArgs e) 392 | { 393 | AboutBox about = new AboutBox(); 394 | about.ShowDialog(); 395 | } 396 | 397 | private void quitToolStripMenuItem_Click(object sender, EventArgs e) 398 | { 399 | Application.Exit(); 400 | } 401 | 402 | private string GenerateDBBackupFileName(string dbName) 403 | { 404 | string dbBackupFileName = string.Format("{6}DB_{0}{1}{2}_{3}{4}{5}", 405 | DateTime.Now.Year.ToString().PadLeft(4, '0'), 406 | DateTime.Now.Month.ToString().PadLeft(2, '0'), 407 | DateTime.Now.Day.ToString().PadLeft(2, '0'), 408 | DateTime.Now.Hour.ToString().PadLeft(2, '0'), 409 | DateTime.Now.Minute.ToString().PadLeft(2, '0'), 410 | DateTime.Now.Second.ToString().PadLeft(2, '0'), 411 | dbName); 412 | return dbBackupFileName; 413 | } 414 | 415 | private void GenerateApplicationFileNames(string dbName) 416 | { 417 | string baseFileName = GenerateDBBackupFileName(dbName); 418 | 419 | bool validDirectoryStructures = true; 420 | 421 | if (!Directory.Exists(txtBackupZips.Text)) 422 | { 423 | Logger.LogMessage("The backup destination directory " + txtBackupZips.Text + " does not exist."); 424 | validDirectoryStructures = false; 425 | } 426 | 427 | if (!Directory.Exists(txtScratchPad.Text)) 428 | { 429 | Logger.LogMessage("The scratch pad directory " + txtScratchPad.Text + " does not exist."); 430 | validDirectoryStructures = false; 431 | } 432 | 433 | if (!Directory.Exists(txtScratchPad.Text)) 434 | { 435 | Logger.LogMessage("The database file directory " + _dbFileLocation + " does not exist."); 436 | validDirectoryStructures = false; 437 | } 438 | 439 | if (!validDirectoryStructures) 440 | { 441 | cmdShrinkLogFile.Enabled = false; 442 | btnBackupDb.Enabled = false; 443 | btnRestore.Enabled = false; 444 | cmdGetZipFile.Enabled = false; 445 | 446 | MessageBox.Show( 447 | @"The directory structures for the application are invlid. Please see log file for details. Make the changes, recompile then redeploy the application.", _messageBoxCaption); 448 | Logger.LogMessage("----------"); 449 | 450 | } 451 | 452 | _backupFileName = txtScratchPad.Text + baseFileName + ".bak"; 453 | _zipFileName = txtBackupZips.Text + baseFileName + ".zip"; 454 | _databaseFileName = _dbFileLocation + dbName + ".mdf"; 455 | _databaseLogFileName = _dbFileLocation + dbName + "_Log.ldf"; 456 | 457 | Logger.LogMessage("Backup File Name: " + _backupFileName); 458 | Logger.LogMessage("Zip File Name: " + _zipFileName); 459 | Logger.LogMessage("Database File Name: " + _databaseFileName); 460 | Logger.LogMessage("Database Log File Name: " + _databaseLogFileName); 461 | Logger.LogMessage("----------"); 462 | } 463 | 464 | private void MainWin_FormClosing(object sender, FormClosingEventArgs e) 465 | { 466 | if (_sqlConn != null) 467 | { 468 | if (_sqlConn.State == ConnectionState.Open) 469 | { 470 | _sqlConn.Close(); 471 | } 472 | _sqlConn.Dispose(); 473 | CleanUpScratchPadBakFiles(); 474 | } 475 | } 476 | 477 | private void cmdGetZipFile_Click(object sender, EventArgs e) 478 | { 479 | ofdRestoreZips.InitialDirectory = txtBackupZips.Text; 480 | ofdRestoreZips.RestoreDirectory = true; 481 | ofdRestoreZips.Title = "Select a .zip file containg the .bak file of the DB to restore"; 482 | ofdRestoreZips.ValidateNames = true; 483 | ofdRestoreZips.AddExtension = true; 484 | ofdRestoreZips.Filter = "zip files (*.zip)|"; 485 | ofdRestoreZips.ShowHelp = false; 486 | ofdRestoreZips.FileName = ""; 487 | 488 | DialogResult result = ofdRestoreZips.ShowDialog(); 489 | if (string.IsNullOrEmpty(ofdRestoreZips.FileName)) 490 | { 491 | MessageBox.Show(@"Please select a .zip file first!!!", _messageBoxCaption); 492 | } 493 | else 494 | { 495 | if (result == DialogResult.OK) 496 | { 497 | if (RestoreWarning(ofdRestoreZips.FileName)) 498 | { 499 | ExtractBackupFile(ofdRestoreZips.FileName); 500 | } 501 | } 502 | } 503 | 504 | btnRestore.Enabled = true; 505 | } 506 | 507 | private bool RestoreWarning(string fileName) 508 | { 509 | bool isOk =false; 510 | int fileAge = DateTime.Now.Subtract(File.GetCreationTime(fileName)).Hours; 511 | string message = String.Empty; 512 | if (fileAge <= 1) 513 | { 514 | message = @"The backup .zip file you selected is approximately one hour old. If you restore from this file you will lose at the very least one hour of transactions. Press OK if you are sure you want to restore from this file."; 515 | if (MessageBox.Show(message, 516 | @"!!! CAUTION !!! " + _messageBoxCaption, 517 | MessageBoxButtons.OKCancel, 518 | MessageBoxIcon.Exclamation) == DialogResult.OK ) 519 | { 520 | isOk = true; 521 | } 522 | } 523 | else 524 | { 525 | message = @"The backup .zip file you selected is " + fileAge.ToString() + 526 | " hours old. You will lose at the very least that many hours of transactions if you restore from this file. Press OK if you are ABSOLUTELY sure you want to restore from this file."; 527 | if (MessageBox.Show(message, 528 | @"!!! WARNING !!! " + _messageBoxCaption, 529 | MessageBoxButtons.OKCancel, 530 | MessageBoxIcon.Warning) == DialogResult.OK) 531 | { 532 | isOk = true; 533 | } 534 | 535 | } 536 | 537 | return isOk; 538 | } 539 | 540 | private void cmdShrinkLogFile_Click(object sender, EventArgs e) 541 | { 542 | 543 | for (int i = 0; i < dgvDatabases.Rows.Count; i++) 544 | { 545 | DataGridViewRow row = dgvDatabases.Rows[i]; 546 | string value = row.Cells["colDBSelected"].Value.ToString(); 547 | 548 | if (value == "true") 549 | { 550 | string databaseName = (string)(dgvDatabases.Rows[i].Cells["colDBName"].Value); 551 | ShrinkDatabaseLogFile(databaseName); 552 | } 553 | } 554 | 555 | } 556 | 557 | private void cmdShow_Click(object sender, EventArgs e) 558 | { 559 | ShowLogFile(); 560 | } 561 | 562 | private void ShowLogFile() 563 | { 564 | string logFileName = Environment.CurrentDirectory + @"\LogFile.txt"; 565 | string logFileContents = string.Empty; 566 | if (File.Exists(logFileName)) 567 | { 568 | string[] contents = File.ReadAllLines(logFileName); 569 | foreach (string line in contents) 570 | { 571 | logFileContents += (line + Environment.NewLine); 572 | } 573 | txtLogFile.Text = logFileContents; 574 | } 575 | } 576 | 577 | private void cmdClear_Click(object sender, EventArgs e) 578 | { 579 | string logFileName = Environment.CurrentDirectory + @"\LogFile.txt"; 580 | 581 | if (File.Exists(logFileName)) 582 | { 583 | // ---------------------------------------------- 584 | // Recreate the log file by simply overwriting it 585 | // ---------------------------------------------- 586 | File.Create(logFileName); 587 | txtLogFile.Text = String.Empty; 588 | } 589 | } 590 | 591 | private void cmdViewInNotepad_Click(object sender, EventArgs e) 592 | { 593 | CommandLineHelper.LaunchNotepadToViewLogFile(); 594 | } 595 | 596 | private void SaveConfigurationSettings() 597 | { 598 | _configurationSettings.Clear(); 599 | _configurationSettings.Add("BackupZips", txtBackupZips.Text); 600 | _configurationSettings.Add("ScratchPad", txtScratchPad.Text); 601 | _configurationSettings.Add("DbFileLocations", txtSQLFileLocations.Text); 602 | _configurationSettings.Add("DevFilesLocation", txtDevFilesLocation.Text); 603 | _configurationSettings.Add("DevelopmentDirectory", txtDevelopmentZips.Text); 604 | _configurationSettings.Add("ConnectionString", txtConnectionString.Text); 605 | _configurationSettings.Add("SourceBackupSkipDLLs", (chkSkipDLLS.Checked)?"false": "true"); 606 | _configurationSettings.Add("LocalRetentionMonths", nudMonths.Value.ToString(CultureInfo.InvariantCulture)); 607 | _configurationSettings.Add("LocalRetentionDays", nudDays.Value.ToString(CultureInfo.InvariantCulture)); 608 | 609 | _configurationSettings.Add("EmailUseEmailSettings", (chkConfigureEmails.Checked) ? "true" : "false"); 610 | _configurationSettings.Add("EmailFromEmail", txtFromEmail.Text); 611 | _configurationSettings.Add("EmailSuccessEmail", txtSuccessEmail.Text); 612 | _configurationSettings.Add("EmailFailureEmail", txtFailureEmail.Text); 613 | _configurationSettings.Add("EmailSMTPOutgoingServer", txtSMTPServer.Text); 614 | _configurationSettings.Add("EmailOutgoingPortNumber", nudEmailOutgoingPortNumber.Value.ToString(CultureInfo.InvariantCulture)); 615 | _configurationSettings.Add("EmailLoginUserName", txtEmailLoginUserName.Text); 616 | _configurationSettings.Add("EmailLoginUserPassword", txtEmailLoginUserPassword.Text); 617 | _configurationSettings.Add("EmailRequiresSSL", (chkServerRequiresAuth.Checked) ? "true" : "false"); 618 | _configurationSettings.Add("EmailEnableSSL", (chkEnableSSL.Checked) ? "true" : "false"); 619 | 620 | _configurationSettings.Add("FTPUseFTPSettings", (chkFTPUseFTPSettings.Checked) ? "true" : "false"); 621 | _configurationSettings.Add("FTPRetentionMonths", nudFTPMonths.Value.ToString(CultureInfo.InvariantCulture)); 622 | _configurationSettings.Add("FTPRetentionDays", nudFTPDays.Value.ToString(CultureInfo.InvariantCulture)); 623 | _configurationSettings.Add("FTPHostAddress", txtFTPHostAddress.Text); 624 | _configurationSettings.Add("FTPUserName", txtFTPUserName.Text); 625 | _configurationSettings.Add("FTPPassword", txtFTPPassword.Text); 626 | _configurationSettings.Add("FTPPort", nudFTPPort.Value.ToString(CultureInfo.InvariantCulture)); 627 | _configurationSettings.Add("FTPDataConnection", "Passive(PASV)"); 628 | _configurationSettings.Add("FTPRemoteFolder", txtFTPRemoteFolder.Text); 629 | _configurationSettings.Add("FTPWriteSessionToLog", (chkFTPWriteSessionLog.Checked) ? "true" : "false"); 630 | 631 | if (File.Exists(_settingsFileName)) 632 | { 633 | File.Delete((_settingsFileName)); 634 | } 635 | 636 | FileStream fs = new FileStream(_settingsFileName, FileMode.Append); 637 | 638 | foreach (KeyValuePair setting in _configurationSettings) 639 | { 640 | // ------------------------------------------------------- 641 | // This time let's encrypt only the data, delimit with a : 642 | // ------------------------------------------------------- 643 | string encryptedConfigLine = setting.Key + ":" + CryptographyCBC.EncryptString(setting.Value, _encryptionKey) + 644 | Environment.NewLine; 645 | byte[] bConfigLine = Encoding.Default.GetBytes(encryptedConfigLine); 646 | fs.Write(bConfigLine, 0, bConfigLine.Length); 647 | } 648 | fs.Close(); 649 | } 650 | 651 | private void ReadConfigurationSettings() 652 | { 653 | if (File.Exists(_settingsFileName)) 654 | { 655 | _configurationSettings.Clear(); 656 | string[] configurationLines = File.ReadAllLines(_settingsFileName); 657 | string configLine = String.Empty; 658 | string[] splitKeyValue; 659 | 660 | string splitValue; 661 | string decryptedValue; 662 | string decryptedKey; 663 | 664 | 665 | foreach (string configSettingPair in configurationLines) 666 | { 667 | splitKeyValue = configSettingPair.Split(':'); 668 | decryptedKey = splitKeyValue[0]; 669 | 670 | splitValue = splitKeyValue[1]; // this is still encrypted 671 | decryptedValue = CryptographyCBC.DecryptString(splitValue, _encryptionKey); 672 | 673 | _configurationSettings.Add(decryptedKey, decryptedValue); 674 | } 675 | 676 | _configurationSettings.TryGetValue("BackupZips", out string backupZipDirectory); 677 | txtBackupZips.Text = backupZipDirectory; 678 | 679 | _configurationSettings.TryGetValue("ScratchPad", out string scratchPadDirectory); 680 | txtScratchPad.Text = scratchPadDirectory; 681 | 682 | _configurationSettings.TryGetValue("DbFileLocations", out string dbFileDirectory); 683 | txtSQLFileLocations.Text = dbFileDirectory; 684 | 685 | _configurationSettings.TryGetValue("DevFilesLocation", out string devFileLocation); 686 | txtDevFilesLocation.Text = devFileLocation; 687 | 688 | _configurationSettings.TryGetValue("DevelopmentDirectory", out string developmentDirectory); 689 | txtDevelopmentZips.Text = developmentDirectory; 690 | 691 | _configurationSettings.TryGetValue("ConnectionString", out string connectionString); 692 | txtConnectionString.Text = connectionString; 693 | 694 | _configurationSettings.TryGetValue("SourceBackupSkipDLLs", out string SourceBackupSkipDLLs); 695 | chkSkipDLLS.Checked = Convert.ToBoolean(SourceBackupSkipDLLs == "true"); 696 | 697 | _configurationSettings.TryGetValue("LocalRetentionMonths", out string months); 698 | nudMonths.Value = Convert.ToInt32(months); 699 | 700 | _configurationSettings.TryGetValue("LocalRetentionDays", out string days); 701 | nudDays.Value = Convert.ToInt32(days); 702 | 703 | _configurationSettings.TryGetValue("EmailSuccessEmail", out string successfulEmail); 704 | txtSuccessEmail.Text = successfulEmail; 705 | 706 | _configurationSettings.TryGetValue("EmailFailureEmail", out string failureEmail); 707 | txtFailureEmail.Text = failureEmail; 708 | 709 | _configurationSettings.TryGetValue("EmailUseEmailSettings", out string useEMailSettigns); 710 | chkConfigureEmails.Checked = Convert.ToBoolean(useEMailSettigns == "true"); 711 | 712 | _configurationSettings.TryGetValue("EmailFromEmail", out string emailFromEmail); 713 | txtFromEmail.Text = emailFromEmail; 714 | 715 | _configurationSettings.TryGetValue("EmailSMTPOutgoingServer", out string smtpOutgoingServer); 716 | txtSMTPServer.Text = smtpOutgoingServer; 717 | 718 | _configurationSettings.TryGetValue("EmailSMTPPort", out string emailSmtpPort); 719 | nudFTPPort.Value = Convert.ToInt32(emailSmtpPort); 720 | 721 | _configurationSettings.TryGetValue("EmailRequiresSSL", out string emailRequiresSsl); 722 | chkServerRequiresAuth.Checked = Convert.ToBoolean(emailRequiresSsl == "true"); 723 | 724 | _configurationSettings.TryGetValue("EmailEnableSSL", out string emailEnableSsl); 725 | chkEnableSSL.Checked = Convert.ToBoolean(emailEnableSsl == "true"); 726 | 727 | _configurationSettings.TryGetValue("EmailLoginUserName", out string emailLoginUserName); 728 | txtEmailLoginUserName.Text = emailLoginUserName; 729 | 730 | _configurationSettings.TryGetValue("EmailLoginUserPassword", out string emailLoginUserPassword); 731 | txtEmailLoginUserPassword.Text = emailLoginUserPassword; 732 | 733 | _configurationSettings.TryGetValue("EmailOutgoingPortNumber", out string emailOutgoingPortNumber); 734 | nudEmailOutgoingPortNumber.Value = Convert.ToInt32(emailOutgoingPortNumber); 735 | 736 | _configurationSettings.TryGetValue("FTPUseFTPSettings", out string ftpUseFtpSettings); 737 | chkFTPUseFTPSettings.Checked = Convert.ToBoolean(ftpUseFtpSettings == "true"); 738 | 739 | _configurationSettings.TryGetValue("FTPRetentionMonths", out string ftpRetentionMonths); 740 | nudFTPMonths.Value = Convert.ToInt32(ftpRetentionMonths); 741 | 742 | _configurationSettings.TryGetValue("FTPRetentionDays", out string ftpRetentionDays); 743 | nudFTPDays.Value = Convert.ToInt32(ftpRetentionDays); 744 | 745 | _configurationSettings.TryGetValue("FTPHostAddress", out string ftpHostAddress); 746 | txtFTPHostAddress.Text = ftpHostAddress; 747 | 748 | _configurationSettings.TryGetValue("FTPUserName", out string ftpUserName); 749 | txtFTPUserName.Text = ftpUserName; 750 | 751 | _configurationSettings.TryGetValue("FTPPassword", out string ftpPassword); 752 | txtFTPPassword.Text = ftpPassword; 753 | 754 | _configurationSettings.TryGetValue("FTPPort", out string ftpPort); 755 | nudFTPPort.Value = Convert.ToInt32(ftpPort); 756 | 757 | _configurationSettings.TryGetValue("FTPRemoteFolder",out string ftpRemoteFolder); 758 | txtFTPRemoteFolder.Text = ftpRemoteFolder; 759 | 760 | _configurationSettings.TryGetValue("EmailEnableSSL", out string ftpWriteSessionToLog); 761 | chkFTPWriteSessionLog.Checked = Convert.ToBoolean(ftpWriteSessionToLog == "true"); 762 | } 763 | } 764 | 765 | private void InitializeConfigurationSettings() 766 | { 767 | 768 | if (!File.Exists(_settingsFileName)) 769 | { 770 | _configurationSettings.Add("BackupZips", @"C:\NovantBackups\SQLBackups\"); 771 | _configurationSettings.Add("ScratchPad", @"C:\NovantBackups\Scratch\"); 772 | _configurationSettings.Add("DbFileLocations", @"C:\Program Files\Microsoft SQL Server\MSSQL13.SQLSVR_2016\MSSQL\DATA\"); 773 | _configurationSettings.Add("DevFilesLocation",@"E:\Development\"); 774 | _configurationSettings.Add("DevelopmentZips",@"I:\NovantBackups\"); 775 | _configurationSettings.Add("ConnectionString", "Server=CTB-MAXIMUS-PC;Database=master;Trusted_Connection=True"); 776 | _configurationSettings.Add("SourceBackupSkipDLLs","true"); 777 | _configurationSettings.Add("LocalRetentionMonths", "6"); 778 | _configurationSettings.Add("LocalRetentionDays", "0"); 779 | 780 | _configurationSettings.Add("EmailUseEmailSettings", "false"); 781 | _configurationSettings.Add("EmailFromEmail", "no-reply@novantconsulting.com"); 782 | _configurationSettings.Add("EmailSuccessEmail", "ct@novantconsulting.com"); 783 | _configurationSettings.Add("EmailFailureEmail", "ct@novantconsulting.com"); 784 | _configurationSettings.Add("EmailSMTPOutgoingServer", "smtpout.secureserver.net"); 785 | _configurationSettings.Add("EmailOutgoingPortNumber", "25"); 786 | _configurationSettings.Add("EmailLoginUserName", "ct@novantconsulting.com"); 787 | _configurationSettings.Add("EmailLoginUserPassword", "YouDontGetToSeeThis"); 788 | _configurationSettings.Add("EmailRequiresSSL", "true"); 789 | _configurationSettings.Add("EmailEnableSSL", "true"); 790 | 791 | _configurationSettings.Add("FTPUseFTPSettings", "false"); 792 | _configurationSettings.Add("FTPRetentionMonths", "6"); 793 | _configurationSettings.Add("FTPRetentionDays", "0"); 794 | _configurationSettings.Add("FTPHostAddress", @"ftp://50.62.160.129"); 795 | _configurationSettings.Add("FTPUserName", "CTBlankenship75"); 796 | _configurationSettings.Add("FTPPassword", "YouDontGetToSeeThis"); 797 | _configurationSettings.Add("FTPPort", "21"); 798 | _configurationSettings.Add("FTPDataConnection", "Passive(PASV)"); 799 | _configurationSettings.Add("FTPRemoteFolder", @"ftp://50.62.160.129/SQLBackups"); 800 | _configurationSettings.Add("FTPWriteSessionToLog", "true"); 801 | 802 | FileStream fs = new FileStream(_settingsFileName, FileMode.Append); 803 | 804 | foreach (KeyValuePair setting in _configurationSettings) 805 | { 806 | 807 | // ------------------------------------------------------- 808 | // This time let's encrypt only the data, delimit with a : 809 | // ------------------------------------------------------- 810 | string encryptedConfigLine = setting.Key + ":" + CryptographyCBC.EncryptString(setting.Value, _encryptionKey) + 811 | Environment.NewLine; 812 | byte[] bConfigLine = Encoding.Default.GetBytes(encryptedConfigLine); 813 | fs.Write(bConfigLine, 0, bConfigLine.Length); 814 | } 815 | fs.Close(); 816 | } 817 | } 818 | 819 | private void cmdBackupZips_Click(object sender, EventArgs e) 820 | { 821 | fbdBackupZips.SelectedPath = txtBackupZips.Text; 822 | fbdBackupZips.ShowNewFolderButton = true; 823 | fbdBackupZips.Description = "Select a path to store the backup .zip files"; 824 | if (fbdBackupZips.ShowDialog() == DialogResult.OK) 825 | { 826 | txtBackupZips.Text = fbdBackupZips.SelectedPath + @"\"; 827 | } 828 | } 829 | 830 | private void cmdScratch_Click(object sender, EventArgs e) 831 | { 832 | fbdScratch.SelectedPath = txtScratchPad.Text; 833 | fbdScratch.ShowNewFolderButton = true; 834 | fbdBackupZips.Description = "Select a path to store temporary .bak files"; 835 | if (fbdScratch.ShowDialog() == DialogResult.OK) 836 | { 837 | txtScratchPad.Text = fbdScratch.SelectedPath + @"\"; 838 | } 839 | } 840 | 841 | private void cmdSQLDBFiles_Click(object sender, EventArgs e) 842 | { 843 | fbdSQLDBFiles.SelectedPath = _dbFileLocation; 844 | fbdSQLDBFiles.ShowNewFolderButton = true; 845 | fbdSQLDBFiles.Description = "Select the location of the SQL Server data files"; 846 | if (fbdSQLDBFiles.ShowDialog() == DialogResult.OK) 847 | { 848 | txtSQLFileLocations.Text = fbdSQLDBFiles.SelectedPath + @"\"; 849 | } 850 | } 851 | 852 | private void cmdSendTestEmail_Click(object sender, EventArgs e) 853 | { 854 | try 855 | { 856 | SmtpClient smtp = new SmtpClient 857 | { 858 | Host = txtSMTPServer.Text, 859 | Port = 25, //Convert.ToInt32(nudEmailOutgoingPortNumber.Value), 860 | EnableSsl = chkEnableSSL.Checked, 861 | UseDefaultCredentials = false, 862 | Credentials = new NetworkCredential(txtEmailLoginUserName.Text, txtEmailLoginUserPassword.Text), 863 | Timeout = 30000, // 30 seconds 864 | DeliveryMethod = SmtpDeliveryMethod.Network 865 | }; 866 | 867 | MailMessage message = new MailMessage 868 | { 869 | From = new MailAddress(txtFromEmail.Text), 870 | Subject = "Test message from SQL Backup / Restore Utility", 871 | IsBodyHtml = true, 872 | Body = "This is a test ... and only a test!" 873 | }; 874 | message.To.Add(new MailAddress(txtSuccessEmail.Text)); 875 | 876 | txtLogFile.Text += "Test message send begun ..." + Environment.NewLine; 877 | Logger.LogMessage("Test message send begun ..."); 878 | 879 | // ================ 880 | smtp.Send(message); 881 | // ================ 882 | 883 | txtLogFile.Text += "Test message send complete ... success!" + Environment.NewLine; 884 | Logger.LogMessage("Test message send complete ... success!"); 885 | Logger.LogMessage("----------"); 886 | } 887 | catch (Exception ex) 888 | { 889 | // ReSharper disable once LocalizableElement 890 | txtLogFile.Text += "Test message attempt failed!" + Environment.NewLine; 891 | txtLogFile.Text += ex.ToString() + Environment.NewLine; 892 | Logger.LogMessage("Test meesage attempt failed!"); 893 | Logger.LogMessage(ex.ToString()); 894 | Logger.LogMessage("----------"); 895 | 896 | MessageBox.Show(ex.ToString(), _messageBoxCaption); 897 | } 898 | } 899 | 900 | private void cmdTestFTPTransfer_Click(object sender, EventArgs e) 901 | { 902 | progBar.Visible = true; 903 | progBar.Value = 0; 904 | _configurationSettings.TryGetValue("FTPUserName", out string FTPUserName); 905 | _configurationSettings.TryGetValue("FTPUserPassword", out string FTPUserPassword); 906 | 907 | try 908 | { 909 | WebClient client = new WebClient(); 910 | client.Credentials = new NetworkCredential(txtFTPUserName.Text, txtFTPPassword.Text); 911 | client.UploadProgressChanged += new UploadProgressChangedEventHandler(UploadProgressChangedEventHandler); 912 | client.UploadFileCompleted += new UploadFileCompletedEventHandler(UploadFileCompletedEventHandler); 913 | progBar.Visible = true; 914 | progBar.Value = 0; 915 | client.UploadFileAsync( new Uri(@"ftp://novantconsulting.com/SQLBackups/Novant/StrataFrame.bak"), @"E:\Strataframe.bak"); 916 | } 917 | catch (Exception) 918 | { 919 | throw; 920 | } 921 | } 922 | 923 | private void UploadProgressChangedEventHandler(object sender, UploadProgressChangedEventArgs e) 924 | { 925 | progBar.Value = e.ProgressPercentage; 926 | } 927 | 928 | private void UploadFileCompletedEventHandler(object sender, UploadFileCompletedEventArgs e) 929 | { 930 | progBar.Value = 100; 931 | if (MessageBox.Show(@"Upload completed!!!", _messageBoxCaption) == DialogResult.OK) 932 | { 933 | progBar.Visible = false; 934 | } 935 | } 936 | 937 | private void LoadDevelopmentDirectories() 938 | { 939 | if (Directory.Exists(txtDevFilesLocation.Text)) 940 | { 941 | string[] directories = Directory.GetDirectories(txtDevFilesLocation.Text); 942 | foreach (string directory in directories) 943 | { 944 | dgvDevelopmentDirectories.Rows.Add(0, directory); 945 | } 946 | } 947 | } 948 | 949 | private void cmdBackupDevelopmentDirectories_Click(object sender, EventArgs e) 950 | { 951 | try 952 | { 953 | CopyEachDevelopmentDirectory(); 954 | CreateDevelopmentZipFiles(); 955 | DeleteScratchFiles(); 956 | MessageBox.Show(@"Backup of development complete!!!", _messageBoxCaption); 957 | } 958 | catch (Exception exception) 959 | { 960 | Console.WriteLine(exception); 961 | throw; 962 | } 963 | } 964 | 965 | private void CopyEachDevelopmentDirectory() 966 | { 967 | 968 | for (int i = 0; i < dgvDevelopmentDirectories.Rows.Count; i++) 969 | { 970 | DataGridViewRow row = dgvDevelopmentDirectories.Rows[i]; 971 | string value = row.Cells["colSelected"].Value.ToString(); 972 | 973 | if (value=="true") 974 | { 975 | string sourceDirectoryName = (string)(dgvDevelopmentDirectories.Rows[i].Cells["colDirectoryName"].Value); 976 | string destinationDirectoryName = txtScratchPad.Text + sourceDirectoryName.Substring(3) + @"\"; 977 | 978 | if (!Directory.Exists(destinationDirectoryName)) 979 | { 980 | Directory.CreateDirectory(destinationDirectoryName); 981 | } 982 | CopyFolderContents(sourceDirectoryName, destinationDirectoryName); 983 | } 984 | } 985 | } 986 | 987 | private bool CopyFolderContents(string SourcePath, string DestinationPath) 988 | { 989 | SourcePath = SourcePath.EndsWith(@"\") ? SourcePath : SourcePath + @"\"; 990 | DestinationPath = DestinationPath.EndsWith(@"\") ? DestinationPath : DestinationPath + @"\"; 991 | 992 | try 993 | { 994 | if (Directory.Exists(SourcePath)) 995 | { 996 | if (Directory.Exists(DestinationPath) == false) 997 | { 998 | Directory.CreateDirectory(DestinationPath); 999 | } 1000 | 1001 | foreach (string file in Directory.GetFiles(SourcePath)) 1002 | { 1003 | FileInfo fileInfo = new FileInfo(file) {IsReadOnly = false}; 1004 | 1005 | if ( fileInfo.Name.Contains(".dll") || fileInfo.Name.Contains(".pdb")) 1006 | { 1007 | if (chkSkipDLLS.Checked) 1008 | { 1009 | // ------------------------------------------ 1010 | //Don't do anything ... skip all .dlls files' 1011 | // ------------------------------------------ 1012 | } 1013 | else if (chkSkipPDBFiles.Checked) 1014 | { 1015 | // ------------------------------------------ 1016 | // Don't do anything ... skip all .pdb files' 1017 | // ------------------------------------------ 1018 | } 1019 | else 1020 | { 1021 | // ------------------------------------------------------- 1022 | // Copy the file as if none of the checkboxes were checked 1023 | // ------------------------------------------------------- 1024 | fileInfo.CopyTo(string.Format(@"{0}\{1}", DestinationPath, fileInfo.Name), true); 1025 | } 1026 | } 1027 | else 1028 | { 1029 | fileInfo.CopyTo(string.Format(@"{0}\{1}", DestinationPath, fileInfo.Name), true); 1030 | } 1031 | } 1032 | 1033 | foreach (string drs in Directory.GetDirectories(SourcePath)) 1034 | { 1035 | DirectoryInfo directoryInfo = new DirectoryInfo(drs); 1036 | if (CopyFolderContents(drs, DestinationPath + directoryInfo.Name) == false) 1037 | { 1038 | return false; 1039 | } 1040 | } 1041 | } 1042 | return true; 1043 | } 1044 | catch (Exception ex) 1045 | { 1046 | string blah = ex.ToString(); 1047 | return false; 1048 | } 1049 | } 1050 | 1051 | private void CreateDevelopmentZipFileNames() 1052 | { 1053 | _archiveFileName = _developmentZips + string.Format("{6}DEV_{0}{1}{2}_{3}{4}{5}", 1054 | DateTime.Now.Year.ToString().PadLeft(4, '0'), 1055 | DateTime.Now.Month.ToString().PadLeft(2, '0'), 1056 | DateTime.Now.Day.ToString().PadLeft(2, '0'), 1057 | DateTime.Now.Hour.ToString().PadLeft(2, '0'), 1058 | DateTime.Now.Minute.ToString().PadLeft(2, '0'), 1059 | DateTime.Now.Second.ToString().PadLeft(2, '0') + ".zip", 1060 | "DevelopmentBackup"); 1061 | 1062 | txtDevZipName.Text = _archiveFileName; 1063 | } 1064 | 1065 | private void CreateDevelopmentZipFiles() 1066 | { 1067 | 1068 | ZipFile.CreateFromDirectory(txtScratchPad.Text, txtDevZipName.Text); 1069 | 1070 | } 1071 | 1072 | private void DeleteScratchFiles() 1073 | { 1074 | string message = "You are about to delete all of the directories and files in the " + txtScratchPad.Text + 1075 | " directory. Are you sure you want to do this?"; 1076 | if (MessageBox.Show(message, _messageBoxCaption, MessageBoxButtons.YesNo) == DialogResult.Yes) 1077 | { 1078 | foreach (string directory in Directory.GetDirectories(txtScratchPad.Text)) 1079 | { 1080 | DeleteDirectory(directory); 1081 | } 1082 | } 1083 | } 1084 | 1085 | private void DeleteDirectory(string path) 1086 | { 1087 | if (Directory.Exists(path)) 1088 | { 1089 | try 1090 | { 1091 | foreach (string file in Directory.GetFiles(path)) 1092 | { 1093 | File.Delete(file); 1094 | } 1095 | //Delete all child Directories 1096 | foreach (string directory in Directory.GetDirectories(path)) 1097 | { 1098 | DeleteDirectory(directory); 1099 | } 1100 | //Delete a Directory 1101 | Directory.Delete(path); 1102 | } 1103 | catch (Exception) 1104 | { 1105 | throw; 1106 | } 1107 | } 1108 | } 1109 | 1110 | private void saveToolstripMenuItem_Click(object sender, EventArgs e) 1111 | { 1112 | SaveConfigurationSettings(); 1113 | } 1114 | 1115 | private void tacMain_Selected(object sender, TabControlEventArgs e) 1116 | { 1117 | if (tacMain.SelectedIndex == 2) 1118 | { 1119 | CreateDevelopmentZipFileNames(); 1120 | } 1121 | } 1122 | 1123 | private void cmdDevFilesLocation_Click(object sender, EventArgs e) 1124 | { 1125 | fbdDevFileLocations.SelectedPath = Environment.CurrentDirectory; 1126 | fbdDevFileLocations.ShowNewFolderButton = false; 1127 | fbdDevFileLocations.Description = "Select the location of your development backup .zip files"; 1128 | if (fbdDevFileLocations.ShowDialog() == DialogResult.OK) 1129 | { 1130 | txtDevFilesLocation.Text = fbdDevFileLocations.SelectedPath + @"\"; 1131 | _devFilesLocation = txtDevFilesLocation.Text; 1132 | LoadDevelopmentDirectories(); 1133 | } 1134 | } 1135 | 1136 | private void cmdDevelopmentZips_Click(object sender, EventArgs e) 1137 | { 1138 | fbdDevelopmentZips.SelectedPath = Environment.CurrentDirectory; 1139 | fbdDevelopmentZips.ShowNewFolderButton = false; 1140 | fbdDevelopmentZips.Description = "Select the location of your development backup .zip files"; 1141 | if (fbdDevelopmentZips.ShowDialog() == DialogResult.OK) 1142 | { 1143 | txtDevelopmentZips.Text = fbdDevelopmentZips.SelectedPath + @"\"; 1144 | _developmentZips = txtDevelopmentZips.Text; 1145 | LoadDevelopmentDirectories(); 1146 | } 1147 | } 1148 | 1149 | private void dbdDevZipDirectory_HelpRequest(object sender, EventArgs e) 1150 | { 1151 | 1152 | } 1153 | 1154 | private void cmdConfigureConn_Click(object sender, EventArgs e) 1155 | { 1156 | using (frmConfigureSqlConn oCSN = new frmConfigureSqlConn()) 1157 | { 1158 | oCSN.ShowDialog(); 1159 | if (oCSN.ConnectionString != String.Empty) 1160 | { 1161 | _sqlConn = new SqlConnection(oCSN.ConnectionString); 1162 | _sqlServer = new Server(new ServerConnection(_sqlConn)); 1163 | PopulateGridWithDatabasesToBeBackedUp(); 1164 | txtConnectionString.Text = oCSN.ConnectionString; 1165 | _configurationSettings["ConnectionString"] = oCSN.ConnectionString; 1166 | SaveConfigurationSettings(); 1167 | } 1168 | } 1169 | } 1170 | } 1171 | } 1172 | -------------------------------------------------------------------------------- /AboutBox.resx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | 123 | /9j/4AAQSkZJRgABAQEASABIAAD/4QH4RXhpZgAATU0AKgAAAAgABgEPAAIAAAAOAAAAVgEQAAIAAAAG 124 | AAAAZAExAAIAAAAlAAAAagEyAAIAAAAUAAAAkAITAAMAAAABAAIAAIdpAAQAAAABAAAApAAAAABTb255 125 | IEVyaWNzc29uAEs3NTBpAFIxQ0EwMjEgICAgIHByZ0NYQzEyNTk1Ml9FVV8xX0NMIDUuMwAAMjAwNzow 126 | NzoyMiAxNjowODoxOAAAFYKaAAUAAAABAAABpoKdAAUAAAABAAABrognAAMAAAABAH0AAJAAAAcAAAAE 127 | MDIyMJADAAIAAAAUAAABtpAEAAIAAAAUAAABypEBAAcAAAAEAQIDAJIEAAoAAAABAAAB3pIHAAMAAAAB 128 | AAIAAJIIAAMAAAABAAAAAJIJAAMAAAABAAAAAKAAAAcAAAAEMDEwMKABAAMAAAABAAEAAKACAAQAAAAB 129 | AAAB4KADAAQAAAABAAACgKQBAAMAAAABAAAAAKQCAAMAAAABAAAAAKQDAAMAAAABAAAAAKQEAAUAAAAB 130 | AAAB5qQGAAMAAAABAAAAAKQMAAMAAAABAAMAAAAAAAAAAAABAAAZAAAAABwAAAAKMjAwNzowNzoyMiAx 131 | NjowODoxOAAyMDA3OjA3OjIyIDE2OjA4OjE4AAAAAAAAAAAKAAAAZAAAAGQAAP/bAEMABQMEBAQDBQQE 132 | BAUFBQYHDAgHBwcHDwsLCQwRDxISEQ8RERMWHBcTFBoVEREYIRgaHR0fHx8TFyIkIh4kHB4fHv/bAEMB 133 | BQUFBwYHDggIDh4UERQeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e 134 | Hh4eHv/AABEIAbwBSAMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1 135 | EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZ 136 | GiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaX 137 | 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 752 | 0opbhY//2Q== 753 | 754 | 755 | --------------------------------------------------------------------------------