【问题标题】:How to use dism.exe to check whether Windows Features are turned on/off on Windows 7?如何使用 dism.exe 检查 Windows 功能是否在 Windows 7 上打开/关闭?
【发布时间】:2023-04-01 15:03:01
【问题描述】:

我使用Get-WindowsOptionalFeature来检查Windows功能是否开启/关闭成功,但Windows 7不支持该指令。

$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 来检查并返回结果吗? 想知道这样做是否是一种好习惯以及最好的方法是什么?

【问题讨论】:

  • January, 2020 以来,Windows 7 已完全失去支持,并且不会再收到安全补丁。考虑改为更新到受支持的版本。更重要的是,这个问题是题外话,因为它是关于如何在 SuperUser 上管理操作系统功能和更好的话题。
  • 虽然我同意 OP 应该使用受支持的操作系统,但我不同意这不是 Stack Overflow 的主题。从软件工程的角度来看,OP 想要使用的 API 在较旧的运行时中不可用,他们想了解如何在自己的限制范围内解决他们的问题。他们可能在Super User 有更好的受众,但尤其是在涉及到 shell 语言时,在以编程方式访问操作系统功能、运行外部命令以及自动化期间或内部常用实用程序的问题方面存在一些可接受的软件主题重叠软件开发生命周期。

标签: powershell windows-7 dism


【解决方案1】:

不,没有办法让这些 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
        }
      }
    }
  }
}

这将为您返回一个很好的可操作对象,其中包含可以评估和操作的重要字段。您必须检查的课程是Win32_OptionalFeatures

使用功能:

  • 无参数:返回所有特征
  • -FeatureName:返回与Name 匹配的特征。支持-like 模式。
  • -InstallState:返回与InstallState 匹配的特征。采用方便的字符串或编号值,如下图所示。

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

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

很遗憾,无法使用 WMI 来安装这些功能,因此您必须使用dism.exe 安装它们。

【讨论】:

  • 谢谢!我的主要难题是检查 Windows 功能的启动状态。安装不难,你的回答完美解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2016-05-16
相关资源
最近更新 更多