Moin miteinander,
hat hier jemand zufällig ein opsiscript snippet, um sicherzustellen, dass ein Akkubetriebenes Gerät an der Stromversorgung hängt?
Hintergrund ist folgender: Ich möchte in meiner Umgebung das Windows11-upgrade Paket ausrollen. Hierbei möchte ich aber sicherstellen, dass alle Laptops während der Installation an der Stromversorgung sind, um einen ungewollten Abbruch zu vermeiden.
Stromversorgung sicherstellen
Re: Stromversorgung sicherstellen
Hi,
ja, ich hab' da was! Wie ich gerade gesehen habe ist das Skript schon bald sieben Jahre alt, aber es läuft... und läuft... und läuft
Sicherlich gibt es nach sieben Jahren Optimierungsmöglichkeiten, eigentlich wollte ich noch 'ne Weiche einbauen, dass das Skript erst in "issuspended" geht, wenn Akkustand unter 70% oder so...
Außerdem: Ich baue Pakete in fünf Sprachen und habe mir deswegen eigene und für alle Pakete verwendbare Language-Files gebaut... daher auch die Variable $MSG_POWERCHECK$ (und andere), die aus dem zuvor inkludierten Language-File kommt. Diese Variablen einfach entfernen oder umschreiben.
Auch die Anzeige eigens generierten Bitmaps via musst Du noch auskommentieren...
Hier das Snipplet, deren Aufruf ich inkludiere:
Viel Spaß
ja, ich hab' da was! Wie ich gerade gesehen habe ist das Skript schon bald sieben Jahre alt, aber es läuft... und läuft... und läuft

