Commit 22ea3e7ebaf982e9cf9ab1e61344906f92e51928

Authored by Schwirg László
1 parent 2f5d8765

v1.4.0: database shrink function is implemented

Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - CommandLineParser.cs
@@ -281,6 +281,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS @@ -281,6 +281,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.CommandLineParserNS
281 public static class RestoreDataBase { public const string KEY = "RES"; public const string CMD_RESTOREFIRST = "-RESTOREFIRST"; 281 public static class RestoreDataBase { public const string KEY = "RES"; public const string CMD_RESTOREFIRST = "-RESTOREFIRST";
282 } 282 }
283 public static class RelocatePhysicalFiles { public const string KEY = "COP"; } 283 public static class RelocatePhysicalFiles { public const string KEY = "COP"; }
  284 + public static class ShrinkDB { public const string KEY = "SHR"; }
284 } 285 }
285 } 286 }
286 287
Vrh.Log4Pro.MaintenanceConsole/ConsoleFunction - Tools.cs
@@ -210,27 +210,46 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS @@ -210,27 +210,46 @@ namespace Vrh.Log4Pro.MaintenanceConsole.ToolsNS
210 Process.Start(startinfo); 210 Process.Start(startinfo);
211 } 211 }
212 public enum ShutDownMode { Sleep, Hibernation,Lock,Logoff,Restart,ShutDown,} 212 public enum ShutDownMode { Sleep, Hibernation,Lock,Logoff,Restart,ShutDown,}
213 - public static string HKLM_GetString(string path, string key) 213 + private static string HKLM_GetString(string path, string key)
214 { 214 {
215 try 215 try
216 { 216 {
217 - RegistryKey rk = Registry.LocalMachine.OpenSubKey(path);  
218 - if (rk == null) { return ""; } 217 + Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(path);
  218 + if (rk == null) return "";
219 return (string)rk.GetValue(key); 219 return (string)rk.GetValue(key);
220 } 220 }
221 - catch { return ""; } 221 + catch { return null; }
222 } 222 }
223 223
224 - public static string OSFriendlyName() 224 + public static string GetOSFriendlyNameA()
225 { 225 {
226 string ProductName = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName"); 226 string ProductName = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "ProductName");
227 string CSDVersion = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CSDVersion"); 227 string CSDVersion = HKLM_GetString(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CSDVersion");
228 - if (ProductName != "") 228 + if (!string.IsNullOrWhiteSpace(ProductName))
229 { 229 {
230 - return (ProductName.StartsWith("Microsoft") ? "" : "Microsoft ") + ProductName +  
231 - (CSDVersion != "" ? " " + CSDVersion : ""); 230 + return (ProductName.StartsWith("Microsoft") ? "" : "Microsoft ") + ProductName + (CSDVersion != "" ? " " + CSDVersion : "");
232 } 231 }
233 - return ""; 232 + return null;
  233 + }
  234 +
  235 + public static string GetOSFriendlyNameB()
  236 + {
  237 + string result = string.Empty;
  238 + ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem");
  239 + foreach (ManagementObject os in searcher.Get()) { result = os["Caption"].ToString(); break; }
  240 + return string.IsNullOrWhiteSpace(result)? null : result;
  241 + }
  242 + public static string GetOSFriendlyNameC()
  243 + {
  244 + return new Microsoft.VisualBasic.Devices.ComputerInfo().OSFullName;
  245 + }
  246 + public static string GetOSType()
  247 + {
  248 + string os = null;
  249 + IEnumerable<string> list64 = System.IO.Directory.GetDirectories(Environment.GetEnvironmentVariable("SystemRoot")).Where(s => s.Equals(@"C:\Windows\SysWOW64"));
  250 + IEnumerable<string> list32 = System.IO.Directory.GetDirectories(Environment.GetEnvironmentVariable("SystemRoot")).Where(s => s.Equals(@"C:\Windows\System32"));
  251 + if (list32.Count() > 0) { if (list64.Count() > 0) { os = "64bit"; } else { os = "32bit"; } }
  252 + return os;
234 } 253 }
235 } 254 }
236 255
Vrh.Log4Pro.MaintenanceConsole/Manager - InstallManager.cs
@@ -111,12 +111,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.InstallManagerNS @@ -111,12 +111,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.InstallManagerNS
111 } 111 }
112 public static InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values? GetOsCode() 112 public static InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values? GetOsCode()
113 { 113 {
114 - string osfrn = Tools.OSFriendlyName(); 114 + string osfrn = Tools.GetOSFriendlyNameB();
115 var defaultvalue = 115 var defaultvalue =
116 osfrn.StartsWith("Microsoft Windows 10") ? InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values.WS2016.ToString() 116 osfrn.StartsWith("Microsoft Windows 10") ? InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values.WS2016.ToString()
117 : osfrn.StartsWith("Microsoft Windows Server 2016") ? InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values.WS2016.ToString() 117 : osfrn.StartsWith("Microsoft Windows Server 2016") ? InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values.WS2016.ToString()
118 : osfrn.StartsWith("Microsoft Windows Server 2012") ? InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values.WS2016.ToString() 118 : osfrn.StartsWith("Microsoft Windows Server 2012") ? InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values.WS2016.ToString()
119 - : null; 119 + : "";
120 var oslist = Enum.GetNames(typeof(InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values)).ToList(); 120 var oslist = Enum.GetNames(typeof(InstallManagerXmlParser.XmlStructure.EnvironmentInstall.WindowsFeatureList.Attributes.OS.Values)).ToList();
121 string answer = ColorConsole.ReadLine($"Enter os code (friendly name is: '{osfrn}')!", ConsoleColor.Green, validitylist: oslist, defaultvalue: defaultvalue.ToString(), required: true); 121 string answer = ColorConsole.ReadLine($"Enter os code (friendly name is: '{osfrn}')!", ConsoleColor.Green, validitylist: oslist, defaultvalue: defaultvalue.ToString(), required: true);
122 if (answer.ToLower() == "ex") { return null; } 122 if (answer.ToLower() == "ex") { return null; }
Vrh.Log4Pro.MaintenanceConsole/Manager - SQLDataBaseManager.cs
@@ -48,6 +48,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -48,6 +48,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
48 .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateDataScripts.KEY, "Create data scripts", CreateDataScripts, ep)) 48 .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.CreateDataScripts.KEY, "Create data scripts", CreateDataScripts, ep))
49 .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.KEY, "Restore database backup", RestoreDataBase, ep)) 49 .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RestoreDataBase.KEY, "Restore database backup", RestoreDataBase, ep))
50 .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RelocatePhysicalFiles.KEY, "Copy database and or relocate its physical files", RelocatePhysicalFiles, ep)) 50 .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.RelocatePhysicalFiles.KEY, "Copy database and or relocate its physical files", RelocatePhysicalFiles, ep))
  51 + .AddMenuItem(new Menu.Item(CLP.Module.SQLDataBaseManager.Function.ShrinkDB.KEY, "Shrink database", ShrinkDB, ep))
