// pc-atskaite.exe — nolasa datora dzelzi caur WMI un parāda īsu atskaiti kopēšanai. // Neko nesūta internetā, neko neinstalē, nestartējas automātiski, nelasa lietotāja failus. // Build (bez admin, .NET Framework 4 ir katrā Windows 10/11): // C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe /nologo /target:winexe /codepage:65001 // /r:System.Management.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll /out:pc-atskaite.exe pc-atskaite.cs using System; using System.Collections.Generic; using System.Drawing; using System.Globalization; using System.Management; using System.Text; using System.Windows.Forms; using Microsoft.Win32; [assembly: System.Reflection.AssemblyTitle("PC atskaite")] [assembly: System.Reflection.AssemblyProduct("PC būvētājs — madmax.lv/pcbuild")] [assembly: System.Reflection.AssemblyVersion("1.0.0.0")] static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } } class MainForm : Form { TextBox box; Button copyBtn; public MainForm() { Text = "PC atskaite — madmax.lv/pcbuild"; Width = 620; Height = 480; StartPosition = FormStartPosition.CenterScreen; Font = new Font("Segoe UI", 9.5f); var info = new Label(); info.Dock = DockStyle.Top; info.Height = 62; info.Padding = new Padding(10, 8, 10, 0); info.Text = "Nolasa tikai: CPU, GPU, RAM, mātesplati, diskus, monitoru un Windows versiju (caur WMI).\n" + "Nelasa lietotājvārdu, failus vai pārlūku. Nekas netiek sūtīts — tu pats nokopē tekstu un ielīmē lapā."; box = new TextBox(); box.Multiline = true; box.ReadOnly = true; box.Dock = DockStyle.Fill; box.ScrollBars = ScrollBars.Vertical; box.Font = new Font("Consolas", 10.5f); box.BackColor = Color.White; var bottom = new Panel(); bottom.Dock = DockStyle.Bottom; bottom.Height = 52; copyBtn = new Button(); copyBtn.Text = "Kopēt atskaiti"; copyBtn.Width = 160; copyBtn.Height = 34; copyBtn.Left = 10; copyBtn.Top = 9; copyBtn.Click += delegate { Clipboard.SetText(box.Text); copyBtn.Text = "Nokopēts ✓"; }; var hint = new Label(); hint.Text = "Ielīmē madmax.lv/pcbuild → “Uzlabot manu PC”"; hint.Left = 182; hint.Top = 17; hint.AutoSize = true; bottom.Controls.Add(copyBtn); bottom.Controls.Add(hint); Controls.Add(box); Controls.Add(info); Controls.Add(bottom); Shown += delegate { box.Text = "Nolasu…"; Application.DoEvents(); box.Text = Report.Build(); }; } } static class Report { static string Safe(Func f, string fallback) { try { var s = f(); return string.IsNullOrWhiteSpace(s) ? fallback : s; } catch { return fallback; } } public static string FirstError; // WMI is optional: on some PCs it is broken or blocked, so every field also has a non-WMI fallback. static List Q(string wql, string scope) { var list = new List(); Exception err = null; var t = new System.Threading.Thread(delegate () { try { using (var s = new ManagementObjectSearcher(scope ?? "root\\CIMV2", wql)) foreach (ManagementObject o in s.Get()) list.Add(o); } catch (Exception e) { err = e; } }); t.SetApartmentState(System.Threading.ApartmentState.MTA); t.IsBackground = true; t.Start(); if (!t.Join(15000)) err = new TimeoutException("WMI neatbild"); if (err != null) { list = new List(); if (FirstError == null && scope == null) FirstError = err.GetType().Name + ": " + err.Message.Trim(); } return list; } static string Reg(string path, string name) { try { using (var k = Registry.LocalMachine.OpenSubKey(path)) { var v = k == null ? null : k.GetValue(name); return v == null ? "" : v.ToString().Trim(); } } catch { return ""; } } [System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] class MEMSTATUS { public uint dwLength = 64; public uint dwMemoryLoad; public ulong ullTotalPhys, ullAvailPhys, ullTotalPageFile, ullAvailPageFile, ullTotalVirtual, ullAvailVirtual, ullAvailExtendedVirtual; } [System.Runtime.InteropServices.DllImport("kernel32.dll")] static extern bool GlobalMemoryStatusEx([System.Runtime.InteropServices.In, System.Runtime.InteropServices.Out] MEMSTATUS m); static string Str(ManagementObject o, string p) { try { var v = o[p]; return v == null ? "" : v.ToString().Trim(); } catch { return ""; } } static long Num(ManagementObject o, string p) { long n; return long.TryParse(Str(o, p), out n) ? n : 0; } static string Gb(long bytes) { return Math.Round(bytes / 1e9).ToString(CultureInfo.InvariantCulture) + " GB"; } public static string Build() { var lines = new List(); lines.Add("PC-ATSKAITE v1"); lines.Add("CPU: " + Safe(Cpu, "nav zināms")); lines.Add("GPU: " + Safe(Gpu, "nav zināms")); lines.Add("RAM: " + Safe(Ram, "nav zināms")); lines.Add("PLATE: " + Safe(Board, "nav zināms")); lines.Add("DISKI: " + Safe(Disks, "nav zināms")); lines.Add("PSU: nav zināms"); lines.Add("MONITORS: " + Safe(Monitor, "nav zināms")); lines.Add("OS: " + Safe(Os, "nav zināms")); if (FirstError != null) lines.Add("PIEZĪME: WMI nav pieejams (" + FirstError + "), dati nolasīti no reģistra."); return string.Join("\r\n", lines.ToArray()); } static string Cpu() { foreach (var o in Q("SELECT Name, NumberOfCores, NumberOfLogicalProcessors, MaxClockSpeed FROM Win32_Processor", null)) { var name = System.Text.RegularExpressions.Regex.Replace(Str(o, "Name"), "\\s+", " "); var ghz = (Num(o, "MaxClockSpeed") / 1000.0).ToString("0.0", CultureInfo.InvariantCulture); return name + " (" + Num(o, "NumberOfCores") + "c/" + Num(o, "NumberOfLogicalProcessors") + "t, " + ghz + " GHz)"; } var reg = System.Text.RegularExpressions.Regex.Replace(Reg("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0", "ProcessorNameString"), "\\s+", " "); return reg == "" ? null : reg + " (" + Environment.ProcessorCount + "t)"; } // AdapterRAM is 32-bit and caps at 4 GB, so read qwMemorySize from the display class key (no admin needed). static Dictionary RegistryVram() { var map = new Dictionary(StringComparer.OrdinalIgnoreCase); try { using (var cls = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}")) { if (cls == null) return map; foreach (var sub in cls.GetSubKeyNames()) { try { using (var k = cls.OpenSubKey(sub)) { if (k == null) continue; var desc = k.GetValue("DriverDesc") as string; var q = k.GetValue("HardwareInformation.qwMemorySize"); if (desc == null || q == null) continue; long v = q is byte[] ? BitConverter.ToInt64((byte[])q, 0) : Convert.ToInt64(q); if (!map.ContainsKey(desc) || map[desc] < v) map[desc] = v; } } catch { } } } } catch { } return map; } static string Gpu() { var vram = RegistryVram(); var parts = new List(); foreach (var o in Q("SELECT Name, AdapterRAM, DriverDate FROM Win32_VideoController", null)) { var name = Str(o, "Name"); if (name.IndexOf("Basic Display", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Remote", StringComparison.OrdinalIgnoreCase) >= 0 || name.IndexOf("Virtual", StringComparison.OrdinalIgnoreCase) >= 0) continue; long bytes = vram.ContainsKey(name) ? vram[name] : Num(o, "AdapterRAM"); var s = name; if (bytes >= 512L * 1024 * 1024) s += " " + Math.Round(bytes / 1073741824.0) + "GB"; var dd = Str(o, "DriverDate"); if (dd.Length >= 8) s += " (draiveris " + dd.Substring(0, 4) + "-" + dd.Substring(4, 2) + "-" + dd.Substring(6, 2) + ")"; parts.Add(s); } if (parts.Count == 0) foreach (var kv in vram) if (kv.Key.IndexOf("Basic", StringComparison.OrdinalIgnoreCase) < 0 && kv.Key.IndexOf("Virtual", StringComparison.OrdinalIgnoreCase) < 0) parts.Add(kv.Key + (kv.Value >= 512L * 1024 * 1024 ? " " + Math.Round(kv.Value / 1073741824.0) + "GB" : "")); return string.Join("; ", parts.ToArray()); } static string Ram() { long total = 0; int used = 0; long speed = 0; string type = ""; foreach (var o in Q("SELECT Capacity, Speed, ConfiguredClockSpeed, SMBIOSMemoryType FROM Win32_PhysicalMemory", null)) { total += Num(o, "Capacity"); used++; long sp = Num(o, "ConfiguredClockSpeed"); if (sp == 0) sp = Num(o, "Speed"); if (sp > speed) speed = sp; switch (Num(o, "SMBIOSMemoryType")) { case 20: type = "DDR"; break; case 21: type = "DDR2"; break; case 24: type = "DDR3"; break; case 26: type = "DDR4"; break; case 34: type = "DDR5"; break; } } if (total == 0) { var m = new MEMSTATUS(); if (!GlobalMemoryStatusEx(m) || m.ullTotalPhys == 0) return null; return Math.Round(m.ullTotalPhys / 1073741824.0) + " GB"; } long slots = 0; foreach (var o in Q("SELECT MemoryDevices FROM Win32_PhysicalMemoryArray", null)) slots += Num(o, "MemoryDevices"); var s = Math.Round(total / 1073741824.0) + " GB"; if (type != "") s += " " + type + (speed > 0 ? "-" + speed : ""); else if (speed > 0) s += " " + speed + " MHz"; s += ", " + used + "/" + (slots > 0 ? slots.ToString() : "?") + " sloti"; return s; } static string Board() { foreach (var o in Q("SELECT Manufacturer, Product FROM Win32_BaseBoard", null)) return (Str(o, "Manufacturer") + " " + Str(o, "Product")).Trim(); var b = (Reg("HARDWARE\\DESCRIPTION\\System\\BIOS", "BaseBoardManufacturer") + " " + Reg("HARDWARE\\DESCRIPTION\\System\\BIOS", "BaseBoardProduct")).Trim(); return b == "" ? null : b; } static string Disks() { var parts = new List(); foreach (var o in Q("SELECT MediaType, BusType, Size, FriendlyName FROM MSFT_PhysicalDisk", "root\\Microsoft\\Windows\\Storage")) { long bus = Num(o, "BusType"), media = Num(o, "MediaType"); if (bus == 7) continue; // USB string kind = bus == 17 ? "NVMe" : media == 4 ? "SSD" : media == 3 ? "HDD" : "disks"; parts.Add(kind + " " + Gb(Num(o, "Size"))); } long free = 0, size = 0; foreach (var d in System.IO.DriveInfo.GetDrives()) { try { if (d.DriveType == System.IO.DriveType.Fixed && d.IsReady) { free += d.TotalFreeSpace; size += d.TotalSize; } } catch { } } if (parts.Count == 0 && size > 0) parts.Add("disks " + Gb(size)); if (parts.Count == 0 && free == 0) return null; return string.Join(" + ", parts.ToArray()) + (free > 0 ? ", brīvi " + Gb(free) : ""); } static string Monitor() { foreach (var o in Q("SELECT CurrentHorizontalResolution, CurrentVerticalResolution, CurrentRefreshRate FROM Win32_VideoController", null)) { long w = Num(o, "CurrentHorizontalResolution"), h = Num(o, "CurrentVerticalResolution"), hz = Num(o, "CurrentRefreshRate"); if (w > 0) return w + "x" + h + (hz > 1 ? " @ " + hz + " Hz" : ""); } var b = Screen.PrimaryScreen.Bounds; return b.Width + "x" + b.Height; } static string Os() { foreach (var o in Q("SELECT Caption, BuildNumber FROM Win32_OperatingSystem", null)) return Str(o, "Caption").Replace("Microsoft ", "") + " (build " + Str(o, "BuildNumber") + ")"; var nt = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"; var name = Reg(nt, "ProductName"); var build = Reg(nt, "CurrentBuildNumber"); if (name == "") return null; // ProductName still says "Windows 10" on Windows 11; build 22000+ is Windows 11. int bn; if (int.TryParse(build, out bn) && bn >= 22000) name = name.Replace("Windows 10", "Windows 11"); return name + " (build " + build + ")"; } }