PowerShell/WMI电源管理

PowerShell/WMI电源管理,powershell,wmi,power-management,wmi-query,Powershell,Wmi,Power Management,Wmi Query,我是Windows电源管理新手,甚至是WMI新手,但始终欢迎有学习机会 使用PowerShell和WMI,我想将“高性能”电源计划的“盖关闭操作”、“电源按钮操作”和“睡眠按钮操作”设置为“不做任何事情”选项,最后将活动电源计划设置为“高性能”电源计划。我有一个有效的解决办法,但我怀疑这是否是一个适当的解决办法 我的问题的关键是,所有的计划、子组、操作、可用值等都是用guid标识的,我已经了解到这些guid可能会因系统而异(特别是通过组策略应用的情况下)。在我的解决方案中,我设法避免硬编码gui

我是Windows电源管理新手,甚至是WMI新手,但始终欢迎有学习机会

使用PowerShell和WMI,我想将“高性能”电源计划的“盖关闭操作”、“电源按钮操作”和“睡眠按钮操作”设置为“不做任何事情”选项,最后将活动电源计划设置为“高性能”电源计划。我有一个有效的解决办法,但我怀疑这是否是一个适当的解决办法

我的问题的关键是,所有的计划、子组、操作、可用值等都是用guid标识的,我已经了解到这些guid可能会因系统而异(特别是通过组策略应用的情况下)。在我的解决方案中,我设法避免硬编码guid,但最终只会导致硬编码值,例如“电源和盖按钮”、“盖关闭操作”、“不做任何事情”等,在非英语版本的Windows中可能会有所不同,也可能不会有所不同。(顺便说一下,我使用的是Windows 8.1。)

我的问题 以编程方式发现每个计划、子组、操作、可用值等的GUID的正确方法是什么

参考文献 使用powercfg.exe工具批处理时,命令如下:

:: Set the lid close action, power button action and sleep button action to do nothing

powercfg /SETACVALUEINDEX 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 4f971e89-eebd-4455-a8de-9e59040e7347 5ca83367-6e45-459f-a27b-476b1d01c936 0
powercfg /SETDCVALUEINDEX 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 4f971e89-eebd-4455-a8de-9e59040e7347 5ca83367-6e45-459f-a27b-476b1d01c936 0
powercfg /SETACVALUEINDEX 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 4f971e89-eebd-4455-a8de-9e59040e7347 7648efa3-dd9c-4e3e-b566-50f929386280 0
powercfg /SETDCVALUEINDEX 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 4f971e89-eebd-4455-a8de-9e59040e7347 7648efa3-dd9c-4e3e-b566-50f929386280 0
powercfg /SETACVALUEINDEX 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 4f971e89-eebd-4455-a8de-9e59040e7347 96996bc0-ad50-47ec-923b-6f41874dd9eb 0
powercfg /SETDCVALUEINDEX 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c 4f971e89-eebd-4455-a8de-9e59040e7347 96996bc0-ad50-47ec-923b-6f41874dd9eb 0
powercfg /SETACTIVE 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c
我的PowerShell/WMI解决方案是:

$CommonArgs = @{"namespace"="root\cimv2\power"}
$CommonArgs += $PSBoundParameters