51 .SetSelectionMode(Menu.SelectionMode.Single) 52 .SetSelectionMode(Menu.SelectionMode.Single)
52 .SetMenuHeaderDisplayer(DataBaseListDisplayer); 53 .SetMenuHeaderDisplayer(DataBaseListDisplayer);
53 menufunctions.ExecuteMenu(functionkey); 54 menufunctions.ExecuteMenu(functionkey);
@@ -214,6 +215,49 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -214,6 +215,49 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
214 } 215 }
215 return o; 216 return o;
216 } 217 }
  218 + private static object ShrinkDB(object parameter, object o)
  219 + {
  220 + var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
  221 + var args = (parameter as Menu.ExecutorParameter).Args;
  222 +
  223 + var selectedtaskindexes = CommandLine.GetCommandLineArgument(args, CLP.Module.ScheduledTaskManager.Function.CMD_TASKS);
  224 +
  225 + var menufolders = DisplaySQLDataBaseMenu(config, $"Select the SQL database(s) to manage with function '{nameof(ShrinkDB)}'!", silent: true);
  226 +
  227 + Menu.Selection sr = menufolders.Select(selectedtaskindexes);
  228 + if (sr.Result == Menu.SelectionResult.Exit) { return o; }
  229 + else if (sr.Result == Menu.SelectionResult.None) { return o; }
  230 + else if (sr.Result == Menu.SelectionResult.Error) { return o; }
  231 + else if (sr.Result == Menu.SelectionResult.Ok) { }
  232 + else { }
  233 + foreach (var p in sr.SelectedParameterList)
  234 + {
  235 + SQLDataBase sqld = p.Parameters as SQLDataBase;
  236 + try
  237 + {
  238 + ColorConsole.WriteLine(prefix: $"Enter the shrink options. Format:", bracket:"()", text:"OPTION,FreeSpacePercent:", f:ConsoleColor.Yellow);
  239 + ColorConsole.WriteLine(prefix:" ", text:"Default", bracket: "[]", suffix: $": (default) compacts the data and removes free space from the DB. Use togethere with FreeSpacePercent.", f:ConsoleColor.Yellow);
  240 + ColorConsole.WriteLine(prefix: " ", text: "NoTruncate",bracket:"[]", suffix: $": compacts the data, but does not remove free space from the DB. FreeSpacePercent is not applicable.", f: ConsoleColor.Yellow);
  241 + ColorConsole.WriteLine(prefix: " ", text: "TruncateOnly", bracket: "[]", suffix: $": does not compact the data, but removes free space from the DB. Use togethere with FreeSpacePercent.", f: ConsoleColor.Yellow);
  242 + ColorConsole.WriteLine(prefix: " ", text: "FreeSpacePercent", bracket: "[]", suffix: $": an integer number between 0-100,default=10; indicates the percentage of free space in the shrinked DB.", f: ConsoleColor.Yellow);
  243 + var shrinkoptions = ColorConsole.ReadLine($"EX=exit.", ConsoleColor.Yellow, suffix: " --> ");
  244 + if (shrinkoptions == "EX") { continue; }
  245 + else if (string.IsNullOrWhiteSpace(shrinkoptions)) { shrinkoptions = "Default,10"; }
  246 + string option, fsp = null;
  247 + int fspint = 10;
  248 + option = shrinkoptions.Split(new char[] { ',' })[0];
  249 + if (shrinkoptions.IndexOf(',') >= 0) { fsp = shrinkoptions.Split(new char[] { ',' })[1]; }
  250 + if (string.IsNullOrWhiteSpace(option) || !"Default,NoTruncate,TruncateOnly".Contains(option)) { option = "Default"; }
  251 + var shrinkmethod = (ShrinkMethod)Enum.Parse(typeof(ShrinkMethod), option);
  252 + if (string.IsNullOrWhiteSpace(fsp) || !int.TryParse(fsp, out fspint)) { fspint = 10; }
  253 +
  254 + SQLDataBaseManagerCore.ShrinkDB(sqld.SQLCS, shrinkmethod, fspint);
  255 + ColorConsole.WriteLine($"Database shrinked. Name:{sqld.DBName}", ConsoleColor.Green);
  256 + }
  257 + catch (Exception ex) { ColorConsole.WriteLine(ex.Message, ConsoleColor.Red); }
  258 + }
  259 + return o;
  260 + }