Sicherlich gibt es nach sieben Jahren Optimierungsmöglichkeiten, eigentlich wollte ich noch 'ne Weiche einbauen, dass das Skript erst in "issuspended" geht, wenn Akkustand unter 70% oder so...
Außerdem: Ich baue Pakete in fünf Sprachen und habe mir deswegen eigene und für alle Pakete verwendbare Language-Files gebaut... daher auch die Variable $MSG_POWERCHECK$ (und andere), die aus dem zuvor inkludierten Language-File kommt. Diese Variablen einfach entfernen oder umschreiben.
Auch die Anzeige eigens generierten Bitmaps via
Code: Alles auswählen
ShowBitmap "%ScriptPath%\SPMS\" + "icon_power.png" $ProductName$
Hier das Snipplet, deren Aufruf ich inkludiere:
Code: Alles auswählen
encoding=UTF-8
; ################################################################
; Copyright & Maintainer [...entfernt...]
; ################################################################
;
;
; Prüft, ob das System mit Strom oder über Akku versorgt wird
; Version 2018-12-23
;Seit Version 4.11.4.1 kann bei einem Script (egal ob Hauptskript, sub oder include) das encoding auch angegeben werden. Dazu gibt es den Befehl:
;encoding=<encoding>
;Dieser Befehl kann an einer beliebigen Stelle in der Scriptdatei stehen. Das <encoding> ist eines der folgenden Werte:
encoding=utf8
encoding=UTF-8
; ----------------------------------------------------------------------------------
; - Systemtyp: Wir ermitteln, ob es sich überhaupt um ein "tragbares" System hält -
; 8 = Portable
; 9 = Laptop
; 10 = Notebook
; 11 = Handheld
; 14 = Laptop
; 30 = Tablet
; 31 = (convertible)
; 32 = (detachable)
; ----------------------------------------------------------------------------------
DefStringList $resultlist$
DefVar $chassis$
; System bestimmen
Set $chassis$ = getRegistryValue("HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\SYSTEM\BIOS", "EnclosureType")
if ($chassis$ = "8" OR $chassis$ ="9" OR $chassis$ ="10" OR $chassis$ ="11" OR $chassis$ ="14" OR $chassis$ ="30" OR $chassis$ ="31" OR $chassis$ ="32" )
message $MSG_POWERCHECK$
; ----------------------------------------------------------------------------------
; - Loglevel: Alter Wert auslesen und neuen Wert setzen -
; ----------------------------------------------------------------------------------
DefVar $LogLevelBefore_powersupplyins$
set $LogLevelBefore_powersupplyins$ = getLoglevel
Setloglevel = 4
ShowBitmap "%ScriptPath%\SPMS\" + "icon_power.png" $ProductName$
DefStringList $powersupply_list$
DefStringList $powersupply_list1$
DefStringList $powersupply_list2$
DefVar $powersupply_exitcode$
DefVar $powersupply_CompValue$
DefVar $powersupply_TestResult$
DefVar $powersupply_PSSecurityException$
if ((CompareDotSeparatedNumbers("%WinstVersion%","4.11.3.5") >= "0") and (CompareDotSeparatedNumbers(GetMsVersionInfo,"6.1") >= "0"))
DosInAnIcon_setpolicy
set $powersupply_exitcode$ = getLastExitcode
if not ($powersupply_exitcode$ = "0")
comment "powershell script failed"
endif
set $powersupply_list1$ = getOutStreamFromSection ('execwith_powershell_architecture "%System%\WindowsPowerShell\v1.0\powershell.exe" winst /32bit')
comment "check if the script was executed..."
set $powersupply_CompValue$ = takeFirstStringContaining($powersupply_list1$,"powershell opsi-winst-test")
if ("" = $powersupply_CompValue$)
comment "check if the script was not executed because powershell is not activated..."
endif
if not ("" = $powersupply_CompValue$)
set $powersupply_PSSecurityException$ = takeFirstStringContaining($powersupply_list1$,"PSSecurityException")
if ("" = $powersupply_PSSecurityException$)
comment "Execwith assumed passed"
set $powersupply_TestResult$ = "o.k."
comment "Execwith assumed passed"
else
message "Achtung: PSSecurityException"
set $powersupply_TestResult$ = "not o.k. - PSSecurityException"
endif
else
set $powersupply_TestResult$ = "not o.k."
LogWarning "Execwith assumed failed"
endif
endif
; ----------------------------------------------------------------------------------
; - Der eigentliche Test -
; ----------------------------------------------------------------------------------
ShowBitmap "%ScriptPath%\SPMS\" + "icon_power.png" $ProductName$
message $MSG_POWERCHECK$
DefVar $PowerState$
set $powersupply_list1$ = getOutStreamFromSection ('execwith_powershell_checkpowersupply "%System%\WindowsPowerShell\v1.0\powershell.exe" winst /32bit')
set $powersupply_TestResult$ = takeFirstStringContaining($powersupply_list1$,"powershell Powertest")
set $powersupply_CompValue$ = takeFirstStringContaining($powersupply_list1$,"PowerOnline")
set $powersupply_list1$ = splitString($powersupply_CompValue$, ":")
set $PowerState$ = trim(takeFirstStringContaining($powersupply_list1$,"False"))
if ($PowerState$ = "False")
ShowBitmap "%ScriptPath%\SPMS\" + "icon_power_onbattery.png" $ProductName$
message $MSG_POWERCHECK_ONBATTERY$
LogError "System auf Akku - Abbruch"
SetActionProgress "Fail: Akkubetrieb"
sleepSeconds 10
isSuspended
else
comment "System is on powersupply..."
ShowBitmap "%ScriptPath%\SPMS\" + "icon_power_onpower.png" $ProductName$
message $MSG_POWERCHECK_ONSUPPLY$
endif
; ----------------------------------------------------------------------------------
; Loglevel und Grafik wieder auf vorherigen Wert zuruecksetzen
; ----------------------------------------------------------------------------------
ShowBitmap "%ScriptPath%\SPMS\" + "icon.png" $ProductName$
Setloglevel = $LogLevelBefore_powersupplyins$
else
; ToDo: Language-Files anpassen (es-es,fr-fr,it-it,de-de,en-us)
message "System ohne Akku - alles okay"
sleepSeconds 2
endif
; ----------------------------------------------------------------------------------
; Ablauf beendet
; ----------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------
; Sektionen
; ----------------------------------------------------------------------------------
[DosInAnIcon_setpolicy]
echo "powershell set-executionpolicy RemoteSigned ..."
powershell.exe set-executionpolicy RemoteSigned
exit %ERRORLEVEL%
[execwith_powershell_architecture]
echo "powershell opsi-winst-test"
$psversion
$psversiontable
#start-process -wait cmd.exe
$is64BitSystem = ($env:Processor_Architecture -ne "x86")
$is64BitPowerShell = [IntPtr]::Size -eq 8
$env:Processor_Architecture
[IntPtr]::Size
$is64BitSystem
$is64BitPowerShell
gwmi win32_battery
[execwith_powershell_checkpowersupply]
echo "powershell Powertest"
gwmi -Class batterystatus -Namespace root\wmi
Re: Stromversorgung sicherstellen
Mahlzeit,
möchte hier auch noch meinen Senf dazugeben
Wir verteilen auch die BIOS Pakete per OPSI und daher ist es für uns schon interessant, ob der Laptop am Ladekabel hängt oder nicht.
Ich habe daher in meinem Skript einen kleinen Powershellaufruf drin
der gibt mir dann den passenden ExitCode, mit dem kann ich dann weiterarbeiten.
Da gibts dann noch nem Meldung für die User*innen wenn der Laptop nicht geladen wird, welche mit OK bestätigt werden muss, sonst geht nix weiter.
Die User*innen haben dann einmalig die Chance ein Kabel anzustecken bevor sie OK klicken, sonst geht beim nächsten Systemstart das Spielchen wieder von vorne los.
möchte hier auch noch meinen Senf dazugeben

Wir verteilen auch die BIOS Pakete per OPSI und daher ist es für uns schon interessant, ob der Laptop am Ladekabel hängt oder nicht.
Ich habe daher in meinem Skript einen kleinen Powershellaufruf drin
Code: Alles auswählen
$powerStatus = Get-WmiObject -Class Win32_Battery
if ($powerStatus.BatteryStatus -eq 2) {
exit 1 # Laptop wird geladen
} else {
exit 0 # Laptop wird nicht geladen
}
Da gibts dann noch nem Meldung für die User*innen wenn der Laptop nicht geladen wird, welche mit OK bestätigt werden muss, sonst geht nix weiter.
Die User*innen haben dann einmalig die Chance ein Kabel anzustecken bevor sie OK klicken, sonst geht beim nächsten Systemstart das Spielchen wieder von vorne los.