我正在使用 powerShell Desired State Configuration 在服务器计算机上测试/设置 Windows 功能。我有 78 个 WindowsFeature 资源需要检查并在必要时安装。我观察到 LCM(本地配置管理器)执行和检查配置时 CPU 使用率很高。我进行了一些调查,发现 WMI 提供程序“deploymentprovider”是造成这种情况的原因,它是 ServerManager.DeploymentProvider.dll 的一部分,负责 WindowsFeature 资源。所以问题是,有没有人遇到过这个问题并以某种方式解决了它?
提前致谢。
答案1
78 个WindowsFeature
资源很多。您可以尝试使用Script
资源并自己编写代码(或创建自定义资源)来整合检查。大部分 CPU 时间可能都是开销,因此如果您一次检查所有 78 个资源,速度应该会快得多。
答案2
Configuration cWindowsFeatures {
param
(
[parameter(Mandatory=$true)]
$WindowsFeatures
)
Import-DscResource -ModuleName PSDesiredStateConfiguration
$i=0
foreach($WindowsFeature in $WindowsFeatures.keys)
{
$ResourceName="WindowsFeature$($i)"
WindowsFeature "$ResourceName"
{
Name = "$WindowsFeature"
Ensure = $WindowsFeatures["$WindowsFeature"][0]
IncludeAllSubFeature = $WindowsFeatures["$WindowsFeature"][1]
}
$i++
}
}
function Get-TargetResource
{
[CmdletBinding()]
[OutputType([System.Collections.Hashtable])]
param
(
[parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$Id,
[parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string[]]
$WindowsFeature
)
$retValue=@{}
$InstalledFeatures=(Get-WindowsFeature -Name $WindowsFeature | Where-Object {$_.InstallState -eq "Installed"}).Name
$retValue.WindowsFeature=$InstalledFeatures
return $retValue
}
function Set-TargetResource
{
[CmdletBinding()]
param
(
[parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$Id,
[parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string[]]
$WindowsFeature
)
Install-WindowsFeature -Name $WindowsFeature
}
# The Test-TargetResource cmdlet is used to validate if the role or feature is in a state as expected in the instance document.
function Test-TargetResource
{
[CmdletBinding()]
[OutputType([System.Boolean])]
param
(
[parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]
$Id,
[parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string[]]
$WindowsFeature
)
$return=$false
$InstalledFeatures=(Get-TargetResource -Id $Id -WindowsFeature $WindowsFeature).WindowsFeature
if($InstalledFeatures.Count -eq $WindowsFeature.Count)
{
Write-Verbose -Message "Seems like all features are already installed"
$return=$true
}
else
{
Write-Verbose -Message "Some features are still missing. It'll be necessary to installed them."
}
return $return
}
Export-ModuleMember -function Get-TargetResource, Set-TargetResource, Test-TargetResource
Configuration app0 {
param (
[parameter(Mandatory=$true)]
[string]$MachineName
)
Import-DscResource -ModuleNAme cCompositeConfigurationResources
Import-DscResource -ModuleName cPSDesiredStateConfiguration
Node $AllNodes.Where{$_.Nodename -eq "$MachineName"}.Nodename {
#region WindowsFeatures
cWindowsFeatures cWindowsFeatures0
{
WindowsFeatures=$Node.WindowsFeatures
}
#endregion WindowsFeatures
}
}
Configuration app1 {
param (
[parameter(Mandatory=$true)]
[string]$MachineName
)
Import-DscResource -ModuleName cPSDesiredStateConfiguration
Node $AllNodes.Where{$_.Nodename -eq "$MachineName"}.Nodename {
#region WindowsFeatures
cWindowsFeature cWindowsFeature0
{
ID = "cWindowsFeature0"
WindowsFeature=$Node.WindowsFeatures.Keys
}
#endregion WindowsFeatures
}
}
app0 -ConfigurationData $ConfigurationData -OutputPath C:\DSC0 -MachineName app1
app1 -ConfigurationData $ConfigurationData -OutputPath C:\DSC1 -MachineName app1
Start-DSCConfiguration -Path c:\dsc0 -Wait -Force
Start-Sleep 1
Start-DSCConfiguration -Wait -Force -UseExisting
(Get-DSCConfigurationStatus).DurationInSeconds
Start-DSCConfiguration -Path c:\dsc1 -Wait -Force
Start-Sleep 1
Start-DSCConfiguration -Wait -Force -UseExisting
(Get-DSCConfigurationStatus).DurationInSeconds
Directory: C:\DSC0
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 10/16/2015 2:23 PM 76182 app1.mof
Directory: C:\DSC1
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 10/16/2015 2:23 PM 5152 app1.mof
14
0
这是我的代码和最终测试结果。 find 示例测试资源的时间大约是 80 倍。因此,将资源数量保持在最低水平并在代码中处理所有内容是值得的。