В чем разница между RestartRequired и RestartNeeded в выводе Get-WindowsOptionalFeature?

#powershell #dism

Вопрос:

Я запускаю следующее:

 Get-WindowsOptionalFeature -Online -FeatureName TelnetClient | ConvertTo-Json -Depth 100
 

Он выдает следующий результат:

 {
    "DisplayName":  "Telnet Client",
    "Description":  "Allows you to connect to other computers remotely.",
    "RestartRequired":  1,
    "CustomProperties":  [
                             {
                                 "Name":  "Description",
                                 "Value":  "Telnet Client uses the Telnet protocol to connect to a remote Telnet server and run applications on that server.",
                                 "Path":  "ServerComponent"
                             },
                             {
                                 "Name":  "DisplayName",
                                 "Value":  "Telnet Client",
                                 "Path":  "ServerComponent"
                             },
                             {
                                 "Name":  "Id",
                                 "Value":  "44",
                                 "Path":  "ServerComponent"
                             },
                             {
                                 "Name":  "Type",
                                 "Value":  "Feature",
                                 "Path":  "ServerComponent"
                             },
                             {
                                 "Name":  "UniqueName",
                                 "Value":  "Telnet-Client",
                                 "Path":  "ServerComponent"
                             },
                             {
                                 "Name":  "Major",
                                 "Value":  "10",
                                 "Path":  "ServerComponent\Version"
                             },
                             {
                                 "Name":  "Minor",
                                 "Value":  "0",
                                 "Path":  "ServerComponent\Version"
                             },
                             {
                                 "Name":  "Name",
                                 "Value":  "TelnetClient",
                                 "Path":  "ServerComponent\Deploys\Update"
                             }
                         ],
    "FeatureName":  "TelnetClient",
    "State":  0,
    "Path":  null,
    "Online":  true,
    "WinPath":  null,
    "SysDrivePath":  null,
    "RestartNeeded":  false,
    "LogPath":  "C:\Windows\Logs\DISM\dism.log",
    "ScratchDirectory":  null,
    "LogLevel":  2
}
 

Мой вопрос, в частности, заключается в том, в чем разница между «Требуется повторное запуск» и «Требуется повторное запуск»? Похоже, они оба касаются одной и той же темы. В чем именно разница между ними?

"RestartRequired" на самом деле это перечисление ( Microsoft.Dism.Commands.RestartType ) со значениями:

Имя Ценность
НЕТ 0
Возможный 1
Требуемый 2

(Жаль, что я все еще использую PowerShell 5.1, в котором отсутствует -EnumsAsStrings опция ConvertTo-Json , добавленная в PowerShell 6 и 7.)

Комментарии:

1. Ну, казалось бы RestartRequired , это более детализировано (3 варианта), чем RestartNeeded (2 варианта, правда или ложь)

2. @MathiasR.Jessen На моей машине Get-WindowsOptionalFeature -Online -FeatureName "Internet-Explorer-Optional-amd64" | ConvertTo-Json возвращает "RestartRequired": 2 ( 2 = Required ), но также "RestartNeeded": false . Эта точка данных, по-видимому, противоречит теории, которая RestartRequired является просто более детализированной версией RestartNeeded .

3. На самом деле, это называется DismRestartType

4. @Theo Так это называется в C API. В API PowerShell это называется Microsoft.Dism.Commands.RestartType . Об этом свидетельствует следующее: Get-WindowsOptionalFeature -Online -FeatureName TelnetClient | Select { $_.RestartRequired.GetType().FullName }

Ответ №1:

Короткий ответ: О таких функциях, TelnetClient которые возвращают [Microsoft.Dism.Commands.AdvancedFeatureObject] :

  • RestartRequired указывает, может ли потребоваться перезагрузка после установки или включения функции
  • RestartNeeded используется для отображения того, ожидает ли в настоящее время перезапуск функции.

Длинная версия: AdvancedFeatureObject Однако тип на самом деле никогда не получает это значение. Вместо этого свойство используется только Microsoft.Dism.Commands.ImageObject тем, из которого оно возвращается Enable/Disable-WindowsOptionalFeature . Например:

 # I already have it installed:
Get-WindowsOptionalFeature -Online -FeatureName 'TelnetClient' | fl FeatureName,State,Restart*

FeatureName      : TelnetClient
State            : Enabled
RestartNeeded    : False
RestartRequired  : Possible

# I remove it, and save the output:
$result = Get-WindowsOptionalFeature -Online -FeatureName 'TelnetClient'| 
    Disable-WindowsOptionalFeature

# Returns an ImageObject
($result|gm).TypeName
Microsoft.Dism.Commands.ImageObject

# RestartNeeded is set here
$result

Path          :
Online        : True
RestartNeeded : True

# It does not get set on the main object though (only State=Disabled):

FeatureName     : TelnetClient
State           : Disabled
RestartRequired : Possible
RestartNeeded   : False
 

Я думаю RestartNeeded , что свойство присутствует только в AdvancedFeatureObject связи с наследованием некоторого типа и на самом деле не является полезным свойством.