217 private static object RelocatePhysicalFiles(object parameter, object o) 261 private static object RelocatePhysicalFiles(object parameter, object o)
218 { 262 {
219 var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>(); 263 var config = (parameter as Menu.ExecutorParameter).GetConfig<SQLDataBaseManagerXmlProcessor>();
@@ -312,6 +356,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -312,6 +356,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
312 ColorConsole.WriteLine(" "); 356 ColorConsole.WriteLine(" ");
313 return " "; 357 return " ";
314 } 358 }
  359 + else if (lineix == 4)
  360 + {
  361 + var dbsize = SQLDataBaseManagerCore.GetSize(st.SQLCS);
  362 + ColorConsole.Write(dbsize, ConsoleColor.Yellow, prefix: "DB size:", suffix: " ");
  363 + ColorConsole.WriteLine(" ");
  364 + return " ";
  365 + }
315 return null; 366 return null;
316 } 367 }
317 #endregion private method: DisplayDataBaseInfo 368 #endregion private method: DisplayDataBaseInfo
@@ -329,6 +380,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -329,6 +380,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
329 sqld.PhysicalFilesDirectoryPath = GetPhysicalFilesLocation(sqld.SQLCS); 380 sqld.PhysicalFilesDirectoryPath = GetPhysicalFilesLocation(sqld.SQLCS);
330 sqld.DBName = GetDBName(sqld.SQLCS); 381 sqld.DBName = GetDBName(sqld.SQLCS);
331 sqld.DataSource = GetDataSource(sqld.SQLCS); 382 sqld.DataSource = GetDataSource(sqld.SQLCS);
  383 + sqld.SizeString = GetSize(sqld.SQLCS);
