Code: Alles auswählen
Set $TempFile$ = "%opsiTmpDir%\test.ps1"
Set $StringList$ = createStringList("whoami", "echo test")
if not(saveTextFile($StringList$, $TempFile$))
LogError("Could not save file to " + $TempFile$)
isFatalError
endif
WinBatch_simulate_execwith /RunAsLoggedOnAdmin
WinBatch_simulate_execwith /RunAsLoggedOnUser
Das Bizarre ist nun, dass das PowerShell-Skript mit /RunAsLoggedOnUser funktioniert,
aber mit /RunAsLoggedOnAdmin nicht.
Um das Problem zu debuggen, habe ich winst32.exe gepatcht, sodass der output von WinBatch-Sektionen angezeigt wird.
Dabei ergibt sich folgendes Bild.
Code: Alles auswählen
(32103) [6] [Nov 11 16:09:10:319] [lukas-winst-test] Set $TempFile$ = "c:\opsi.org\tmp\test.ps1"
(32104) [6] [Nov 11 16:09:10:319] [lukas-winst-test] The value of the variable "$TempFile$" is now: "c:\opsi.org\tmp\test.ps1"
(32105) [6] [Nov 11 16:09:10:320] [lukas-winst-test] Set $StringList$ = createStringList("whoami", "echo test")
(32106) [7] [Nov 11 16:09:10:320] [lukas-winst-test] The value of the variable "$StringList$" is now:
(32107) [7] [Nov 11 16:09:10:320] [lukas-winst-test] (string 0)whoami
(32108) [7] [Nov 11 16:09:10:320] [lukas-winst-test] (string 1)echo test
(32109) [6] [Nov 11 16:09:10:320] [lukas-winst-test] If
(32110) [7] [Nov 11 16:09:10:320] [lukas-winst-test] Save to file with encoding: system
(32111) [7] [Nov 11 16:09:10:323] [lukas-winst-test] saveTextFile($StringList$, $TempFile$) <<< result true
(32112) [6] [Nov 11 16:09:10:324] [lukas-winst-test] not(saveTextFile($StringList$, $TempFile$)) <<< result false
(32113) [6] [Nov 11 16:09:10:324] [lukas-winst-test] Then
(32114) [6] [Nov 11 16:09:10:324] [lukas-winst-test] EndIf
(32115) [5] [Nov 11 16:09:10:325] [lukas-winst-test] Execution of: Actions /RunAsLoggedOnAdmin
(32116) [5] [Nov 11 16:09:10:325] [lukas-winst-test]
(32117) [6] [Nov 11 16:09:10:325] [lukas-winst-test] Call ""powershell.exe" -ExecutionPolicy Bypass "c:\opsi.org\tmp\test.ps1""
(32118) [6] [Nov 11 16:09:10:325] [lukas-winst-test] Waiting until the called process is finished
(32119) [7] [Nov 11 16:09:10:332] [lukas-winst-test] Created process as temporary Admin opsiSetupAdmin
(32120) [6] [Nov 11 16:09:11:338] [lukas-winst-test] ExitCode 1 Executed process ""powershell.exe" -ExecutionPolicy Bypass "c:\opsi.org\tmp\test.ps1""
(32121) [7] [Nov 11 16:09:11:338] [lukas-winst-test] output:
(32122) [7] [Nov 11 16:09:11:338] [lukas-winst-test] --------------
(32123) [7] [Nov 11 16:09:11:338] [lukas-winst-test] c:\opsi.org\tmp\test.ps1 : Die Benennung "c:\opsi.org\tmp\test.ps1" wurde nicht als Name eines Cmdlet, einer Funktion,
(32124) [7] [Nov 11 16:09:11:338] [lukas-winst-test] einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der
(32125) [7] [Nov 11 16:09:11:338] [lukas-winst-test] Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.
(32126) [7] [Nov 11 16:09:11:338] [lukas-winst-test] In Zeile:1 Zeichen:1
(32127) [7] [Nov 11 16:09:11:338] [lukas-winst-test] + c:\opsi.org\tmp\test.ps1
(32128) [7] [Nov 11 16:09:11:338] [lukas-winst-test] + ~~~~~~~~~~~~~~~~~~~~~~~~
(32129) [7] [Nov 11 16:09:11:338] [lukas-winst-test] + CategoryInfo : ObjectNotFound: (c:\opsi.org\tmp\test.ps1:String) [], CommandNotFoundException
(32130) [7] [Nov 11 16:09:11:338] [lukas-winst-test] + FullyQualifiedErrorId : CommandNotFoundException
(32131) [7] [Nov 11 16:09:11:338] [lukas-winst-test]
(32132) [7] [Nov 11 16:09:11:338] [lukas-winst-test] --------------
(32133) [5] [Nov 11 16:09:11:343] [lukas-winst-test] Execution of: Actions /RunAsLoggedOnUser
(32134) [5] [Nov 11 16:09:11:343] [lukas-winst-test]
(32135) [6] [Nov 11 16:09:11:344] [lukas-winst-test] Call ""powershell.exe" -ExecutionPolicy Bypass "c:\opsi.org\tmp\test.ps1""
(32136) [6] [Nov 11 16:09:11:344] [lukas-winst-test] Waiting until the called process is finished
(32137) [6] [Nov 11 16:09:11:344] [lukas-winst-test] Start process as LoggedOnUser: UNI-AUGSBURG\epplluka
(32138) [6] [Nov 11 16:09:11:344] [lukas-winst-test] we will work with the logged on user with profile
(32139) [7] [Nov 11 16:09:11:369] [lukas-winst-test] Loaded profile for logged on user
(32140) [6] [Nov 11 16:09:14:394] [lukas-winst-test] ExitCode 0 Executed process ""powershell.exe" -ExecutionPolicy Bypass "c:\opsi.org\tmp\test.ps1""
(32141) [7] [Nov 11 16:09:14:394] [lukas-winst-test] output:
(32142) [7] [Nov 11 16:09:14:394] [lukas-winst-test] --------------
(32143) [7] [Nov 11 16:09:14:394] [lukas-winst-test] <Domäne>\epplluka
(32144) [7] [Nov 11 16:09:14:394] [lukas-winst-test] test
(32145) [7] [Nov 11 16:09:14:395] [lukas-winst-test] --------------
erhält man ein klares "Zugriff verweigert" statt der sehr generischen PowerShell-Fehlermeldung.
Außerdem funktioniert /RunAsLoggedOnAdmin sonst wunderbar. Folgendes geht z. B. problemlos:
Code: Alles auswählen
WinBatch_test /RunAsLoggedOnAdmin
[WinBatch_test]
"C:\windows\system32\cmd.exe" /c "whoami"
Meine einzige Vermutung ist, dass es irgendwie mit UAC zu tun hat, aber habe dann keine Ahnung, warum es nur beim local admin auftreten sollte. Ich habe auch weiter getestet und winst32.exe zusätzlich so gepatcht, dass bevor das Skript ausgeführt wurde die SID des temporary local admins zum Eigentümer der Datei gemacht wurde, das hat allerdings auch kein verändertes Bild ergeben.
Ich möchte auch noch betonen, dass das Problem auch mit dem normalen opsi-script 4.12.1.5 besteht, ich habe meine Patches hier vor allem
zum Debugging verwendet, aber mir ist dabei leider noch nicht klar geworden, wieso sich /RunAsLoggedOnAdmin so verhält.