function Set-PowerSettingDataIndexValue
{
    <#
    .Synopsis
        Sets the value associated with a specified power setting for both AC and DC power.
    .Description
        This function is somewhat similar to running the two commands
        'POWERCFG /SETACVALUEINDEX <SCHEME_GUID> <SUB_GUID> <SETTING_GUID> <SETTING_INDEX>'
        and
        'POWERCFG /SETDCVALUEINDEX <SCHEME_GUID> <SUB_GUID> <SETTING_GUID> <SETTING_INDEX>'
        except that the <SUB_GUID> is implied by the $PowerSettingDefinitionGuid
    .Example
        Set-PowerSettingDataIndexValue "{8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c}" "{7648efa3-dd9c-4e3e-b566-50f929386280}" 3
    #>

    [CmdletBinding()]
    param (
        [parameter(Mandatory=$true)]
        [string]$PowerPlanGuid,
        [parameter(Mandatory=$true)]
        [string]$PowerSettingDefinitionGuid,
        [parameter(Mandatory=$true)]
        [string]$SettingIndexValue
    )

    $PowerSettingDataIndexAC = Get-CimInstance -ClassName Win32_PowerSettingDataIndex -Filter "InstanceID = 'Microsoft:PowerSettingDataIndex\\$PowerPlanGuid\\AC\\$PowerSettingDefinitionGuid'" @CommonArgs
    Set-CimInstance -InputObject $PowerSettingDataIndexAC -Property @{ SettingIndexValue=$SettingIndexValue }

    $PowerSettingDataIndexDC = Get-CimInstance -ClassName Win32_PowerSettingDataIndex -Filter "InstanceID = 'Microsoft:PowerSettingDataIndex\\$PowerPlanGuid\\DC\\$PowerSettingDefinitionGuid'" @CommonArgs
    Set-CimInstance -InputObject $PowerSettingDataIndexDC -Property @{ SettingIndexValue=$SettingIndexValue }
}

function Set-PowerButtonAndLidActions
{
    <#
    .Synopsis
        Sets the power button, sleep button and lid actions to do nothing effectively disabling these buttons.
    .Description
        This function modifies every existing power plan to effectively disable the power button, sleep button and
        lid action. Additonally this function will set the "high performance" power plan as the active power plan.
    .Example
        Set-PowerButtonAndLidActions
    #>

    # Get the power setting subgroup where the element name is 'Power buttons and lid'
    $PowerSettingSubgroup = Get-CimInstance -ClassName Win32_PowerSettingSubgroup -Filter "ElementName = 'Power buttons and lid'" @CommonArgs

    # Get the power setting definitions for 'Lid close action', 'Power button action' and 'Sleep button action'
    $PowerSettingDefinitionLidCloseAction = Get-CimAssociatedInstance -InputObject $PowerSettingSubgroup | where { $_.ElementName -eq "Lid close action" }
    $PowerSettingDefinitionPowerButtonAction = Get-CimAssociatedInstance -InputObject $PowerSettingSubgroup | where { $_.ElementName -eq "Power button action" }
    $PowerSettingDefinitionSleepButtonAction = Get-CimAssociatedInstance -InputObject $PowerSettingSubgroup | where { $_.ElementName -eq "Sleep button action" }

    # Extract the GUID from each action's instance ID
    $PowerSettingDefinitionLidCloseActionGuid = $PowerSettingDefinitionLidCloseAction.InstanceID -replace '.*({[^}]+})', '$1'
    $PowerSettingDefinitionPowerButtonActionGuid = $PowerSettingDefinitionPowerButtonAction.InstanceID -replace '.*({[^}]+})', '$1'
    $PowerSettingDefinitionSleepButtonActionGuid = $PowerSettingDefinitionSleepButtonAction.InstanceID -replace '.*({[^}]+})', '$1'

    # Get the value of the 'Do Nothing' option for each power setting definition
    $LidCloseActionDoNothing = Get-CimInstance -Query "SELECT * FROM Win32_PowerSettingDefinitionPossibleValue WHERE ElementName = 'Do nothing' AND InstanceID LIKE '%\\$PowerSettingDefinitionLidCloseActionGuid\\%'" @CommonArgs
    $PowerButtonActionDoNothing = Get-CimInstance -Query "SELECT * FROM Win32_PowerSettingDefinitionPossibleValue WHERE ElementName = 'Do nothing' AND InstanceID LIKE '%\\$PowerSettingDefinitionPowerButtonActionGuid\\%'" @CommonArgs
    $SleepButtonActionDoNothing = Get-CimInstance -Query "SELECT * FROM Win32_PowerSettingDefinitionPossibleValue WHERE ElementName = 'Do nothing' AND InstanceID LIKE '%\\$PowerSettingDefinitionSleepButtonActionGuid\\%'" @CommonArgs

    $p = Get-CimInstance -ClassName Win32_PowerPlan -Filter "ElementName = 'High performance'" @CommonArgs

    # Extract the GUID from the power plan's InstanceID property
    $PlanGuid = $p.InstanceID -replace '.*({[^}]+})', '$1'

    Set-PowerSettingDataIndexValue -PowerPlanGuid $PlanGuid -PowerSettingDefinitionGuid $PowerSettingDefinitionLidCloseActionGuid $LidCloseActionDoNothing.SettingIndex
    Set-PowerSettingDataIndexValue -PowerPlanGuid $PlanGuid -PowerSettingDefinitionGuid $PowerSettingDefinitionPowerButtonActionGuid $PowerButtonActionDoNothing.SettingIndex
    Set-PowerSettingDataIndexValue -PowerPlanGuid $PlanGuid -PowerSettingDefinitionGuid $PowerSettingDefinitionSleepButtonActionGuid $SleepButtonActionDoNothing.SettingIndex

    Invoke-CimMethod -InputObject $p -MethodName Activate | Out-Null
}

