如何使用dism.exe检查Windows功能是否在Windows7上开启on/off?

How to use dism.exe to check whether Windows Features are turned on/off on Windows 7?

我使用Get-WindowsOptionalFeature查看Windows功能是否开启on/off成功,但是Windows7不支持该指令

$IIS_InstallPro = "IIS-WebServerRole","IIS-WebServer","IIS-CommonHttpFeatures","IIS-HttpErrors"

#$features = Get-WindowsOptionalFeature -Online -FeatureName IIS*
$features = Dism /Online /Get-Features

function CheckIIS{
    foreach($feature in $features)
    {
        if($feature.State -eq "Disabled" -and $IIS_InstallPro -match $feature.FeatureNmae)
        {
           return $False
        }   
    }
    return $true
}
CheckIIS

我应该使用 dism.exe 检查并 return 结果吗? 想知道这样做是否是好的做法以及最好的做法是什么?

不,没有办法让这些 cmdlet 在 Windows 7 上运行。

虽然您确实不应该再使用 Windows 7,但您仍然应该能够从 WMI 获取此信息。我不记得 Get-CimInstnace cmdlet 在 7 上是否可用,所以我将使用 Get-WmiObject 方法:

Function Get-WmiWindowsOptionalFeatures {
  [CmdletBinding()]
  Param(
    [string]$FeatureName,
    [ValidateSet('Enabled', 'Disabled', 'Absent', 'Unknown', '1', '2', '3', '4')]
    [string]$InstallState
  )

  Get-WmiObject Win32_OptionalFeature | Where-Object {
    $feature = $_

    $featureMatch = !$FeatureName -or ( $FeatureName -and $feature.Name -like $FeatureName )
    
    $installStateMatch = switch ( $InstallState ) {

      { $_ -in 'Enabled', '1' } {
        $feature.InstallState -eq 1
        break
      }

      { $_ -in 'Disabled', '2' } {
        $feature.InstallState -eq 2
        break
      }

      { $_ -in 'Absent', '3' } {
        $feature.InstallState -eq 3
        break
      }

      { $_ -in 'Unknown', '4' } {
        $feature.InstallState -eq 4
        break
      }

      default {
        $true
        break
      }
    }

    $featureMatch -and $installStateMatch
    
  } | Select-Object Name, Caption, Description, InstallDate, @{
    Label      = 'InstallState'
    Expression = {

      switch ( $_.InstallState ) {

        1 {
          'Enabled'
          break
        }

        2 {
          'Disabled'
          break
        }

        3 {
          'Absent'
          break
        }

        4 {
          'Unknown'
          break
        }

        default {
          $_.ToString()
          break
        }
      }
    }
  }
}

这会给你一个很好的可操作对象,其中包含可以评估和操作的重要字段。您必须检查的 class 是 Win32_OptionalFeatures.

要使用函数:

  • 无参数:returns 所有特征
  • -FeatureName:returns 个特征匹配 Name。支持 -like 模式。
  • -InstallState:returns 个特征匹配 InstallState。采用方便的字符串或下面映射的编号值。

要了解安装状态,以下是每个可能的值(它们存储为 uint32):

  1. 已启用
  2. 已禁用
  3. 缺席
  4. 未知

遗憾的是,无法使用 WMI 安装 功能,因此您必须使用 dism.exe.

安装它们