[installer] Auto-start PowerToys as logged-in user from installer run… (#27793)

* [installer] Auto-start PowerToys as logged-in user from installer running as SYSTEM

* spellcheck

* Address feedback

* spellcheck
This commit is contained in:
Stefan Markovic
2023-08-04 09:59:33 +02:00
committed by GitHub
parent d4213c3e30
commit adbc273bcf
5 changed files with 176 additions and 189 deletions

View File

@@ -1,28 +1,15 @@
aaaa aaaa
AAAAEF
AAB
AABAD
AACB
AACD
AAD
AADF
abap
abcdefghjkmnpqrstuvxyz abcdefghjkmnpqrstuvxyz
ABE
abgr abgr
abi abi
ABlocked ABlocked
ABOUTBOX ABOUTBOX
Abug Abug
ACA
accctrl accctrl
Acceleratorkeys Acceleratorkeys
ACCEPTFILES ACCEPTFILES
ACCESSDENIED ACCESSDENIED
accessibilityinsights accessibilityinsights
ACDB
ACFC
ACFF
Acl Acl
aclapi aclapi
AClient AClient
@@ -40,18 +27,7 @@ adml
admx admx
advapi advapi
advfirewall advfirewall
AEAA
AEAD
AECC
AED
AEE
AEEB
AFAE
AFAEFC
AFDA
AFE
AFeature AFeature
AFFE
AFFINETRANSFORM AFFINETRANSFORM
AFX AFX
AGGREGATABLE AGGREGATABLE
@@ -77,7 +53,6 @@ ansicolor
ANull ANull
AOC AOC
aocfnapldcnfbofgmbbllojgocaelgdd aocfnapldcnfbofgmbbllojgocaelgdd
AOT
APARTMENTTHREADED APARTMENTTHREADED
APeriod APeriod
apidl apidl
@@ -143,36 +118,13 @@ AValid
awakeness awakeness
AWAYMODE AWAYMODE
AYUV AYUV
azcli
azman azman
azor
backtracer backtracer
BAF
bak bak
BBE
bbwe bbwe
BCA
BCB
BCCE
BCCEA
bck bck
BDB
BDBAD
BDCC
BDDF
BDFB
BEAA
BEB
BEEAADF
BEEC
BEFA
betadele betadele
betsegaw betsegaw
BFC
BFDE
BFEB
BFF
BFFA
BGR BGR
bgra bgra
bhid bhid
@@ -227,48 +179,28 @@ BValue
byapp byapp
BYPOSITION BYPOSITION
bytearray bytearray
CABD
CALG CALG
callbackptr callbackptr
calpwstr calpwstr
cameligo
Cangjie Cangjie
CANRENAME CANRENAME
CAPTUREBLT CAPTUREBLT
CAPTURECHANGED CAPTURECHANGED
CAtl CAtl
CBA
CBB
CBF
CCCCDE
cch cch
CCHDEVICENAME CCHDEVICENAME
CCHFORMNAME CCHFORMNAME
CCom CCom
CContext CContext
CDAC
CDBF
CDCE
CDD
CDE
cdecl cdecl
CDeclaration CDeclaration
CDEF CDEF
cdpx cdpx
CEAF
CEBAC
CEBD
CECB
CElems CElems
CENTERALIGN CENTERALIGN
ceq ceq
certlm certlm
certmgr certmgr
CFAADB
CFBBF
CFEE
CFFEE
CFFF
cguid cguid
CHANGECBCHAIN CHANGECBCHAIN
changecursor changecursor
@@ -346,7 +278,6 @@ comsupp
comsuppw comsuppw
comsuppwd comsuppwd
comutil comutil
concrt
CONFIGW CONFIGW
CONFLICTINGMODIFIERKEY CONFLICTINGMODIFIERKEY
CONFLICTINGMODIFIERSHORTCUT CONFLICTINGMODIFIERSHORTCUT
@@ -414,10 +345,8 @@ CYSCREEN
CYSMICON CYSMICON
CYVIRTUALSCREEN CYVIRTUALSCREEN
cziplib cziplib
DAA
Dac Dac
dacl dacl
DAF
damienleroy damienleroy
DARKPURPLE DARKPURPLE
DARKTEAL DARKTEAL
@@ -429,30 +358,18 @@ dataversion
DATAW DATAW
davidegiacometti davidegiacometti
Dayof Dayof
DBAE
DBB
DBBDA
DBDE
Dbg Dbg
Dbghelp Dbghelp
DBLCLKS DBLCLKS
DBLEPSILON DBLEPSILON
DCAB
DCapture DCapture
DCBA DCBA
DCBC
DCCB
DCEFCB
DCF
DCOM DCOM
dcommon dcommon
dcomp dcomp
dcompi
DComposition DComposition
dcr dcr
dcs dcs
DDCDD
DDCE
DDEIf DDEIf
DDevice DDevice
ddf ddf
@@ -463,7 +380,6 @@ debugbreak
DECLAR DECLAR
declspec declspec
decryptor decryptor
DED
Dedup Dedup
DEFAULTBOOTSTRAPPERINSTALLFOLDER DEFAULTBOOTSTRAPPERINSTALLFOLDER
DEFAULTCOLOR DEFAULTCOLOR
@@ -485,7 +401,6 @@ DENORMAL
Deondre Deondre
depersist depersist
deprioritized deprioritized
depsfileslistspath
deref deref
DESKTOPABSOLUTEEDITING DESKTOPABSOLUTEEDITING
DESKTOPABSOLUTEPARSING DESKTOPABSOLUTEPARSING
@@ -500,9 +415,6 @@ DEVMODEW
DEVMON DEVMON
devpkey devpkey
DEVSOURCE DEVSOURCE
DFAB
DFB
DFBEA
DIIRFLAG DIIRFLAG
dimm dimm
directshow directshow
@@ -549,13 +461,11 @@ dvr
DVSD DVSD
DVSL DVSL
DVTARGETDEVICE DVTARGETDEVICE
DWINRT
dwl dwl
dwm dwm
dwmapi dwmapi
DWMCOLORIZATIONCOLORCHANGED DWMCOLORIZATIONCOLORCHANGED
DWMCOMPOSITIONCHANGED DWMCOMPOSITIONCHANGED
dwmcorei
DWMNCRENDERINGCHANGED DWMNCRENDERINGCHANGED
Dwmp Dwmp
DWMSENDICONICLIVEPREVIEWBITMAP DWMSENDICONICLIVEPREVIEWBITMAP
@@ -571,41 +481,13 @@ dxgi
dxgidebug dxgidebug
dxgiformat dxgiformat
dxguid dxguid
EAAFE
EABF
EAC
EADC
EAF
EBCF
EBD
EBE
ecl
ecount ecount
EData EData
EDB
EDCCC
EDFAE
Edid Edid
edis
EDITKEYBOARD EDITKEYBOARD
editkeyboardwindow editkeyboardwindow
EDITSHORTCUTS EDITSHORTCUTS
editshortcutswindow editshortcutswindow
edshift
EEA
EEB
EEBBE
EEBD
EED
EEDA
EEEE
EEF
EEFA
EFB
EFC
EFDD
EFE
EFFEFC
EFile EFile
eip eip
ekus ekus
@@ -634,7 +516,6 @@ ERRORTITLE
ESettings ESettings
esize esize
esrp esrp
estructuredtext
etl etl
etstat etstat
etw etw
@@ -672,45 +553,14 @@ EXTENDEDKEY
EXTENDEDVERBS EXTENDEDVERBS
EXTRINSICPROPERTIES EXTRINSICPROPERTIES
eyetracker eyetracker
FABC
FAEDDA
FAF
FAFD
fancymouse fancymouse
fancyzone fancyzone
FANCYZONESDRAWLAYOUTTEST FANCYZONESDRAWLAYOUTTEST
FANCYZONESEDITOR FANCYZONESEDITOR
Farbraum Farbraum
FARPROC FARPROC
FBB
FBC
FBDE
FBF
FCAE
FCB
FCCFF
FCD
FCDB
FCDD
FCE
FDB
FDBF
FDC
FDCD
FDE
FDEF
FDF
fdw fdw
FECF
FEDF
FEEF
feimage feimage
FFB
FFBCF
FFBE
FFDDD
FFEB
FFEBEF
fff fff
fileapi fileapi
FILEEXPLORER FILEEXPLORER
@@ -787,14 +637,12 @@ GPOCA
gpp gpp
GPT GPT
gpu gpu
graphql
GSM GSM
gtm gtm
gui gui
guiddata guiddata
guiddef guiddef
guidgenerator guidgenerator
GUIDv
GUITHREADINFO GUITHREADINFO
GValue GValue
gwl gwl
@@ -1022,7 +870,6 @@ JPN
jpnime jpnime
Jsons Jsons
jsonval jsonval
julia
junja junja
jxr jxr
jyuwono jyuwono
@@ -1047,11 +894,9 @@ keynum
keyremaps keyremaps
Keytool Keytool
keyup keyup
Kfiles
KILLFOCUS KILLFOCUS
killrunner killrunner
Knownfolders Knownfolders
kotlin
KSPROPERTY KSPROPERTY
Kybd Kybd
LAlt LAlt
@@ -1083,7 +928,6 @@ LError
Lessthan Lessthan
LEVELID LEVELID
LExit LExit
lexon
lhs lhs
lhwnd lhwnd
LIBID LIBID
@@ -1283,7 +1127,6 @@ msc
msclr msclr
mscorlib mscorlib
msdata msdata
msdax
msedge msedge
MSGFLT MSGFLT
MSIFASTINSTALL MSIFASTINSTALL
@@ -1300,7 +1143,6 @@ msrc
msstore msstore
mst mst
msvc msvc
msvcp
MTND MTND
Mul Mul
MULTIPLEUSE MULTIPLEUSE
@@ -1310,7 +1152,6 @@ mwb
MWBEx MWBEx
myfile myfile
MYICON MYICON
mysql
NAMECHANGE NAMECHANGE
nameof nameof
namespaceanddescendants namespaceanddescendants
@@ -1360,7 +1201,6 @@ NIF
nint nint
NLD NLD
NLog NLog
nls
NLSTEXT NLSTEXT
NNN NNN
NOACTIVATE NOACTIVATE
@@ -1490,7 +1330,6 @@ PARENTRELATIVEPARSING
PArgb PArgb
parray parray
PARTIALCONFIRMATIONDIALOGTITLE PARTIALCONFIRMATIONDIALOGTITLE
pascaligo
pasteplain pasteplain
PATCOPY PATCOPY
pathcch pathcch
@@ -1532,7 +1371,6 @@ pfn
pfo pfo
pft pft
pgp pgp
pgsql
pguid pguid
PHANDLE PHANDLE
phbm phbm
@@ -1560,12 +1398,10 @@ Pnp
Popups Popups
POPUPWINDOW POPUPWINDOW
posix posix
postiats
poweraccent poweraccent
powerlauncher powerlauncher
POWEROCR POWEROCR
powerpreview powerpreview
powerquery
powerrename powerrename
POWERRENAMECONTEXTMENU POWERRENAMECONTEXTMENU
powerrenameinput powerrenameinput
@@ -1607,9 +1443,9 @@ printmanagement
prm prm
proactively proactively
PROCESSKEY PROCESSKEY
processthreadsapi
PRODEXT PRODEXT
PRODUCTVERSION PRODUCTVERSION
productwxspath
Progman Progman
programdata programdata
PROGRAMFILES PROGRAMFILES
@@ -1686,7 +1522,6 @@ RECTL
rectp rectp
rects rects
redirectedfrom redirectedfrom
redis
Redist Redist
redistributable redistributable
reencode reencode
@@ -1719,7 +1554,6 @@ REMAPSUCCESSFUL
REMAPUNSUCCESSFUL REMAPUNSUCCESSFUL
Remotable Remotable
remoteip remoteip
Removedir
Removelnk Removelnk
renamable renamable
RENAMEONCOLLISION RENAMEONCOLLISION
@@ -1786,7 +1620,6 @@ rungameid
RUNLEVEL RUNLEVEL
runsettings runsettings
runtimeclass runtimeclass
runtimedepsjsonpath
runtimeobject runtimeobject
runtimepack runtimepack
runtimes runtimes
@@ -1894,6 +1727,7 @@ SHOWNOACTIVATE
SHOWNORMAL SHOWNORMAL
SHOWWINDOW SHOWWINDOW
shtypes shtypes
sia
SIATTRIBFLAGS SIATTRIBFLAGS
SICHINT SICHINT
sid sid
@@ -2028,7 +1862,6 @@ SYSMENU
SYSTEMAPPS SYSTEMAPPS
systemroot systemroot
SYSTEMTIME SYSTEMTIME
systemverilog
sysvol sysvol
Tadele Tadele
talynone talynone
@@ -2048,7 +1881,6 @@ taskkill
tasklist tasklist
taskschd taskschd
tchar tchar
tcl
Tcollab Tcollab
tcp tcp
tcs tcs
@@ -2071,7 +1903,6 @@ textblock
TEXTEXTRACTOR TEXTEXTRACTOR
TEXTINCLUDE TEXTINCLUDE
tgz tgz
themeresources
THH THH
THICKFRAME THICKFRAME
THISCOMPONENT THISCOMPONENT
@@ -2122,9 +1953,7 @@ TYPESHORTCUT
UAC UAC
UAL UAL
uap uap
uby
udit udit
Udk
Udp Udp
uefi uefi
UHash UHash
@@ -2169,6 +1998,7 @@ USEDEFAULT
USEFILEATTRIBUTES USEFILEATTRIBUTES
USERDATA USERDATA
USERDOMAIN USERDOMAIN
Userenv
userprofile userprofile
USESHOWWINDOW USESHOWWINDOW
USESTDHANDLES USESTDHANDLES
@@ -2186,16 +2016,12 @@ valuegenerator
Vanara Vanara
variantassignment variantassignment
vcamp vcamp
vccorlib
vcdl vcdl
vcgtq vcgtq
VCINSTALLDIR VCINSTALLDIR
vcm vcm
vcomp
Vcpkg Vcpkg
vcproj
VCRT VCRT
vcruntime
vcvars vcvars
VDesktop VDesktop
vdi vdi
@@ -2308,7 +2134,7 @@ WINL
winlogon winlogon
winmd winmd
winmm winmm
WINNT winnt
winres winres
winrt winrt
winsdk winsdk
@@ -2353,7 +2179,6 @@ workspaces
wox wox
wparam wparam
wpf wpf
wpfdepsjsonpath
wpftmp wpftmp
wpr wpr
wprp wprp
@@ -2380,7 +2205,6 @@ WTS
wtsapi wtsapi
WTSAT WTSAT
Wubi Wubi
wuceffectsi
WVC WVC
Wwan Wwan
Wwanpp Wwanpp
@@ -2392,7 +2216,6 @@ XBUTTON
XBUTTONDBLCLK XBUTTONDBLCLK
XBUTTONDOWN XBUTTONDOWN
XBUTTONUP XBUTTONUP
xcopy
XDocument XDocument
XDOWN XDOWN
XElement XElement
@@ -2417,7 +2240,6 @@ yinwang
yinyue yinyue
YOffset YOffset
YPels YPels
ypescript
YResolution YResolution
YStr YStr
YUY YUY

View File

@@ -133,6 +133,7 @@
<InstallExecuteSequence> <InstallExecuteSequence>
<Custom Action="DetectPrevInstallPath" After="AppSearch" /> <Custom Action="DetectPrevInstallPath" After="AppSearch" />
<Custom Action="SetRegisterPowerToysSchTaskParam" Before="RegisterPowerToysSchTask" /> <Custom Action="SetRegisterPowerToysSchTaskParam" Before="RegisterPowerToysSchTask" />
<Custom Action="SetLaunchPowerToysParam" Before="LaunchPowerToys" />
<Custom Action="SetApplyModulesRegistryChangeSetsParam" Before="ApplyModulesRegistryChangeSets" /> <Custom Action="SetApplyModulesRegistryChangeSetsParam" Before="ApplyModulesRegistryChangeSets" />
<Custom Action="SetUnApplyModulesRegistryChangeSetsParam" Before="UnApplyModulesRegistryChangeSets" /> <Custom Action="SetUnApplyModulesRegistryChangeSetsParam" Before="UnApplyModulesRegistryChangeSets" />
<Custom Action="RegisterPowerToysSchTask" After="InstallFiles"> <Custom Action="RegisterPowerToysSchTask" After="InstallFiles">
@@ -171,17 +172,22 @@
</Custom>--> </Custom>-->
<Custom Action="TerminateProcesses" Before="InstallValidate" /> <Custom Action="TerminateProcesses" Before="InstallValidate" />
<Custom Action="LaunchPowerToys" After="InstallFinalize">NOT Installed</Custom> <Custom Action="LaunchPowerToys" Before="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence> </InstallExecuteSequence>
<CustomAction Id="SetLaunchPowerToysParam"
Property="LaunchPowerToys"
Value="[INSTALLFOLDER]" />
<CustomAction <CustomAction
Id="LaunchPowerToys" Id="LaunchPowerToys"
Execute="immediate" Return="ignore"
Impersonate="yes" Impersonate="yes"
Return="asyncNoWait" Execute="deferred"
FileKey="PowerToys.exe" BinaryKey="PTCustomActions"
ExeCommand="--dont-elevate" /> DllEntry="LaunchPowerToysCA"
/>
<CustomAction <CustomAction
Id="TerminateProcesses" Id="TerminateProcesses"

View File

@@ -2,7 +2,6 @@
#include "resource.h" #include "resource.h"
#include "RcResource.h" #include "RcResource.h"
#include <ProjectTelemetry.h> #include <ProjectTelemetry.h>
#include <spdlog/sinks/base_sink.h> #include <spdlog/sinks/base_sink.h>
#include "../../src/common/logger/logger.h" #include "../../src/common/logger/logger.h"
@@ -16,6 +15,11 @@
#include <winrt/Windows.Foundation.h> #include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Management.Deployment.h> #include <winrt/Windows.Management.Deployment.h>
#include <wtsapi32.h>
#include <processthreadsapi.h>
#include <UserEnv.h>
#include <winnt.h>
using namespace std; using namespace std;
HINSTANCE DLL_HANDLE = nullptr; HINSTANCE DLL_HANDLE = nullptr;
@@ -50,6 +54,160 @@ LExit:
return hr; return hr;
} }
BOOL IsLocalSystem()
{
HANDLE hToken;
UCHAR bTokenUser[sizeof(TOKEN_USER) + 8 + 4 * SID_MAX_SUB_AUTHORITIES];
PTOKEN_USER pTokenUser = (PTOKEN_USER)bTokenUser;
ULONG cbTokenUser;
SID_IDENTIFIER_AUTHORITY siaNT = SECURITY_NT_AUTHORITY;
PSID pSystemSid;
BOOL bSystem;
// open process token
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_QUERY,
&hToken))
return FALSE;
// retrieve user SID
if (!GetTokenInformation(hToken, TokenUser, pTokenUser,
sizeof(bTokenUser), &cbTokenUser))
{
CloseHandle(hToken);
return FALSE;
}
CloseHandle(hToken);
// allocate LocalSystem well-known SID
if (!AllocateAndInitializeSid(&siaNT, 1, SECURITY_LOCAL_SYSTEM_RID,
0, 0, 0, 0, 0, 0, 0, &pSystemSid))
return FALSE;
// compare the user SID from the token with the LocalSystem SID
bSystem = EqualSid(pTokenUser->User.Sid, pSystemSid);
FreeSid(pSystemSid);
return bSystem;
}
UINT __stdcall LaunchPowerToysCA(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
std::wstring installationFolder, path, args;
std::wstring commandLine;
hr = WcaInitialize(hInstall, "LaunchPowerToys");
ExitOnFailure(hr, "Failed to initialize");
hr = getInstallFolder(hInstall, installationFolder);
ExitOnFailure(hr, "Failed to get installFolder.");
path = installationFolder;
path += L"\\PowerToys.exe";
args = L"--dont-elevate";
commandLine = L"\"" + path + L"\" ";
commandLine += args;
BOOL isSystemUser = IsLocalSystem();
if (isSystemUser) {
HANDLE hUserToken = NULL;
DWORD dwSessionId;
ProcessIdToSessionId(GetCurrentProcessId(), &dwSessionId);
auto rv = WTSQueryUserToken(dwSessionId, &hUserToken);
if (rv == 0)
{
ExitOnFailure(hr, "Failed to query user token");
}
HANDLE hUserTokenDup;
if (DuplicateTokenEx(hUserToken, TOKEN_ALL_ACCESS, NULL, SECURITY_IMPERSONATION_LEVEL::SecurityImpersonation, TOKEN_TYPE::TokenPrimary, &hUserTokenDup) == 0)
{
CloseHandle(hUserToken);
CloseHandle(hUserTokenDup);
ExitOnFailure(hr, "Failed to duplicate user token");
}
if (ImpersonateLoggedOnUser(hUserTokenDup))
{
STARTUPINFO startupInfo{ .cb = sizeof(STARTUPINFO), .wShowWindow = SW_SHOWNORMAL };
PROCESS_INFORMATION processInformation;
PVOID lpEnvironment = NULL;
CreateEnvironmentBlock(&lpEnvironment, hUserTokenDup, FALSE);
CreateProcessAsUser(
hUserTokenDup,
NULL,
commandLine.data(),
NULL,
NULL,
FALSE,
CREATE_DEFAULT_ERROR_MODE | CREATE_UNICODE_ENVIRONMENT,
lpEnvironment,
NULL,
&startupInfo,
&processInformation);
if (!CloseHandle(processInformation.hProcess))
{
er = ERROR_INSTALL_FAILURE;
}
if (!CloseHandle(processInformation.hThread))
{
er = ERROR_INSTALL_FAILURE;
}
RevertToSelf();
CloseHandle(hUserToken);
CloseHandle(hUserTokenDup);
}
else
{
ExitOnFailure(hr, "Failed to duplicate user token");
}
}
else
{
STARTUPINFO startupInfo{ .cb = sizeof(STARTUPINFO), .wShowWindow = SW_SHOWNORMAL };
PROCESS_INFORMATION processInformation;
// Start the resizer
CreateProcess(
NULL,
commandLine.data(),
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&startupInfo,
&processInformation);
if (!CloseHandle(processInformation.hProcess))
{
ExitOnFailure(hr, "Failed to close process handle");
}
if (!CloseHandle(processInformation.hThread))
{
ExitOnFailure(hr, "Failed to close thread handle");
}
}
LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}
UINT __stdcall CheckGPOCA(MSIHANDLE hInstall) UINT __stdcall CheckGPOCA(MSIHANDLE hInstall)
{ {
HRESULT hr = S_OK; HRESULT hr = S_OK;

View File

@@ -1,6 +1,7 @@
LIBRARY "PowerToysSetupCustomActions" LIBRARY "PowerToysSetupCustomActions"
EXPORTS EXPORTS
LaunchPowerToysCA
CheckGPOCA CheckGPOCA
ApplyModulesRegistryChangeSetsCA ApplyModulesRegistryChangeSetsCA
CreateScheduledTaskCA CreateScheduledTaskCA

View File

@@ -88,7 +88,7 @@
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalDependencies>WindowsApp.lib;Newdev.lib;Crypt32.lib;msi.lib;wcautil.lib;Psapi.lib;Pathcch.lib;comsupp.lib;taskschd.lib;Secur32.lib;msi.lib;dutil.lib;wcautil.lib;Version.lib;Shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>Userenv.lib;Wtsapi32.lib;WindowsApp.lib;Newdev.lib;Crypt32.lib;msi.lib;wcautil.lib;Psapi.lib;Pathcch.lib;comsupp.lib;taskschd.lib;Secur32.lib;msi.lib;dutil.lib;wcautil.lib;Version.lib;Shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>CustomAction.def</ModuleDefinitionFile> <ModuleDefinitionFile>CustomAction.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>