在Windwos 10中,如何使用Powershell管理uwp应用程序的启动项?

问题描述

我希望通过Powershell enable/disable来启动uwp应用程序的启动项,但是我尝试使用gcim win32_startupcommandGet-Item HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run却找不到它们,shell:startup也是为空,看来uwp应用程序是不可见的,只能在任务管理器->启动中看到,所以我该怎么办?

我尝试使用Regshot比较启用启动项之前和之后的区别,如下所示:

Regshot compare result

此外,我发现在启动UWP或任务管理器之前这些注册表项并不存在,因此最后我认为这可能是一个非常复杂的解决方案,我放弃了。

解决方法

在实现对 [Windows.ApplicationModel.StartupTask] :: RequestEnableSync() :: Disable()方法的本机调用之前,这是一个潜在的解决方法。

在此示例中,我切换了Skype桌面扩展启动任务的状态:

$app = (Get-AppxPackage | Where-Object -Property Name -EQ -Value Microsoft.SkypeApp)
$pkgName = $app.PackageFamilyName
$startupTask = ($app | Get-AppxPackageManifest).Package.Applications.Application.Extensions.Extension | Where-Object -Property Category -Eq -Value windows.startupTask
$taskId = $startupTask.StartupTask.TaskId
$state = (Get-ItemProperty -Path "HKCU:Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\$pkgName\$taskId" -Name State).State
$regKey = "HKCU:Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\$pkgName\$taskId"
if ($state -in 0,1,3) {
    Set-ItemProperty -Path $regKey -Name UserEnabledStartupOnce -Value 1
    Set-ItemProperty -Path $regKey -Name State -Value 2
} else {
    $lastDisabled = [int](New-TimeSpan -Start (Get-Date '1970-01-01 00:00:00 GMT') -End (Get-Date)).TotalSeconds
    Set-ItemProperty -Path $regKey -Name LastDisabledTime -Value $lastDisabled
    Set-ItemProperty -Path $regKey -Name State -Value 1
}

有关可能的状态值的更多信息,请参见:https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.startuptaskstate?view=winrt-19041

有关如何在UWP应用程序中内置这些任务的示例,请参见:https://windowsadmins.com/configure-your-app-to-start-at-log-in/

享受。

,

这是一个Skype应用程序启动信息在注册表中的示例。注册表项名称似乎是非标准的;也许您可以从清单或其他内容中获取密钥的名称。 Uwp应用程序给管理员带来了不便。甚至Sysinternals Autoruns也无法检测到这些。

$a = Get-AppxPackage *skype* | Get-AppPackageManifest
$a.package.Applications.Application.Extensions.extension.startuptask.taskid
SkypeStartup

$a = get-appxpackage *windowsterminal* | Get-AppxPackageManifest
$a.package.Applications.Application.Extensions.extension.startuptask.taskid
StartTerminalOnLoginTask


# list all the app startups
$starts = get-appxpackage -pv app | get-appxpackagemanifest | % {
if ($_.package.Applications.Application.Extensions.extension.startuptask.taskid) {
  [pscustomobject] @{ PackageFamilyName = $app.PackageFamilyName
  TaskID = $_.package.Applications.Application.Extensions.extension.startuptask.taskid} } }
$starts

PackageFamilyName                       TaskID
-----------------                       ------
Microsoft.SkypeApp_kzf8qxf38zg5c        SkypeStartup
AppleInc.iTunes_nzyj5cx40ttqa           {AppleMobileDeviceProcess,iTunesHelper}
Microsoft.WindowsTerminal_8wekyb3d8bbwe StartTerminalOnLoginTask


# so maybe to disable startups by setting them to 1:
$starts | % {
  $fname = $_.PackageFamilyName
  $_.taskid | % {
    $taskid = $_
    Set-ItemProperty "HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\$fname\$taskid" State 1 -whatif
  }
}

What if: Performing the operation "Set Property" on target "Item: HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\Microsoft.SkypeApp_kzf8qxf38zg5c\SkypeStartup Property: State".
What if: Performing the operation "Set Property" on target "Item: HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\AppleInc.iTunes_nzyj5cx40ttqa\AppleMobileDeviceProcess Property: State".
What if: Performing the operation "Set Property" on target "Item: HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\AppleInc.iTunes_nzyj5cx40ttqa\iTunesHelper Property: State".
What if: Performing the operation "Set Property" on target "Item: HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\Microsoft.WindowsTerminal_8wekyb3d8bbwe\StartTerminalOnLoginTask Property: State".

2启用,1禁用。在“设置”应用中搜索“启动应用”。

Skype:

HKCU \ Software \ Classes \ Local Settings \ Software \ Microsoft \ Windows \ CurrentVersion \ AppModel \ SystemAppData \ Microsoft.SkypeApp_kzf8qxf38zg5c \ SkypeStartup \ State = 1(dword)(写入procmon类别)

Windows终端:

HKCU \ Software \ Classes \ Local Settings \ Software \ Microsoft \ Windows \ CurrentVersion \ AppModel \ SystemAppData \ Microsoft.WindowsTerminal_8wekyb3d8bbwe \ StartTerminalOnLoginTask \ State = 1

iTunes有2个启动任务:

HKCU \ Software \ Classes \ Local Settings \ Software \ Microsoft \ Windows \ CurrentVersion \ AppModel \ SystemAppData \ AppleInc.iTunes_nzyj5cx40ttqa \ AppleMobileDeviceProcess \ State

HKCU \ Software \ Classes \ Local Settings \ Software \ Microsoft \ Windows \ CurrentVersion \ AppModel \ SystemAppData \ AppleInc.iTunes_nzyj5cx40ttqa \ iTunesHelper \ State

也许是吗? https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.startuptask.disable?view=winrt-19041

https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.startuptask?view=winrt-19041

[Windows.ApplicationModel.StartupTask]

如果有人告诉我如何使用C#进行操作,则可以将其翻译为Powershell。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...