AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Abfragen der Eigenschaften eines Energieschemas

Abfragen der Eigenschaften eines Energieschemas

Ein Thema von devidespe · begonnen am 29. Okt 2007 · letzter Beitrag vom 22. Apr 2021
Antwort Antwort
Seite 2 von 2     12
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#11

AW: Abfragen der Eigenschaften eines Energieschemas

  Alt 21. Apr 2021, 16:16
Computer\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\2a737441-1930-4402-8d77-b2bebba308a3\48e6b7a6-50f5-4782-a5d4-53bb8f07e226 da sind die usb power settings enthalten....
Probiere mal lieber die Index-Funktionen:
Delphi-Quellcode:
  USBSetting: TGUID = '{2a737441-1930-4402-8d77-b2bebba308a3}'; // # USB settings
  USBSelectiveSuspendSetting: TGUID = '{48e6b7a6-50f5-4782-a5d4-53bb8f07e226}'; // # USB selective suspend setting
//und der restliche code
genau daran hat es bei mir gehapert, mir waren zwar die GUIDs bekannt wie man da oben sieht, nur wusste ich nichts mit anzufangen.
du bist ein

und ja, hölle trifft es ganz gut

danke für diesen tollen beitrag!!
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
159 Beiträge
 
#12

AW: Abfragen der Eigenschaften eines Energieschemas

  Alt 21. Apr 2021, 17:28
Vielen Dank Leute.
Damit klappt es.
Theoretisch geht zwar auch:
Delphi-Quellcode:
    iType_1 := REG_SZ;
    iBufferSize := 255;
    GetMem(buffer_1, iBufferSize);
    res :=
      PowerReadACValue(
        0, pActivePolicyGuid^,
        USBSetting, USBSelectiveSuspendSetting,
        @iType_1, buffer_1, @iBufferSize
      );
    if (res = ERROR_SUCCESS) then
    begin
      engState.LastCheck := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now());
      engState.UsbEng := (buffer_1^ = 1);
    end;
aber die Verwendung von Reg_SZ, was ja eigendlich auf einen String verweist verwirrt mich zu sehr
daher habe ich das dann so gelöst:
Delphi-Quellcode:
    AcValueIndex := 0;
    res :=
      PowerReadACValueIndex(
        0, TGUID(pActivePolicyGuid^), // Referenzwert
        USBSetting, USBSelectiveSuspendSetting, // Pfad zu den Daten
        @AcValueIndex // Rückgabewert
      );
    if (res = ERROR_SUCCESS) then
    begin
      engState.LastCheck := FormatDateTime('yyyy-mm-dd hh:nn:ss', Now());
      engState.UsbEng := (AcValueIndex = 1);
    end;
Zumal ich bei der ersten Lösung theoretisch auch noch auf den Rückgabewert "ERROR_MORE_DATA"
prüfen müsste.

Zum Thema "Einstellung aus Gerätemanager": Ne, bei der Einrichtung unserer Server sind die
Techniker angewiesen die Energieoptionen entsprechend anzupassen, da dies immer wieder
Probleme macht. Hiermit könnte man prüfen, ob beim Kunden dieser Wert (von deren Technikern)
wieder geändert wird.
Ja, theoretisch könnte man auch alle einzelnen Geräte, welche Fehler produzieren wenn man
diese in den Energiesparmodus schickt, einzeln über den Gerätemanager rausnehmen,
aber der Verwaltungsaufwand ist zu hoch und die Fehlerquellen multiplizierfen sich hier ja auch.
Das ist zwar mit der groben Kelle, aber mal ehrlich, wer will das bei allen Kunden bis ins letzte
Detail korrekt einstellen müssen. Von eigenmächtigem Austausch irgendwelcher Hardware mal ganz abgesehen.

Wie gesagt. Für mich sieht die Lösung schon sehr gut aus. Ich teste das mal die Tage.
Vielen Dank nochmal für die echt schnelle Hilfe.

Liebe Grüße
Incocnito
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.061 Beiträge
 
Delphi 10.3 Rio
 
#13

AW: Abfragen der Eigenschaften eines Energieschemas

  Alt 21. Apr 2021, 21:20
In meinem Kopf dreht sich alles, aber irgendwie bekomme ich (hoffentlich auch das korrekte) ein Ergebnis.
Falls jemand verrückt genug ist das mal zu überprüfen wäre ich echt erleichtert!!
Delphi-Quellcode:
program Project20;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,
  System.SysUtils, System.Classes;

{
https://docs.microsoft.com/en-us/windows/win32/api/powersetting/nf-powersetting-powergetactivescheme
DWORD PowerGetActiveScheme(
  HKEY UserRootPowerKey,
  GUID **ActivePolicyGuid
);
Parameters
UserRootPowerKey

This parameter is reserved for future use and must be set to NULL.

ActivePolicyGuid

A pointer that receives a pointer to a GUID structure. Use the LocalFree function to free this memory.

Return value
Returns ERROR_SUCCESS (zero) if the call was successful, and a nonzero value if the call failed.
}