Set-PowerButtonAndLidActions
$CommonArgs=@{“命名空间”=“根目录\cimv2\power”}
$CommonArgs+=$PSBoundParameters
函数集PowerSettingDataIndexValue
{
[CmdletBinding()]
param(
[参数(必需=$true)]
[字符串]$PowerPlanGuid,
[参数(必需=$true)]
[字符串]$PowerSettingDefinitionGuid,
[参数(必需=$true)]
[字符串]$SettingIndexValue
)
$PowerSettingDataIndexAC=Get-CimInstance-ClassName Win32_PowerSettingDataIndex-Filter“InstanceID='Microsoft:PowerSettingDataIndex\\$PowerPlanGuid\\AC\\\$PowerSettingDefinitionGuid'”@CommonArgs
设置CimInstance-InputObject$PowerSettingDataIndexAC-Property@{SettingIndexValue=$SettingIndexValue}
$PowerSettingDataIndexDC=Get-CimInstance-ClassName Win32\U PowerSettingDataIndex-Filter“InstanceID='Microsoft:PowerSettingDataIndex\\$PowerPlanGuid\\DC\\$PowerSettingDefinitionGuid'”@CommonArgs
Set-CimInstance-InputObject$PowerSettingDataIndexDC-Property@{SettingIndexValue=$SettingIndexValue}
}
功能集PowerButtonAndLidActions
{
#获取电源设置子组,其中元素名称为“电源按钮和盖子”
$PowerSettingSubgroup=Get-CimInstance-ClassName Win32\U PowerSettingSubgroup-Filter“ElementName=‘电源按钮和盖子’”@CommonArgs
#获取“盖关闭操作”、“电源按钮操作”和“睡眠按钮操作”的电源设置定义
$PowerSettingDefinitionLidCloseAction=Get-CimAssociatedInstance-InputObject$PowerSettingSubgroup |其中{$\元素名称-eq“Lid close action”}
$PowerSettingDefinitionPowerButtonAction=Get-CimAssociatedInstance-InputObject$PowerSettingSubgroup |其中{$\元素名称-eq“电源按钮操作”}
$PowerSettingDefinitionSleepButtonAction=Get-CimAssociatedInstance-InputObject$PowerSettingSubgroup |其中{$\元素名称-eq“睡眠按钮操作”}
#从每个操作的实例ID中提取GUID
$PowerSettingDefinitionLidCloseActionGuid=$PowerSettingDefinitionLidCloseAction.InstanceID-替换“.*({[^}]+})”,$1'
$PowerSettingDefinitionPowerButtonActionGuid=$PowerSettingDefinitionPowerButtonAction.InstanceID-替换“.*({[^}]+})”,$1'
$PowerSettingDefinitionSleepButtonActionGuid=$PowerSettingDefinitionSleepButtonAction.InstanceID-替换“.*({[^}]+})”,$1'
#获取每个功率设置定义的“不做任何事情”选项的值
$LidCloseActionDoNothing=Get-CimInstance-Query“从Win32\U PowerSettingDefinitionPossibleValue中选择*,其中ElementName='Do nothing',InstanceID类似“\\\\\$PowerSettingDefinitionLidCloseActionGuid\\\%”@CommonArgs
$POWERBUTNACTIONDONOTHING=Get-CimInstance-Query“从Win32中选择*U PowerSettingDefinitionPossibleValue,其中ElementName='Do nothing',InstanceID类似“\\\\\$PowerSettingDefinitionPOWERBUTNACTIONGUID\\%”@CommonArgs
$SleepButtonActionDoNothing=Get-CimInstance-Query“从Win32\U PowerSettingDefinitionPossibleValue中选择*,其中ElementName='Do nothing',InstanceID类似“\\\\\$PowerSettingDefinitionSleepButtonActionGuid\\%”@CommonArgs
$p=Get-CimInstance-ClassName Win32\u PowerPlan-Filter“ElementName=‘高性能’”@CommonArgs
#从电源计划的InstanceID属性中提取GUID
$PlanGuid=$p.InstanceID-替换“.*({[^}]+})”,$1'
设置PowerSettingDataIndexValue-PowerPlanGuid$PlanGuid-PowerSettingDefinitionGuid$PowerSettingDefinitionLidCloseActionGuid$LidCloseActionDoNothing.SettingIndex
设置PowerSettingDataIndexValue-PowerPlanGuid$PlanGuid-PowerSettingDefinitionGuid$PowerSettingDefinitionPowerButtonActionGuid$PowerButtonActionDoNothing.SettingIndex
设置PowerSettingDataIndexValue-PowerPlanGuid$PlanGuid-PowerSettingDefinitionGuid$PowerSettingDefinitionSleepButtonActionGuid$SleepButtonActionDoNothing.SettingIndex
调用CimMethod-InputObject$p-MethodName激活|输出Null
}
设置PowerButtonAndLidActions