332 return sqld; 384 return sqld;
333 } 385 }
334 #endregion public CollectDataBaseInfo 386 #endregion public CollectDataBaseInfo
@@ -539,6 +591,47 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -539,6 +591,47 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
539 } 591 }
540 catch (Exception ex) { throw ex; } 592 catch (Exception ex) { throw ex; }
541 } 593 }
  594 +
  595 + public static void ShrinkDB(string sqlconnectionstring, ShrinkMethod shrinkmethod,int freespacepercent)
  596 + {
  597 + var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring);
  598 + var sc = new ServerConnection(sqlc);
  599 + var srvr = new Server(sc);
  600 + var db = new Database(srvr, GetDBName(sqlconnectionstring));
  601 + db.Shrink(freespacepercent, shrinkmethod);
  602 + }
  603 +
  604 + #region GetSize
  605 + /// <summary>
  606 + /// Visszadja a megadott adatbázis méretét
  607 + /// </summary>
  608 + /// <param name="sqlconnectionstring"></param>
  609 + /// <returns></returns>
  610 + public static string GetSize(string sqlconnectionstring)
  611 + {
  612 + var sqlc = new Microsoft.Data.SqlClient.SqlConnection(sqlconnectionstring);
  613 + var dbname = GetDBName(sqlconnectionstring);
  614 +
  615 + var getsizecmd = new Microsoft.Data.SqlClient.SqlCommand ("sp_spaceused", sqlc);
  616 + getsizecmd.CommandType = System.Data.CommandType.StoredProcedure;
  617 + sqlc.Open();
  618 + var reader = getsizecmd.ExecuteReader();
  619 +
  620 + if (reader.HasRows)
  621 + {
  622 + while (reader.Read())
  623 + {
  624 + var dbn = reader["database_name"];
  625 + var dbs = reader["database_size"];
  626 + if (Convert.ToString(dbn) == dbname) { return Convert.ToString(dbs); };
  627 + }
  628 + }
  629 + sqlc.Close();
  630 + sqlc.Dispose();
  631 + return "N/A";
  632 + }
  633 + #endregion GetSize
  634 +
542 #region GetPhysicalFilesLocation 635 #region GetPhysicalFilesLocation
543 /// <summary> 636 /// <summary>
544 /// Returns the physical path to the directory that holds the files of the database 637 /// Returns the physical path to the directory that holds the files of the database
@@ -564,7 +657,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -564,7 +657,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
564 #region DBSubstitution 657 #region DBSubstitution
565 public enum DBSubstitutionName 658 public enum DBSubstitutionName
566 { 659 {
567 - DATABASE,DATASOURCE,DBOTYPE,DBONAME,DBDATAGROUP,BACKUPTS, 660 + DATABASE,DATASOURCE,DBOTYPE,DBONAME,DBDATAGROUP,BACKUPTS,SHRINKOPTION,SHRINKFREESPACEPERCENT,
568 } 661 }
569 #endregion DBSubstitution 662 #endregion DBSubstitution
570 #region ExecuteSQLScript 663 #region ExecuteSQLScript
@@ -615,6 +708,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -615,6 +708,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
615 SQLBatchTxt += scriptline + "\r\n"; 708 SQLBatchTxt += scriptline + "\r\n";
616 } 709 }
617 } 710 }
  711 +