function PowerGetActiveScheme(UserRootPowerKey: HKEY; var ActivePolicyGuid: PGUID): DWORD; stdcall; external 'PowrProf.dll';

{
https://docs.microsoft.com/en-us/windows/win32/api/powrprof/nf-powrprof-powerreaddescription
DWORD PowerReadDescription(
  HKEY      RootPowerKey,
  const GUID *SchemeGuid,
  const GUID *SubGroupOfPowerSettingsGuid,
  const GUID *PowerSettingGuid,
  PUCHAR    Buffer,
  LPDWORD    BufferSize
);
Parameters
RootPowerKey

This parameter is reserved for future use and must be set to NULL.

SchemeGuid

The identifier of the power scheme.

SubGroupOfPowerSettingsGuid

The subgroup of power settings. This parameter can be one of the following values defined in WinNT.h. Use NO_SUBGROUP_GUID to refer to the default power scheme.

TABLE 1
Value   Meaning
NO_SUBGROUP_GUID
fea3413e-7e05-4911-9a71-700331f1c294
Settings in this subgroup are part of the default power scheme.
GUID_DISK_SUBGROUP
0012ee47-9041-4b5d-9b77-535fba8b1442
Settings in this subgroup control power management configuration of the system's hard disk drives.
GUID_SYSTEM_BUTTON_SUBGROUP
4f971e89-eebd-4455-a8de-9e59040e7347
Settings in this subgroup control configuration of the system power buttons.
GUID_PROCESSOR_SETTINGS_SUBGROUP
54533251-82be-4824-96c1-47b60b740d00
Settings in this subgroup control configuration of processor power management features.
GUID_VIDEO_SUBGROUP
7516b95f-f776-4464-8c53-06167f40cc99
Settings in this subgroup control configuration of the video power management features.
GUID_BATTERY_SUBGROUP
e73a048d-bf27-4f12-9731-8b2076e8891f
Settings in this subgroup control battery alarm trip points and actions.
GUID_SLEEP_SUBGROUP
238C9FA8-0AAD-41ED-83F4-97BE242C8F20
Settings in this subgroup control system sleep settings.
GUID_PCIEXPRESS_SETTINGS_SUBGROUP
501a4d13-42af-4429-9fd1-a8218c268e20
Settings in this subgroup control PCI Express settings.
PowerSettingGuid

The identifier of the power setting that is being used.

Buffer

A pointer to a buffer that receives the description. If this parameter is NULL, the BufferSize parameter receives the required buffer size. The strings returned are all wide (Unicode) strings.

BufferSize

A pointer to a variable that contains the size of the buffer pointed to by the Buffer parameter.

If the Buffer parameter is NULL, the function returns ERROR_SUCCESS and the variable receives the required buffer size.

If the specified buffer size is not large enough to hold the requested data, the function returns ERROR_MORE_DATA and the variable receives the required buffer size.

Return value
Returns ERROR_SUCCESS (zero) if the call was successful, and a nonzero value if the call failed. If the buffer size specified by the BufferSize parameter is too small, the function returns ERROR_SUCCESS and the DWORD pointed to by the BufferSize parameter is filled in with the required buffer size.
}

function PowerReadDescription(RootPowerKey: HKEY; const SchemeGuid: TGUID; const SubGroupOfPowerSettingsGuid: TGUID; const PowerSettingGuid: TGUID; Buffer: PUCHAR; BufferSize: LPDWORD): DWORD; stdcall; external 'PowrProf.dll';

