Introduction of tags
This commit is contained in:
@@ -68,6 +68,36 @@ namespace LD_SysInfo
|
||||
public string Publisher { get; set; }
|
||||
}
|
||||
|
||||
public class WindowsUpdate
|
||||
{
|
||||
[JsonProperty("hotFixID")]
|
||||
public string HotFixID { get; set; }
|
||||
|
||||
[JsonProperty("description")]
|
||||
public string Description { get; set; }
|
||||
|
||||
[JsonProperty("installedOn")]
|
||||
public string InstalledOn { get; set; }
|
||||
|
||||
[JsonProperty("installedBy")]
|
||||
public string InstalledBy { get; set; }
|
||||
}
|
||||
|
||||
public class AppXPackage
|
||||
{
|
||||
[JsonProperty("name")]
|
||||
public string Name { get; set; }
|
||||
|
||||
[JsonProperty("version")]
|
||||
public string Version { get; set; }
|
||||
|
||||
[JsonProperty("publisher")]
|
||||
public string Publisher { get; set; }
|
||||
|
||||
[JsonProperty("packageFullName")]
|
||||
public string PackageFullName { get; set; }
|
||||
}
|
||||
|
||||
public class DriveInfoSummary
|
||||
{
|
||||
[JsonProperty("name")]
|
||||
@@ -134,9 +164,21 @@ namespace LD_SysInfo
|
||||
[JsonProperty("lastBootTime")]
|
||||
public string LastBootTime { get; set; }
|
||||
|
||||
[JsonProperty("collectedAt")]
|
||||
public string CollectedAt { get; set; }
|
||||
|
||||
[JsonProperty("installedApplications")]
|
||||
public List<InstalledApplication> InstalledApplications { get; set; }
|
||||
|
||||
[JsonProperty("userInstalledApplications")]
|
||||
public List<InstalledApplication> UserInstalledApplications { get; set; } = new();
|
||||
|
||||
[JsonProperty("windowsUpdates")]
|
||||
public List<WindowsUpdate> WindowsUpdates { get; set; } = new();
|
||||
|
||||
[JsonProperty("appXPackages")]
|
||||
public List<AppXPackage> AppXPackages { get; set; } = new();
|
||||
|
||||
[JsonProperty("drives")]
|
||||
public List<DriveInfoSummary> Drives { get; set; } = new();
|
||||
|
||||
@@ -149,6 +191,9 @@ namespace LD_SysInfo
|
||||
|
||||
try
|
||||
{
|
||||
// Capture collection timestamp with timezone info
|
||||
sysInfo.CollectedAt = DateTimeOffset.Now.ToString("o");
|
||||
|
||||
sysInfo.Hostname = Environment.MachineName;
|
||||
sysInfo.OSName = GetOSFriendlyName();
|
||||
sysInfo.OSVersion = Environment.OSVersion.Version.ToString();
|
||||
@@ -166,6 +211,11 @@ namespace LD_SysInfo
|
||||
sysInfo.LastBootTime = GetLastBootTime();
|
||||
|
||||
PopulateDriveInfo(sysInfo);
|
||||
|
||||
// Populate new collections for comprehensive system information
|
||||
sysInfo.UserInstalledApplications = GetUserInstalledApplications();
|
||||
sysInfo.WindowsUpdates = GetInstalledPatches();
|
||||
sysInfo.AppXPackages = GetAppXPackages();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -303,7 +353,11 @@ namespace LD_SysInfo
|
||||
foreach (var obj in searcher.Get())
|
||||
{
|
||||
string lastBoot = obj["LastBootUpTime"]?.ToString();
|
||||
return ManagementDateTimeConverter.ToDateTime(lastBoot).ToString("o");
|
||||
// Convert to local time and ensure timezone info is preserved
|
||||
DateTime localBootTime = ManagementDateTimeConverter.ToDateTime(lastBoot);
|
||||
// Use DateTimeOffset to ensure timezone information is included
|
||||
DateTimeOffset bootTimeWithZone = new DateTimeOffset(localBootTime, TimeZoneInfo.Local.GetUtcOffset(localBootTime));
|
||||
return bootTimeWithZone.ToString("o");
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
@@ -341,5 +395,138 @@ namespace LD_SysInfo
|
||||
|
||||
return applications;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets user-context installed applications from HKEY_CURRENT_USER registry.
|
||||
/// </summary>
|
||||
public static List<InstalledApplication> GetUserInstalledApplications()
|
||||
{
|
||||
var applications = new List<InstalledApplication>();
|
||||
string registryKey = @"Software\Microsoft\Windows\CurrentVersion\Uninstall";
|
||||
|
||||
try
|
||||
{
|
||||
using var regKey = Registry.CurrentUser.OpenSubKey(registryKey);
|
||||
if (regKey == null) return applications;
|
||||
|
||||
foreach (string subKeyName in regKey.GetSubKeyNames())
|
||||
{
|
||||
using var subKey = regKey.OpenSubKey(subKeyName);
|
||||
string name = subKey?.GetValue("DisplayName")?.ToString();
|
||||
if (!string.IsNullOrWhiteSpace(name))
|
||||
{
|
||||
applications.Add(new InstalledApplication
|
||||
{
|
||||
Name = name,
|
||||
Version = subKey?.GetValue("DisplayVersion")?.ToString(),
|
||||
Publisher = subKey?.GetValue("Publisher")?.ToString()
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"❌ Failed to gather user-installed applications: {ex.Message}");
|
||||
}
|
||||
|
||||
return applications;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets Windows Updates and patches installed on the system using WMI.
|
||||
/// </summary>
|
||||
public static List<WindowsUpdate> GetInstalledPatches()
|
||||
{
|
||||
var patches = new List<WindowsUpdate>();
|
||||
|
||||
try
|
||||
{
|
||||
using var searcher = new ManagementObjectSearcher(
|
||||
"SELECT HotFixID, Description, InstalledOn, InstalledBy FROM Win32_QuickFixEngineering");
|
||||
|
||||
foreach (var obj in searcher.Get())
|
||||
{
|
||||
patches.Add(new WindowsUpdate
|
||||
{
|
||||
HotFixID = obj["HotFixID"]?.ToString(),
|
||||
Description = obj["Description"]?.ToString(),
|
||||
InstalledOn = obj["InstalledOn"]?.ToString(),
|
||||
InstalledBy = obj["InstalledBy"]?.ToString()
|
||||
});
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"❌ Failed to gather Windows Updates: {ex.Message}");
|
||||
}
|
||||
|
||||
return patches;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets Windows Store (AppX) packages installed on the system using WMI.
|
||||
/// Note: This may require elevated permissions for complete results.
|
||||
/// </summary>
|
||||
public static List<AppXPackage> GetAppXPackages()
|
||||
{
|
||||
var packages = new List<AppXPackage>();
|
||||
|
||||
try
|
||||
{
|
||||
// Try using Win32_InstalledStoreProgram (Windows 10+)
|
||||
using var searcher = new ManagementObjectSearcher(
|
||||
"SELECT Name, Version, Publisher FROM Win32_InstalledStoreProgram");
|
||||
|
||||
foreach (var obj in searcher.Get())
|
||||
{
|
||||
var name = obj["Name"]?.ToString();
|
||||
if (!string.IsNullOrWhiteSpace(name))
|
||||
{
|
||||
packages.Add(new AppXPackage
|
||||
{
|
||||
Name = name,
|
||||
Version = obj["Version"]?.ToString(),
|
||||
Publisher = obj["Publisher"]?.ToString(),
|
||||
PackageFullName = name // Win32_InstalledStoreProgram doesn't provide PackageFullName
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"❌ Failed to gather AppX packages: {ex.Message}");
|
||||
}
|
||||
|
||||
return packages;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if a specific Windows Update patch is installed on the system.
|
||||
/// </summary>
|
||||
/// <param name="kbNumber">The KB number to check (e.g., "KB5034441")</param>
|
||||
/// <returns>True if the patch is installed, false otherwise</returns>
|
||||
public static bool IsPatchInstalled(string kbNumber)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(kbNumber))
|
||||
return false;
|
||||
|
||||
try
|
||||
{
|
||||
// Normalize KB number format
|
||||
string normalizedKB = kbNumber.ToUpper().Trim();
|
||||
if (!normalizedKB.StartsWith("KB"))
|
||||
normalizedKB = "KB" + normalizedKB;
|
||||
|
||||
using var searcher = new ManagementObjectSearcher(
|
||||
$"SELECT HotFixID FROM Win32_QuickFixEngineering WHERE HotFixID = '{normalizedKB}'");
|
||||
|
||||
return searcher.Get().Count > 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"❌ Failed to check patch {kbNumber}: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user