C# 如何使用powershell管理windwos 10中uwp应用程序的启动项?

C# 如何使用powershell管理windwos 10中uwp应用程序的启动项?,c#,powershell,uwp,startup,C#,Powershell,Uwp,Startup,我希望通过powershell启用/禁用uwp应用程序的启动项,但我尝试使用gcim win32\u startupcommand和获取项目HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run但找不到它们,shell:startup也为空,似乎uwp应用程序是不可见的,只能在任务管理器->启动中看到,所以我应该怎么做 我尝试使用Regshot来比较启用启动项之前和之后的差异,如下所示: 此外,我

我希望通过powershell
启用/禁用
uwp应用程序的启动项,但我尝试使用
gcim win32\u startupcommand
获取项目HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\StartupApproved\Run
但找不到它们,
shell:startup
也为空,似乎uwp应用程序是不可见的,只能在任务管理器->启动中看到,所以我应该怎么做

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


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

以下是skype应用程序启动信息在注册表中的位置示例。注册表项名称似乎不标准;也许你可以从清单上或者其他什么地方得到钥匙的名字。Uwp应用程序给管理员带来不便。即使系统内部自动运行也不会检测到这些

$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\u kzf8qxf38zg5c\SkypeStartup\State=1(dword)(从procmon类别写入)

Windows终端:

HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\Microsoft.WindowsTerminal\u 8wekyb3d8bbwe\StartTerminalOnLoginTask\State=1

iTunes有两个启动任务:

HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\AppleInc.iTunes\u nzyj5cx40ttqa\ApplemobiledDeviceProcess\State

HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\SystemAppData\AppleInc.iTunes\u nzyj5cx40ttqa\iTunesHelper\State

也许是这个

[Windows.ApplicationModel.StartupTask]


如果有人告诉我如何使用C#,我可以将其转换为Powershell。

在实现对[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
}
有关可能的状态值的更多信息,请参阅:

有关如何将这些任务内置到UWP应用程序中的示例,请参阅:


享受。

谢谢你的回复,我通过比较得到了类似的结果,但我最终觉得这个解决方案太复杂了,因为我发现UWP应用安装后,如果应用或任务管理器没有启动,这些注册表项甚至不存在,我放弃了,再次感谢你的回复,这个脚本非常有用。它确实可以切换启动项的状态。唯一的问题是,在我安装应用程序后,如果我没有启动应用程序或打开任务管理器,注册表项将不存在,脚本将无法工作。