{
https://docs.microsoft.com/en-us/windows/win32/api/powrprof/nf-powrprof-powerreadacvalueindex
DWORD PowerReadACValueIndex(
  HKEY      RootPowerKey,
  const GUID *SchemeGuid,
  const GUID *SubGroupOfPowerSettingsGuid,
  const GUID *PowerSettingGuid,
  LPDWORD    AcValueIndex
);
Parameters
RootPowerKey

This parameter is reserved for future use and must be set to NULL.

SchemeGuid

The identifier of the power scheme.

SubGroupOfPowerSettingsGuid

The subgroup of power settings. This parameter can be one of the following values defined in WinNT.h. Use NO_SUBGROUP_GUID to refer to the default power scheme.

TABLE 1
Value   Meaning
NO_SUBGROUP_GUID
fea3413e-7e05-4911-9a71-700331f1c294
Settings in this subgroup are part of the default power scheme.
GUID_DISK_SUBGROUP
0012ee47-9041-4b5d-9b77-535fba8b1442
Settings in this subgroup control power management configuration of the system's hard disk drives.
GUID_SYSTEM_BUTTON_SUBGROUP
4f971e89-eebd-4455-a8de-9e59040e7347
Settings in this subgroup control configuration of the system power buttons.
GUID_PROCESSOR_SETTINGS_SUBGROUP
54533251-82be-4824-96c1-47b60b740d00
Settings in this subgroup control configuration of processor power management features.
GUID_VIDEO_SUBGROUP
7516b95f-f776-4464-8c53-06167f40cc99
Settings in this subgroup control configuration of the video power management features.
GUID_BATTERY_SUBGROUP
e73a048d-bf27-4f12-9731-8b2076e8891f
Settings in this subgroup control battery alarm trip points and actions.
GUID_SLEEP_SUBGROUP
238C9FA8-0AAD-41ED-83F4-97BE242C8F20
Settings in this subgroup control system sleep settings.
GUID_PCIEXPRESS_SETTINGS_SUBGROUP
501a4d13-42af-4429-9fd1-a8218c268e20
Settings in this subgroup control PCI Express settings.
PowerSettingGuid

The identifier of the power setting.

AcValueIndex

A pointer to a variable that receives the AC value index.

Return value
Returns ERROR_SUCCESS (zero) if the call was successful, and a nonzero value if the call failed.
}

function PowerReadACValueIndex(RootPowerKey: HKEY; const SchemeGuid: TGUID; const SubGroupOfPowerSettingsGuid: TGUID; const PowerSettingGuid: TGUID; AcValueIndex: LPDWORD): DWORD; stdcall; external 'PowrProf.dll';

const
  USBSetting: TGUID = '{2a737441-1930-4402-8d77-b2bebba308a3}'; // # USB settings
  USBSelectiveSuspendSetting: TGUID = '{48e6b7a6-50f5-4782-a5d4-53bb8f07e226}'; // # USB selective suspend setting
var
  pActivePolicyGuid: PGUID;
  Return : DWORD;
  Buffer: PWideChar;
  BufferSize: DWORD;
  AcValueIndex: DWORD;
begin
  try
    pActivePolicyGuid := nil;
    Return := PowerGetActiveScheme(0, pActivePolicyGuid);
    if Return = ERROR_SUCCESS then
    begin
      Return := PowerReadDescription(0, pActivePolicyGuid^, USBSetting, USBSelectiveSuspendSetting, nil, @BufferSize);
      if Return = ERROR_SUCCESS then
      begin
        GetMem(Buffer, BufferSize);
        Return := PowerReadDescription(0, pActivePolicyGuid^, USBSetting, USBSelectiveSuspendSetting, Pointer(Buffer), @BufferSize);
        if Return = ERROR_SUCCESS then
        begin
           WriteLn('BufferSize: ' + IntToStr(BufferSize));
           WriteLn('Beschreibung: ' + Buffer);
        end;
        FreeMem(Buffer, BufferSize);
      end;
      Return := PowerReadACValueIndex(0, pActivePolicyGuid^, USBSetting, USBSelectiveSuspendSetting, @AcValueIndex);
      if Return = ERROR_SUCCESS then
      begin
        WriteLn('Wert: ' + IntToStr(AcValueIndex));
      end;
      LocalFree(pActivePolicyGuid);
    end;
    ReadLn;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Bei mir kommt folgendes raus:
BufferSize: 156
Beschreibung: Geben Sie an, ob selektives USB-Energiesparen aktiviert oder deaktiviert ist.
Wert: 1

//edit
hatte TOTAL TiGüs code vergessen einzubauen. Nun klappt auch bei mir alles.
Gruß vom KodeZwerg

Geändert von KodeZwerg (21. Apr 2021 um 21:43 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
2.812 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#14

AW: Abfragen der Eigenschaften eines Energieschemas

  Alt 22. Apr 2021, 11:18
...bei der Einrichtung unserer Server sind die
Techniker angewiesen die Energieoptionen entsprechend anzupassen, da dies immer wieder
Probleme macht. Hiermit könnte man prüfen, ob beim Kunden dieser Wert (von deren Technikern)
wieder geändert wird.
Vielleicht kannst du deine Techniker unterstützen, indem du ihnen ein Skript schreibst?!
Wie ich weiter oben erwähnte, standen wir vor einer ähnlichen Herausforderung.
Ich habe dir in PasteBin einen Auszug aus meinen PowerShell-Skript gepostet:
https://pastebin.com/ba1hbyf6

Ist vielleicht ein guter Starting Point, um es auf deine Bedürfnisse anzupassen.
Die deutschen Kommentare sind aus unserer Anleitung, die wir davor benutzt haben und damit man die Einstellung in der normalen Windows-Oberfläche wiederfindet.

Da hier zum Großteil nur stumpf mit der powercfg.exe geredet wird, ist eine Umsetzung mit der Windows-Batch-Skriptsprache grundsätzlich möglich, wenn gewünscht.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 03:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf