Замена на основе PowerShell для команд WMI - PullRequest
0 голосов
/ 23 июня 2019

У меня есть старый скрипт, один из первых, который я написал, когда впервые начал работать с Powershell.Он использует Get-CimInstance -ClassName Win32_ComputerSystem и Get-CimInstance -ClassName Win32_OperatingSystem.Вычистил его для использования на некоторых пользовательских системах, а затем обнаружил, что у некоторых пользователей есть какая-то странная проблема с разрешениями для WMI и они не могут использовать скрипт.Лично у меня никогда не возникало с этим проблем, и я никогда не думал, что кто-то еще это сделает.

Так что я хочу уйти от экземпляров WMI / CIM и заменить их на команду .NET или что-то еще для использования вскрипт PowerShell.Есть ли в скрипте что-то еще, кроме экземпляров WMI / CIM?Смотрите скрипт ниже, я хочу изменить

$Comp = (Get-CimInstance -ClassName Win32_ComputerSystem); 
$DRole =   ($Comp).DomainRole;
switch ($DRole)
{
    0 {$DominRole = 'Standalone Workstation'}
    1 {$DominRole = 'Member Workstation'}
    2 {$DominRole = 'Standalone Server'}
    3 {$DominRole = 'Member Server'}
    4 {$DominRole = 'Backup Domain Controller'}
    5 {$DominRole = 'Primary Domain Controller'}
}
$PhyMem = [string][math]::Round(($Comp).TotalPhysicalMemory/1GB, 1);
$FreePhyMem = [string][math]::Round((Get-CimInstance -ClassName Win32_OperatingSystem).FreePhysicalMemory/1024/1024, 1);
$cpux = (Get-WmiObject Win32_Processor).Name;
$GBMem = $PhyMem + ' GB Physical Memory (' + $FreePhyMem + ' GB Free)';
Return $DominRole + ' - ' + $GBMem + '/' + $cpux

1 Ответ

0 голосов
/ 24 июня 2019

Если вы используете хотя бы PowerShell 5.1, Get-ComputerInfo делает доступной большую часть этой информации.Вы можете увидеть соответствующие свойства, которые он предоставляет с ...

PS> Get-ComputerInfo -Property 'CsDomainRole', '*Memory*', '*Processor*'

В противном случае, вы можете использовать классы в System.Management пространстве имен для прямого запроса к WMI почти таким же образом Get-WmiObject будет под капотом ...

$selectedProperties = 'DomainRole', 'TotalPhysicalMemory'
# https://docs.microsoft.com/dotnet/api/system.management.selectquery
$query = New-Object -TypeName 'System.Management.SelectQuery' `
    -ArgumentList ('Win32_ComputerSystem', $null, $selectedProperties)
# https://docs.microsoft.com/dotnet/api/system.management.managementobjectsearcher
$searcher = New-Object -TypeName 'System.Management.ManagementObjectSearcher' `
    -ArgumentList $query

try
{
    # https://docs.microsoft.com/dotnet/api/system.management.managementobjectsearcher.get
    $results = $searcher.Get()
    # ManagementObjectCollection exposes an enumerator but not an indexer
    $computerSystem = $results | Select-Object -First 1

    $domainRole = $computerSystem['DomainRole']
    $totalPhysicalMemory = $computerSystem['TotalPhysicalMemory']

    # Do something with $domainRole and $totalPhysicalMemory...
    $domainRoleText = switch ($domainRole) {
        0 { 'Standalone Workstation'   ; break }
        1 { 'Member Workstation'       ; break }
        2 { 'Standalone Server'        ; break }
        3 { 'Member Server'            ; break }
        4 { 'Backup Domain Controller' ; break }
        5 { 'Primary Domain Controller'; break }
        default { $domainRole.ToString() }
    }
    $totalPhysicalMemoryGB = [Math]::Round($totalPhysicalMemory / 1GB, 1)
}
finally
{
    $computerSystem.Dispose()
    $results.Dispose()
    $searcher.Dispose()
}

Трудно понять, связана ли ваша проблема с самим WMI или с командлетами, которые обращаются к нему без подробностей.

...