Initial commit: IT Nexus Web-App
This commit is contained in:
267
agent-cs/Services/SystemInfoService.cs
Normal file
267
agent-cs/Services/SystemInfoService.cs
Normal file
@@ -0,0 +1,267 @@
|
||||
using ITNexusAgent.Models;
|
||||
using System.Diagnostics;
|
||||
using System.Management;
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Principal;
|
||||
using Microsoft.Win32;
|
||||
|
||||
namespace ITNexusAgent.Services;
|
||||
|
||||
public static class SystemInfoService
|
||||
{
|
||||
public static string GetHostname() => Environment.MachineName;
|
||||
|
||||
public static string GetDomain() =>
|
||||
Environment.UserDomainName != Environment.MachineName
|
||||
? Environment.UserDomainName
|
||||
: "";
|
||||
|
||||
public static string GetOs()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
|
||||
var name = key?.GetValue("ProductName")?.ToString() ?? "Windows";
|
||||
var build = key?.GetValue("CurrentBuildNumber")?.ToString();
|
||||
var ubr = key?.GetValue("UBR")?.ToString();
|
||||
|
||||
// Build >= 22000 = Windows 11 — Registry ProductName kann noch "Windows 10" sagen nach Upgrade
|
||||
if (build != null && int.TryParse(build, out var buildNum) && buildNum >= 22000)
|
||||
name = name.Replace("Windows 10", "Windows 11");
|
||||
|
||||
return build != null ? $"{name} (Build {build}.{ubr})" : name;
|
||||
}
|
||||
catch { return RuntimeInformation.OSDescription; }
|
||||
}
|
||||
|
||||
public static string GetOsVersion()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
|
||||
return key?.GetValue("CurrentBuildNumber")?.ToString() ?? Environment.OSVersion.Version.ToString();
|
||||
}
|
||||
catch { return Environment.OSVersion.Version.ToString(); }
|
||||
}
|
||||
|
||||
public static string GetIpAddress()
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (var iface in NetworkInterface.GetAllNetworkInterfaces())
|
||||
{
|
||||
if (iface.OperationalStatus != OperationalStatus.Up) continue;
|
||||
if (iface.NetworkInterfaceType == NetworkInterfaceType.Loopback) continue;
|
||||
var name = iface.Name.ToLower();
|
||||
if (name.Contains("virtual") || name.Contains("wsl") || name.Contains("vmware")) continue;
|
||||
|
||||
foreach (var addr in iface.GetIPProperties().UnicastAddresses)
|
||||
{
|
||||
if (addr.Address.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork) continue;
|
||||
var ip = addr.Address.ToString();
|
||||
if (ip.StartsWith("169.254") || ip.StartsWith("172.")) continue;
|
||||
return ip;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
return "";
|
||||
}
|
||||
|
||||
public static string GetMacAddress()
|
||||
{
|
||||
try
|
||||
{
|
||||
foreach (var iface in NetworkInterface.GetAllNetworkInterfaces())
|
||||
{
|
||||
if (iface.OperationalStatus != OperationalStatus.Up) continue;
|
||||
if (iface.NetworkInterfaceType == NetworkInterfaceType.Loopback) continue;
|
||||
var mac = iface.GetPhysicalAddress().ToString();
|
||||
if (mac.Length == 12)
|
||||
return string.Join(":", Enumerable.Range(0, 6).Select(i => mac.Substring(i * 2, 2)));
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
return "";
|
||||
}
|
||||
|
||||
public static string GetLastUser()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var searcher = new ManagementObjectSearcher("SELECT UserName FROM Win32_ComputerSystem");
|
||||
foreach (ManagementObject obj in searcher.Get())
|
||||
{
|
||||
var user = obj["UserName"]?.ToString();
|
||||
if (!string.IsNullOrEmpty(user))
|
||||
return user.Contains('\\') ? user.Split('\\')[1] : user;
|
||||
}
|
||||
// Fallback: letztes Profil
|
||||
using var key = Registry.LocalMachine.OpenSubKey(
|
||||
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI");
|
||||
return key?.GetValue("LastLoggedOnUser")?.ToString()?.Split('\\').LastOrDefault() ?? "";
|
||||
}
|
||||
catch { return ""; }
|
||||
}
|
||||
|
||||
public static (string Model, int Cores) GetCpuInfo()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var searcher = new ManagementObjectSearcher("SELECT Name, NumberOfCores FROM Win32_Processor");
|
||||
foreach (ManagementObject obj in searcher.Get())
|
||||
return (obj["Name"]?.ToString()?.Trim() ?? "", Convert.ToInt32(obj["NumberOfCores"]));
|
||||
}
|
||||
catch { }
|
||||
return ("", 0);
|
||||
}
|
||||
|
||||
public static double GetCpuUsage()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var counter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
|
||||
counter.NextValue();
|
||||
Thread.Sleep(800);
|
||||
return Math.Round(counter.NextValue(), 1);
|
||||
}
|
||||
catch { return 0; }
|
||||
}
|
||||
|
||||
public static (double Total, double Used) GetRamInfo()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var searcher = new ManagementObjectSearcher("SELECT TotalVisibleMemorySize, FreePhysicalMemory FROM Win32_OperatingSystem");
|
||||
foreach (ManagementObject obj in searcher.Get())
|
||||
{
|
||||
var total = Math.Round(Convert.ToDouble(obj["TotalVisibleMemorySize"]) / (1024 * 1024), 2);
|
||||
var free = Math.Round(Convert.ToDouble(obj["FreePhysicalMemory"]) / (1024 * 1024), 2);
|
||||
return (total, Math.Round(total - free, 2));
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
return (0, 0);
|
||||
}
|
||||
|
||||
public static (double Total, double Free) GetDiskInfo()
|
||||
{
|
||||
try
|
||||
{
|
||||
var drive = new DriveInfo("C");
|
||||
return (
|
||||
Math.Round(drive.TotalSize / (double)(1024 * 1024 * 1024), 2),
|
||||
Math.Round(drive.AvailableFreeSpace / (double)(1024 * 1024 * 1024), 2)
|
||||
);
|
||||
}
|
||||
catch { return (0, 0); }
|
||||
}
|
||||
|
||||
public static double GetUptimeHours()
|
||||
{
|
||||
try
|
||||
{
|
||||
var uptime = TimeSpan.FromMilliseconds(Environment.TickCount64);
|
||||
return Math.Round(uptime.TotalHours, 1);
|
||||
}
|
||||
catch { return 0; }
|
||||
}
|
||||
|
||||
public static int GetPendingUpdates()
|
||||
{
|
||||
try
|
||||
{
|
||||
var type = Type.GetTypeFromProgID("Microsoft.Update.Session");
|
||||
if (type == null) return 0;
|
||||
dynamic session = Activator.CreateInstance(type)!;
|
||||
var searcher = session.CreateUpdateSearcher();
|
||||
var result = searcher.Search("IsInstalled=0 and Type='Software'");
|
||||
return result.Updates.Count;
|
||||
}
|
||||
catch { return 0; }
|
||||
}
|
||||
|
||||
public static (bool Present, string Version, bool V2) GetTpmInfo()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var searcher = new ManagementObjectSearcher(@"root\CIMv2\Security\MicrosoftTpm",
|
||||
"SELECT * FROM Win32_Tpm");
|
||||
foreach (ManagementObject obj in searcher.Get())
|
||||
{
|
||||
var version = obj["SpecVersion"]?.ToString() ?? "";
|
||||
return (true, version, version.StartsWith("2.0"));
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
return (false, "", false);
|
||||
}
|
||||
|
||||
public static bool GetSecureBoot()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var key = Registry.LocalMachine.OpenSubKey(
|
||||
@"SYSTEM\CurrentControlSet\Control\SecureBoot\State");
|
||||
return Convert.ToInt32(key?.GetValue("UEFISecureBootEnabled") ?? 0) == 1;
|
||||
}
|
||||
catch { return false; }
|
||||
}
|
||||
|
||||
public static bool GetWin11Readiness(bool tpmV2, bool secureBoot, int cpuCores, double ramGb)
|
||||
{
|
||||
// Wenn bereits Win 11 läuft → immer true
|
||||
try
|
||||
{
|
||||
using var key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
|
||||
var build = key?.GetValue("CurrentBuildNumber")?.ToString();
|
||||
if (build != null && int.TryParse(build, out var b) && b >= 22000) return true;
|
||||
}
|
||||
catch { }
|
||||
return tpmV2 && secureBoot && cpuCores >= 2 && ramGb >= 4;
|
||||
}
|
||||
|
||||
public static string GetHardwareSerial()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_BIOS");
|
||||
foreach (ManagementObject obj in searcher.Get())
|
||||
return obj["SerialNumber"]?.ToString()?.Trim() ?? "";
|
||||
}
|
||||
catch { }
|
||||
return "";
|
||||
}
|
||||
|
||||
public static List<string> GetInstalledSoftware()
|
||||
{
|
||||
var apps = new HashSet<string>();
|
||||
var paths = new[]
|
||||
{
|
||||
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
|
||||
@"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
|
||||
};
|
||||
|
||||
foreach (var path in paths)
|
||||
{
|
||||
try
|
||||
{
|
||||
using var key = Registry.LocalMachine.OpenSubKey(path);
|
||||
if (key == null) continue;
|
||||
foreach (var subName in key.GetSubKeyNames())
|
||||
{
|
||||
using var sub = key.OpenSubKey(subName);
|
||||
var name = sub?.GetValue("DisplayName")?.ToString();
|
||||
if (string.IsNullOrWhiteSpace(name)) continue;
|
||||
if (System.Text.RegularExpressions.Regex.IsMatch(name, @"^KB\d+")) continue;
|
||||
apps.Add(name.Trim());
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
|
||||
return [.. apps.OrderBy(x => x).Take(100)];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user