windows - Add-Member til WMI objekt bedste praksis?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skriver en funktion til at få Windows-versionen ved hjælp af WMI-objekt. Men jeg ønskede at tilføje Windows 10 ReleaseId ('1709') (fra en registreringsnøgle) til objektet.


Er det en dum idé? (Det virker, jeg ved bare ikke, om det er en smart ting at gøre.)


function Get-OSVersion {
    [version]$OSVersion = (Get-WmiObject -Class Win32\_OperatingSystem).Version

    if ($OSVersion.Major -ge '10') {
        $OSVersion | Add-Member -MemberType NoteProperty -Name ReleaseId -Value $([int]::Parse($(Get-ItemProperty -Path "Registry::HKEY\_LOCAL\_MACHINESOFTWAREMicrosoftWindows NTCurrentVersion" ReleaseId).ReleaseId)) -Force
    }

    return $OSVersion
}

$OSVersion = Get-OSVersion
if ($OSVersion -ge '6.1') {"At least Win7"} else {"Too old"}
if ($OSVersion.ReleaseID -ge '1703') {"At least 1703."} else {"Too old"}


Vil det også være uklogt at overskrive medlemmet 'Revision' (værdien er altid -1) i stedet for at tilføje et nyt medlem 'ReleaseId'?

Bedste reference


For at udvide min kommentar:



  Jeg vil ikke foreslå at ændre en wmi-klasse, som du ikke behøver, men du gør det ikke. Jeg ser ikke noget galt om din tilgang ud over at tilføje et medlem til en defineret standardbiblioteksklasse (System.Version]]) og laver en tal sammenligning imod en streng.



Det, jeg foreslår at gøre, er at skabe en [pscustomobject] med de medlemmer, du har brug for:


function Get-OSVersion {
    $OSVersion = [version](Get-CimInstance -ClassName Win32\_OperatingSystem).Version

    if ($OSVersion.Major -ge 10) {
        [pscustomobject]@{
            Version = $OSVersion
            ReleaseId = [int](Get-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftWindows NTCurrentVersion').ReleaseId
        }
    } else {
        [pscustomobject]@{
            Version = $OSVersion
        }
    }
}


I brug:


$OS = Get-OSVersion
if ($OS.Version -ge [version]'6.1') {
    'At least Win7'
} else {
    'Too old'
}
if ($OS.ReleaseId -ge 1703) {
    'At least 1703.'
} else {
    'Too old'
}





At tjene et alternativ: Brug en hashtable, da det ser ud til at du bare gør nøgle/værdi adgang og sammenligninger uden nogen metode implementering.


function Get-OSVersion {
    $OS = @{
        Version = [version](Get-CimInstance -ClassName Win32\_OperatingSystem).Version
    }

    if ($OS.Version.Major -ge 10) {
        $OS['ReleaseId'] = [int](Get-ItemProperty -Path 'HKLM:SOFTWAREMicrosoftWindows NTCurrentVersion').ReleaseId
    }

    return $OS
}

Andre referencer 1


Min anbefaling ville være at bruge beregnede egenskaber: [8]


function Get-OSVersion {
    Get-WmiObject -Class Win32\_OperatingSystem |
        Select-Object @{n='Version';e={[version]$\_.Version}},
            @{n='ReleaseId';e={
                if (([version]$\_.Version).Major -ge '10') {
                    [int](Get-ItemProperty 'HKLM:SOFTWAREMicrosoftWindows NTCurrentVersion').ReleaseId
                }
            }}
}