您可以使用
获取CIMInstance
列出几乎所有这些。电源计划都在
Win32\u电源计划
类中,因此:

Get-CimInstance -classname Win32_PowerPlan -Namespace "root\cimv2\power"
这将列出计算机上的所有计划。您可以在上找到所有这些信息。甚至还有PowerShell示例

从这里,您只需解析出所需的信息。
ElementName
属性显示了某人在进入控制面板中的电源设置GUI时会看到的内容。
InstanceID
是您可以找到GUID的地方,尽管您可能需要执行以下操作:

Get-CimInstance -Namespace "root\cimv2\power" -class Win32_PowerPlan|Select ElementName,@{l='GUID';e={$_.instanceid.substring(20)}}
其余部分应在
Win32\u PowerSetting
Win32\u PowerSettingSubgroup
中找到。您应该能够浏览该站点,找到其他相关类,以获取所需信息。

$powerplan=get-wmiobject -namespace "root\cimv2\power" -class Win32_powerplan | where {$_.IsActive}

$powerSettings = $powerplan.GetRelated("win32_powersettingdataindex") | foreach {
 $powersettingindex = $_;

 $powersettingindex.GetRelated("Win32_powersetting") | select @{Label="Power Setting";Expression={$_.instanceid}},
 @{Label="AC/DC";Expression={$powersettingindex.instanceid.split("\")[2]}},
 @{Label="Summary";Expression={$_.ElementName}},
 @{Label="Description";Expression={$_.description}},
 @{Label="Value";Expression={$powersettingindex.settingindexvalue}}
 }

$powerSettings | ft "Power Setting","AC/DC",Summary,Value -autosize
Power Setting                                                 AC/DC Summary                                                                                                                               Value
-------------                                                 ----- -------                                                                                                                               -----
Microsoft:PowerSetting\{f3c5027d-cd16-4930-aa6b-90db844a8f00} AC    Reserve battery level                                                                                                                     7
Microsoft:PowerSetting\{f3c5027d-cd16-4930-aa6b-90db844a8f00} DC    Reserve battery level                                                                                                                     7
Microsoft:PowerSetting\{6c2993b0-8f48-481f-bcc6-00dd2742aa06} AC    Processor idle threshold scaling                                                                                                          0
Microsoft:PowerSetting\{6c2993b0-8f48-481f-bcc6-00dd2742aa06} DC    Processor idle threshold scaling                                                                                                          0
Microsoft:PowerSetting\{d8742dcb-3e6a-4b3c-b3fe-374623cdcf06} AC    Low battery action                                                                                                                        0