dirmhirn
Goto Top

SCCM Anwendung automatisch schließen

Hi,

möchte ein Outlook Plugin per SCCM verteilen, das Setup beendet aber Outlook. EIn Pop-Up soll her.

1. Option - Requirement mit global Condition - da gibt es aber einen Bug, dass diese Application gar nicht im Software Center am Client aufscheint.

2. Option - Installation Behavior - Die Application ist required und ich hätte gewählt, dass Outlook.exe automatisch geschlossen werden soll. Es kommt am Client ein Pop-Up das brav nachfragt und behauptet Outlook wird geschlossen. Aber Outlook bleibt und das Setup scheitert.

3. PSAppDeployToolkit - dazu liest man viel gutes, aber mir wäre eine simplere Version lieber.

Irgendwer einen Tip wie man OPtion 2 oder sogar 1. doch noch zum Laufen bekommt?

sg Dirm

Content-ID: 613152

Url: https://administrator.de/contentid/613152

Printed on: December 4, 2024 at 06:12 o'clock

mayho33
Solution mayho33 Oct 15, 2020 at 15:28:54 (UTC)
Goto Top
Hi,

Hängst du das Setup direkt ein oder ist ein Script vorgeschaltet?

Wenn du ein Fensterchen haben willst musst du auf jeden Fall ein Script für die Installation verwenden.
In dem Script kannst du ein Popup einblenden.

Weil du aber als SYSTEM installierst (standard) befindet sich der User in einer anderen Session.

Du hast 2 Möglichkeiten:
A) im Deployment erlauben, dass der User mit dem Setup interagieren darf. In dem Fall also dein Script.
Nachteil: Der User sieht das Script und das Setup laufen und kann es auch beenden, wenn er will (Rechte?)

B) du baust dir eine kleine GUI (kann ja ein kleines PS1 sein) mit etwas Text und einem OK-Button (bei OK beendet sich die GUI wieder) und startest diese vom Script aus via ServiceUI.exe. ServiceUI.exe schiebt den angegebenen Prozess von Session 0 in die Session des Users. Er kann also genau diesen Prozess sehen. ServiceUI.exe findest du irgendwo am SCCM. Während die GUI läuft musst du in deinem Script warten!

Wenn der User also auf OK klickt, arbeitet dein Script weiter, beendet mit z.B. Taskkill die entsprechenden Protesse und installiert dein AddIn.

Fertig!

Ist etwas Aufwand, aber so lässt sich das wesentlich besser steuern.

Grüße!
Dirmhirn
Dirmhirn Oct 15, 2020 updated at 16:59:50 (UTC)
Goto Top
Hi,
danke für den Tip mit ServiceUI.

von A) rated sogar MS direkt in der SCCM Console ab. wegen Security, das habe ich gar nicht weiter verfolgt.

PSAppDeployToolkit habe ich mir inzwischen auch etwas angesehen. aber das kann halt wieder sehr viel.

ich will ja nur ein Ok/Cancel Pop-Up face-big-smile

sg Dirm
mayho33
mayho33 Oct 15, 2020 at 22:49:59 (UTC)
Goto Top
Zitat von @Dirmhirn:

von A) rated sogar MS direkt in der SCCM Console ab. wegen Security, das habe ich gar nicht weiter verfolgt.

Aber wie gesagt halt nur, weil der User mit entsprechenden Rechten aktiv eingreifen kann. Das will man ja verhindern.

PSAppDeployToolkit habe ich mir inzwischen auch etwas angesehen. aber das kann halt wieder sehr viel.

Hab ich auch... und gleich wieder vergessen. Ein einziges unstrukturiertes Gewurstel.

ich will ja nur ein Ok/Cancel Pop-Up face-big-smile

Dann sollte B sicher helfen. Schön, dass ich helfen konnte.

Grüße!
Dirmhirn
Dirmhirn Oct 20, 2020 at 16:40:15 (UTC)
Goto Top
Hi,

mit

$process = "$scriptDir\ServiceUI.exe"  
$argumentList = " -process:explorer.exe `"$env:windir\System32\WindowsPowerShell\v1.0\Powershell.exe`" -file `".\popup.ps1`""  
$processReturn = Start-Process $process -ArgumentList $argumentList -PassThru -Wait
hat es lokal schon funktioniert. aber SCCM mag $processReturn = anscheinend nicht face-confused

ohne bekomm ich aber keine Rückmeldung zu dem PopUp.

noch einen Tip? meine letzte Idee wäre eine temporäre txt-Datei.

sg Dirm
Dirmhirn
Dirmhirn Oct 22, 2020 at 19:58:50 (UTC)
Goto Top
hab nun doch eine Lösung mit named pipes gefunden. -Wait war das Problem bei Start-process face-big-smile

	# open named pipe to get results from popup (runs in user context)
	$pipe = new-object System.IO.Pipes.NamedPipeServerStream("\\.\pipe\olPopUp")  

	# run popup script in user context
	$process = "$scriptDir\ServiceUI.exe"  
	$argumentList = " -process:explorer.exe `"$env:windir\System32\WindowsPowerShell\v1.0\Powershell.exe`" -WindowStyle hidden -file `".\popup.ps1`""  
	Start-Process $process -ArgumentList $argumentList -NoNewWindow
	
	# wait for connection and data
	$pipe.WaitForConnection()
	$sr = new-object System.IO.StreamReader($pipe)
	while ($pipe.IsConnected) 
	{
		$return = $sr.ReadLine()
		if ($return -eq 'true') { $closeOutlook = $True }  
	}
 
	$sr.Dispose();
	$pipe.Dispose();

	Write-Output "$(Get-TimeStamp) Close Outlook: $closeOutlook"   

und im popup script

# open pipe to system script
$pipe = new-object System.IO.Pipes.NamedPipeClientStream("\\.\pipe\olPopUp")  
$pipe.Connect()
 
$sw = new-object System.IO.StreamWriter($pipe)

$a = new-object -comobject wscript.shell

$intAnswer = $a.popup("Close Outlook?", 1800,"Close Outlook?",0x4 + 0x20 + 0x100)   
If ($intAnswer -eq 6) {
	# close Outlook
	$sw.WriteLine('true')  
} else {
	$sw.WriteLine('false')  
}

$sw.Dispose()
$pipe.Dispose()

sg Dirm