PowerShell/WMI управление питанием

Я новичок в управлении питанием Windows и еще новее в WMI, но всегда приветствую возможность обучения.

Используя PowerShell и WMI, я хочу установить для "Power Performance" плана электропитания "Действие при закрытии крышки", "Действие кнопки питания" и "Действие кнопки отключения" на параметр "Ничего не делать" и, наконец, установить активный план питания на "Высокий уровень". Производительность "Силовой план. У меня есть рабочее решение, но я сомневаюсь, что это правильное решение.

Суть моей проблемы заключается в том, что все планы, подгруппы, действия, доступные значения и т. Д. Идентифицируются с помощью идентификаторов GUID, и я прочитал, что эти идентификаторы GUID могут варьироваться от системы к системе (особенно если они применяются через групповую политику)..) В моем решении мне удалось избежать жестких кодов GUID только для того, чтобы получить жесткие значения кодирования, такие как "Кнопки питания и крышки", "Закрытие крышки", "Ничего не делать" и т. Д., Которые могут изменяться или не изменяться. неанглийские сборки Windows. (Я использую Windows 8.1 кстати.)

Мой вопрос

Как правильно программно определить GUID для каждого плана, подгруппы, действия, доступного значения и т. Д.?

Ссылка

В BATCH с использованием инструмента 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

2 ответа

Ты можешь использовать Get-CIMInstance перечислить в значительной степени все это. Планы питания все в Win32_PowerPlan класс, так:

Get-CimInstance -classname Win32_PowerPlan -Namespace "root\cimv2\power"

Это перечислит все планы на компьютере. Вы можете найти всю эту информацию на сайте https://msdn.microsoft.com/en-us/library/dd904531(v=vs.85).aspx. Есть даже примеры PowerShell.

Оттуда вам просто нужно разобрать информацию, которая вам нужна. ElementName свойство показывает, что кто-то увидит, если они перейдут к графическому интерфейсу Power Settings на панели управления. InstanceID где вы найдете GUID, хотя вам может потребоваться сделать что-то вроде:

Get-CimInstance -Namespace "root\cimv2\power" -class Win32_PowerPlan|Select ElementName,@{l='GUID';e={$_.instanceid.substring(20)}}

Остальные должны быть найдены в Win32_PowerSetting а также Win32_PowerSettingSubgroup, Вы должны быть в состоянии изучить этот сайт, чтобы найти другие связанные классы, чтобы получить необходимую информацию.

На странице класса MSDN Win32_PowerPlan приведен пример PowerShell, который делает то, что вы хотите, с небольшими изменениями (добавление "PowerSetting" до последней строки). Модификация ниже:

$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

...

Вы также можете напрямую вызывать класс Win32_powersettingdataindex, но мне было труднее соотнести параметр с его GUID, делая это таким образом.

Другие вопросы по тегам