Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call Windows Runtime Classes from PowerShell

Is there a way to call Windows Runtime (WinRT) classes (or objects) from a PowerShell script? I know that you can call COM objects, which WinRT classes are supposed to be "exposed" as ... but so far my attempts have failed...

This is my code I'm trying:

$lockscreen = New-Object -comObject Windows.System.UserProfile.LockScreen

Which gives me the following error:

New-Object : Retrieving the COM class factory for component with CLSID {00000000-0000-0000-0000-000000000000} failed
due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Does anyone know the correct "COM Class" that I should be using for WinRT classes?

like image 976
Julian Easterling Avatar asked Jan 01 '13 23:01

Julian Easterling


2 Answers

Here is something hacky that seems to work:

PS> new-object "Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime"
new-object : Constructor not found. Cannot find an appropriate constructor for type
Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime.
At line:1 char:1
+ new-object "Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,Con ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (:) [New-Object], PSArgumentException
    + FullyQualifiedErrorId : CannotFindAppropriateCtor,Microsoft.PowerShell.Commands.NewObjectCommand

PS> [Windows.System.UserProfile.LockScreen]::OriginalImageFile


AbsolutePath   : C:/Windows/Web/Screen/img100.png
AbsoluteUri    : file:///C:/Windows/Web/Screen/img100.png
LocalPath      : C:\Windows\Web\Screen\img100.png
Authority      :
HostNameType   : Basic
IsDefaultPort  : True
IsFile         : True
IsLoopback     : True
PathAndQuery   : C:/Windows/Web/Screen/img100.png
...

Note that the first call fails because LockScreen has no constructor but that call does something to pull in the WinRT projection/metadata such that you can now call the static methods/properties on the LockScreen class.

DISCLAIMER: there isn't any documentation that I can find on this New-Object syntax so it is entirely possible that Microsoft could change it considering it is essentially a "hidden" and probably not fully developed feature.

like image 170
Keith Hill Avatar answered Sep 30 '22 19:09

Keith Hill


just reference the type, to "load" the assembly...

[Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime]
[Windows.System.UserProfile.LockScreen]::OriginalImageFile

if you don't want the type to be returned in your powershell results then

$null = [Windows.System.UserProfile.LockScreen,Windows.System.UserProfile,ContentType=WindowsRuntime]
like image 24
klumsy Avatar answered Sep 30 '22 21:09

klumsy