如何使用PowerShell在Windows 10中管理UWP应用程序的启动项?

3

我希望能够通过PowerShell启用/禁用UWP应用程序的启动项,但我尝试使用gcim win32_startupcommandGet-Item HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run,但它们都找不到,shell:startup也是空的,似乎UWP应用程序是不可见的,只能在任务管理器->启动中看到,那我该怎么办呢?

我尝试使用Regshot比较启用启动项前后的差异,如下:

Regshot compare result

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

3个回答

7

在原生调用[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
}

要了解可能的State值的更多信息,请参见:https://learn.microsoft.com/zh-cn/uwp/api/windows.applicationmodel.startuptaskstate?view=winrt-19041

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

享受吧。


谢谢回复,这个脚本非常有用。它确实可以切换启动项的状态。唯一的问题是,在我安装应用程序之后,如果我没有启动应用程序或打开任务管理器,注册表键将不存在,因此这个脚本就无法工作。 - undefined
你可以在上面的PowerShell脚本中的Set-ItemProperty命令中添加-Force标志,以创建键和值(如果它们尚不存在)。可选的-ErrorAction SilentlyContinue也可以使脚本运行更干净,但这是一个需要谨慎使用的选项。因此,第一条语句看起来应该是这样的:Set-ItemProperty -Path $regKey -Name UserEnabledStartupOnce -Value 1 -Force -ErrorAction SilentlyContinue - undefined

1
这是 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://learn.microsoft.com/en-us/uwp/api/windows.applicationmodel.startuptask.disable?view=winrt-19041

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

[Windows.ApplicationModel.StartupTask]

如果有人告诉我如何使用C#实现,我可以将其翻译成PowerShell。


感谢您的回复,通过比较我也得到了类似的结果,但最终我认为这个解决方案太复杂了,因为我发现在安装了UWP应用之后,如果应用或任务管理器没有启动,这些注册表键甚至都不存在。所以我放弃了这个方法,再次感谢您。 - undefined

0

运行命令(@js2010的PowerShell脚本)在命令提示符中,禁用任何UWP应用程序在登录时启动:

powershell -c "$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 | % { $fname = $_.PackageFamilyName; $_.taskid | % { $taskid = $_; Set-ItemProperty \"HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\$fname\$taskid\" State 1 -Force } }"

BATch/CMD文件中运行:

powershell -c "$starts = get-appxpackage -pv 应用程序 | get-appxpackagemanifest | foreach { if ($_.package.Applications.Application.Extensions.extension.startuptask.taskid) { [pscustomobject] @{ PackageFamilyName = $app.PackageFamilyName; TaskID = $_.package.Applications.Application.Extensions.extension.startuptask.taskid} } }; $starts | foreach { $fname = $_.PackageFamilyName; $_.taskid | foreach { $taskid = $_; Set-ItemProperty \"HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\$fname\$taskid\" State 1 -Force } }"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接