618 sqlc.Close(); 712 sqlc.Close();
619 if (DataSet != null && DataSet.Tables != null) 713 if (DataSet != null && DataSet.Tables != null)
620 { 714 {
@@ -628,6 +722,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -628,6 +722,12 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
628 } 722 }
629 else { return new ReturnInfoJSON() { ReturnValue = 0, ReturnMessage = null, }; } 723 else { return new ReturnInfoJSON() { ReturnValue = 0, ReturnMessage = null, }; }
630 } 724 }
  725 +
  726 +
  727 +
  728 +
  729 +
  730 +
631 private static System.Data.DataSet ExecuteSQLScriptBatch(Microsoft.Data.SqlClient.SqlConnection sqlc, string sqlbatchtxt, int commandtimeout) 731 private static System.Data.DataSet ExecuteSQLScriptBatch(Microsoft.Data.SqlClient.SqlConnection sqlc, string sqlbatchtxt, int commandtimeout)
632 { 732 {
633 var sqlcommand = sqlc.CreateCommand(); 733 var sqlcommand = sqlc.CreateCommand();
@@ -1005,6 +1105,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS @@ -1005,6 +1105,7 @@ namespace Vrh.Log4Pro.MaintenanceConsole.SQLDataBaseManagerNS
1005 public string DataSource; 1105 public string DataSource;
1006 public SQLDataBaseManagerCore.SQLDBStatus Status; 1106 public SQLDataBaseManagerCore.SQLDBStatus Status;
1007 public string PhysicalFilesDirectoryPath; 1107 public string PhysicalFilesDirectoryPath;
  1108 + public string SizeString;
1008 public string SQLCS 1109 public string SQLCS
1009 { 1110 {
1010 get { return XmlProcessing.ConnectionStringStore.GetSQL(this.Xml_SQLConnectionString); } 1111 get { return XmlProcessing.ConnectionStringStore.GetSQL(this.Xml_SQLConnectionString); }
Vrh.Log4Pro.MaintenanceConsole/Program.cs
@@ -35,7 +35,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -35,7 +35,6 @@ namespace Vrh.Log4Pro.MaintenanceConsole
35 { 35 {
36 static void Main(string[] args) 36 static void Main(string[] args)
37 { 37 {
38 -  
39 var forcedmodulekey = CommandLine.GetCommandLineArgument(args, CLP.CMD_MODULE); 38 var forcedmodulekey = CommandLine.GetCommandLineArgument(args, CLP.CMD_MODULE);
40 var commandmode = !string.IsNullOrEmpty(forcedmodulekey); 39 var commandmode = !string.IsNullOrEmpty(forcedmodulekey);
41 var silentmode = commandmode && !string.IsNullOrEmpty(CommandLine.GetCommandLineArgument(args, CLP.CMD_SILENT, switchtype: true)); 40 var silentmode = commandmode && !string.IsNullOrEmpty(CommandLine.GetCommandLineArgument(args, CLP.CMD_SILENT, switchtype: true));
@@ -113,7 +112,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -113,7 +112,8 @@ namespace Vrh.Log4Pro.MaintenanceConsole
113 112
114 // processor architecture 113 // processor architecture
115 ColorConsole.Write("Processors: "); 114 ColorConsole.Write("Processors: ");
116 - ColorConsole.Write(System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"), ConsoleColor.Yellow, bracket: "[]", prefix: "Architecture: ",suffix:", "); 115 + ColorConsole.Write(System.Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE"), ConsoleColor.Yellow, bracket: "[]", prefix: "Architecture: ");
  116 + ColorConsole.Write(Tools.GetOSType() ?? "N/A", ConsoleColor.Yellow, bracket: "[]", suffix: ", ");
117 foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get()) 117 foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
118 { 118 {
119 ColorConsole.Write(item["NumberOfProcessors"].ToString(), ConsoleColor.Yellow, bracket: "[]", prefix: "Physical:",suffix:", "); 119 ColorConsole.Write(item["NumberOfProcessors"].ToString(), ConsoleColor.Yellow, bracket: "[]", prefix: "Physical:",suffix:", ");
@@ -134,7 +134,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole @@ -134,7 +134,13 @@ namespace Vrh.Log4Pro.MaintenanceConsole
134 ColorConsole.Write(System.Environment.OSVersion.ServicePack, ConsoleColor.Yellow, bracket: "[]", prefix: "Service pack:", suffix: ","); 134 ColorConsole.Write(System.Environment.OSVersion.ServicePack, ConsoleColor.Yellow, bracket: "[]", prefix: "Service pack:", suffix: ",");
135 ColorConsole.Write(System.Environment.OSVersion.VersionString, ConsoleColor.Yellow, bracket: "[]", prefix: "Version string:"); 135 ColorConsole.Write(System.Environment.OSVersion.VersionString, ConsoleColor.Yellow, bracket: "[]", prefix: "Version string:");
136 ColorConsole.WriteLine(""); 136 ColorConsole.WriteLine("");
137 - ColorConsole.Write(Tools.OSFriendlyName(), ConsoleColor.Yellow, bracket: "[]", prefix: " Friendly name:"); 137 +
  138 + ColorConsole.Write("", ConsoleColor.Yellow, prefix: "OS Friendly name versions:");
  139 + string fnA = Tools.GetOSFriendlyNameA(); if (!string.IsNullOrWhiteSpace(fnA)) ColorConsole.Write(fnA, ConsoleColor.Yellow, bracket: "[]");
  140 + string fnB = Tools.GetOSFriendlyNameB(); if (!string.IsNullOrWhiteSpace(fnB) && fnB!=fnA) ColorConsole.Write(fnB, ConsoleColor.Yellow, bracket: "[]");
  141 + string fnC = Tools.GetOSFriendlyNameC(); if (!string.IsNullOrWhiteSpace(fnC) && fnC!=fnA && fnC!=fnB) ColorConsole.Write(fnC, ConsoleColor.Yellow, bracket: "[]");
  142 + if (string.IsNullOrWhiteSpace(fnA) && string.IsNullOrWhiteSpace(fnB) && string.IsNullOrWhiteSpace(fnC)) ColorConsole.Write("N/A", ConsoleColor.Yellow, bracket: "[]");
  143 + ColorConsole.WriteLine("");
138 ColorConsole.WriteLine(""); 144 ColorConsole.WriteLine("");
139 ColorConsole.WriteLine(""); 145 ColorConsole.WriteLine("");
140 } 146 }
Vrh.Log4Pro.MaintenanceConsole/Properties/AssemblyInfo.cs
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices; @@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
32 // You can specify all the values or you can default the Build and Revision Numbers 32 // You can specify all the values or you can default the Build and Revision Numbers
33 // by using the '*' as shown below: 33 // by using the '*' as shown below:
34 // [assembly: AssemblyVersion("1.0.*")] 34 // [assembly: AssemblyVersion("1.0.*")]
35 -[assembly: AssemblyVersion("1.3.0.0")]  
36 -[assembly: AssemblyFileVersion("1.3.0.0")] 35 +[assembly: AssemblyVersion("1.4.0.0")]
  36 +[assembly: AssemblyFileVersion("1.4.0.0")]
Vrh.Log4Pro.MaintenanceConsole/Vrh.Log4Pro.MaintenanceConsole.csproj
@@ -157,6 +157,7 @@ @@ -157,6 +157,7 @@
157 <Reference Include="Microsoft.SqlServer.WmiEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL"> 157 <Reference Include="Microsoft.SqlServer.WmiEnum, Version=16.200.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91, processorArchitecture=MSIL">
158 <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.WmiEnum.dll</HintPath> 158 <HintPath>..\packages\Microsoft.SqlServer.SqlManagementObjects.161.46041.41\lib\net462\Microsoft.SqlServer.WmiEnum.dll</HintPath>
159 </Reference> 159 </Reference>
  160 + <Reference Include="Microsoft.VisualBasic" />
160 <Reference Include="Microsoft.Web.Administration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL"> 161 <Reference Include="Microsoft.Web.Administration, Version=10.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
161 <HintPath>..\packages\Microsoft.Web.Administration.11.1.0\lib\netstandard1.5\Microsoft.Web.Administration.dll</HintPath> 162 <HintPath>..\packages\Microsoft.Web.Administration.11.1.0\lib\netstandard1.5\Microsoft.Web.Administration.dll</HintPath>
162 </Reference> 163 </Reference>