Codestripper
Codestripper

Reputation: 43

Question about ISE vs Console with SystemEvents

When I run the following in PowerShell ISE, it works perfectly, gives me the reason "AccountLock" or "AccountUnlock" exactly as it's supposed to. However, when I run this exact command in an elevated powershell console, it does not return the sessionswitch reason at all in console. It returns nothing after an unlock.

I checked Get-EventSubscriber as well as Get-Job and both look successfully created. Screenshot of Subscriber & Job:

get-job and get-EventSuscriber calls

Register-ObjectEvent -InputObject $([microsoft.win32.systemevents]) -EventName "SessionSwitch" -Action {write-host $event.SourceEventArgs.Reason}

One thing I would like to do is have windows detect when the session is unlocked (after a user syncs their password with the domain) and open a program.

OS: Windows 10 Version: 5.1 Build 17134 R 590

Upvotes: 2

Views: 277

Answers (2)

Justin Ainsworth
Justin Ainsworth

Reputation: 36

After a lot of looking around, i couldn't find a good way to use [windows.win32.systemevents], so i reached out to Lee Holmes. He said it is because the powershell console host runs by default in the Single Thread Apartment (STA) model. If you run it in MTA, it works fine.

Simplest workaround is to use code similar to this at the beginning of your script to ensure you are in MTA mode, and if start a new powershell process if you are not and reload the script.

if ([System.Threading.Thread]::CurrentThread.ApartmentState -ne [System.Threading.ApartmentState]::MTA)
{
    powershell.exe -MTA -File $MyInvocation.MyCommand.Path
    return
}

Upvotes: 2

JPBlanc
JPBlanc

Reputation: 72610

Have a look to Microsoft documentation : SystemEvents.SessionSwitch Event, the explanation seems to be that this message is sent to message pump which is the part of code that process graphic messages. You perhaps can try to use an hidden form in your code to force creation of a message pump.

Note :

This event is only raised if the message pump is running. In a Windows service, unless a hidden form is used or the message pump has been started manually, this event will not be raised. For a code example that shows how to handle system events by using a hidden form in a Windows service, see the SystemEvents class.

Upvotes: 0

Related Questions