From 11390a9d832eaa1a1ac8b669084a34ee1a480d2c Mon Sep 17 00:00:00 2001 From: Esdras Renan Date: Mon, 13 Oct 2025 19:42:19 -0300 Subject: [PATCH] =?UTF-8?q?Enriquece=20invent=C3=A1rio=20do=20Windows=20e?= =?UTF-8?q?=20layout=20dos=20cards?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/desktop/src-tauri/src/agent.rs | 27 ++++++--- .../machines/admin-machines-overview.tsx | 56 ++++++++++++------- 2 files changed, 56 insertions(+), 27 deletions(-) diff --git a/apps/desktop/src-tauri/src/agent.rs b/apps/desktop/src-tauri/src/agent.rs index 0b4d369..f7ea877 100644 --- a/apps/desktop/src-tauri/src/agent.rs +++ b/apps/desktop/src-tauri/src/agent.rs @@ -693,19 +693,30 @@ fn collect_windows_extended() -> serde_json::Value { // Informações de build/edição e ativação let os_info = ps(r#" $cv = Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion'; + $os = Get-CimInstance Win32_OperatingSystem -ErrorAction SilentlyContinue; $lsItems = Get-CimInstance -Query "SELECT Name, LicenseStatus, PartialProductKey FROM SoftwareLicensingProduct WHERE PartialProductKey IS NOT NULL" | Where-Object { $_.Name -like 'Windows*' }; $activatedItem = $lsItems | Where-Object { $_.LicenseStatus -eq 1 } | Select-Object -First 1; $primaryItem = if ($activatedItem) { $activatedItem } else { $lsItems | Select-Object -First 1 }; $lsCode = if ($primaryItem -and $primaryItem.LicenseStatus -ne $null) { [int]$primaryItem.LicenseStatus } else { 0 }; [PSCustomObject]@{ - ProductName = $cv.ProductName - CurrentBuild = $cv.CurrentBuild - CurrentBuildNumber = $cv.CurrentBuildNumber - DisplayVersion = $cv.DisplayVersion - ReleaseId = $cv.ReleaseId - EditionID = $cv.EditionID - LicenseStatus = $lsCode - IsActivated = ($activatedItem -ne $null) + ProductName = $cv.ProductName + CurrentBuild = $cv.CurrentBuild + CurrentBuildNumber = $cv.CurrentBuildNumber + DisplayVersion = $cv.DisplayVersion + ReleaseId = $cv.ReleaseId + EditionID = $cv.EditionID + UBR = $cv.UBR + CompositionEditionID = $cv.CompositionEditionID + InstallationType = $cv.InstallationType + InstallDate = $cv.InstallDate + InstallationDate = $os.InstallDate + InstalledOn = $os.InstallDate + Version = $os.Version + BuildNumber = $os.BuildNumber + Caption = $os.Caption + FeatureExperiencePack = $cv.FeatureExperiencePack + LicenseStatus = $lsCode + IsActivated = ($activatedItem -ne $null) } "#).unwrap_or_else(|| json!({})); diff --git a/src/components/admin/machines/admin-machines-overview.tsx b/src/components/admin/machines/admin-machines-overview.tsx index ff8c44d..40d5d40 100644 --- a/src/components/admin/machines/admin-machines-overview.tsx +++ b/src/components/admin/machines/admin-machines-overview.tsx @@ -202,6 +202,14 @@ function readNumber(record: Record, ...keys: string[]): number return undefined } +function readText(record: Record, ...keys: string[]): string | undefined { + const stringValue = readString(record, ...keys) + if (stringValue) return stringValue + const numberValue = readNumber(record, ...keys) + if (typeof numberValue === "number") return String(numberValue) + return undefined +} + function parseWindowsInstallDate(value: unknown): Date | null { if (!value) return null if (value instanceof Date) return value @@ -265,6 +273,7 @@ type WindowsOsInfo = { editionId?: string displayVersion?: string releaseId?: string + version?: string currentBuild?: string currentBuildNumber?: string licenseStatus?: number @@ -278,26 +287,32 @@ function parseWindowsOsInfo(raw: unknown): WindowsOsInfo | null { const parseRecord = (value: Record) => { const read = (k: string, ...alts: string[]) => readString(value, k, ...alts) const readNum = (...keys: string[]) => readNumber(value, ...keys) + const readFlexible = (...keys: string[]) => readText(value, ...keys) + + const family = read("Family") + const edition = read("Edition") const productName = - read("ProductName", "productName", "Name", "name") ?? - (read("Family") && read("Edition") ? `${read("Family")} ${read("Edition")}` : undefined) + readFlexible("ProductName", "productName", "Name", "name", "Caption", "caption") ?? + (family && edition ? `${family} ${edition}` : family ?? edition ?? undefined) const editionId = - read("EditionID", "editionId", "Edition", "edition", "SkuEdition", "skuEdition") ?? undefined + readFlexible("EditionID", "editionId", "Edition", "edition", "SkuEdition", "skuEdition", "CompositionEditionID", "compositionEditionId") ?? + undefined - const displayVersion = - read("DisplayVersion", "displayVersion", "Version", "version") ?? - read("ReleaseId", "releaseId") + const displayVersion = readFlexible("DisplayVersion", "displayVersion") + const versionValue = + readFlexible("Version", "version", "ReleaseId", "releaseId") ?? displayVersion const baseBuild = - read("CurrentBuildNumber", "currentBuildNumber", "CurrentBuild", "currentBuild", "OSBuild", "osBuild") ?? + readFlexible("CurrentBuildNumber", "currentBuildNumber", "CurrentBuild", "currentBuild", "OSBuild", "osBuild", "BuildNumber", "buildNumber") ?? undefined - const ubr = read("UBR") ?? (readNum("UBR") ? String(readNum("UBR")) : undefined) - const currentBuildNumber = baseBuild ? (ubr && /^\d+$/.test(ubr) ? `${baseBuild}.${ubr}` : baseBuild) : undefined + const ubrRaw = readFlexible("UBR") + const licenseStatus = readNum("LicenseStatus", "licenseStatus") + const currentBuildNumber = + baseBuild && ubrRaw && /^\d+$/.test(ubrRaw) ? `${baseBuild}.${ubrRaw}` : baseBuild ?? readFlexible("BuildNumber", "buildNumber") const currentBuild = baseBuild - const licenseStatus = readNum("LicenseStatus", "licenseStatus") const isActivatedRaw = value["IsActivated"] ?? value["isActivated"] const isActivated = typeof isActivatedRaw === "boolean" @@ -313,13 +328,14 @@ function parseWindowsOsInfo(raw: unknown): WindowsOsInfo | null { parseWindowsInstallDate(value["InstalledOn"]) const experience = - read("Experience", "experience", "FeatureExperiencePack", "featureExperiencePack") ?? + readFlexible("Experience", "experience", "FeatureExperiencePack", "featureExperiencePack") ?? (currentBuildNumber ? `OS Build ${currentBuildNumber}` : undefined) return { productName, editionId, displayVersion, + version: versionValue, releaseId: read("ReleaseId", "releaseId"), currentBuild, currentBuildNumber, @@ -845,7 +861,7 @@ export function MachineDetails({ machine }: MachineDetailsProps) { return [] }, [windowsSoftwareRaw]) const windowsEditionLabel = windowsOsInfo?.productName ?? windowsOsInfo?.editionId ?? null - const windowsVersionLabel = windowsOsInfo?.displayVersion ?? windowsOsInfo?.releaseId ?? null + const windowsVersionLabel = windowsOsInfo?.displayVersion ?? windowsOsInfo?.version ?? windowsOsInfo?.releaseId ?? null const windowsBuildLabel = windowsOsInfo?.currentBuildNumber ?? windowsOsInfo?.currentBuild ?? null const windowsInstallDateLabel = windowsOsInfo?.installDate ? formatAbsoluteDateTime(windowsOsInfo.installDate) : null const windowsExperienceLabel = windowsOsInfo?.experience ?? null @@ -1487,12 +1503,12 @@ export function MachineDetails({ machine }: MachineDetailsProps) { -
-

Windows

-

+

+

Windows

+

{windowsEditionLabel ?? machine?.osName ?? "—"}

-

+

{windowsVersionLabel ?? windowsBuildLabel ?? "Versão desconhecida"}

@@ -1501,9 +1517,11 @@ export function MachineDetails({ machine }: MachineDetailsProps) { -
-

GPU

-

{(windowsPrimaryGpu ?? primaryGpu)?.name ?? "—"}

+
+

GPU

+

+ {(windowsPrimaryGpu ?? primaryGpu)?.name ?? "—"} +