运行 启动时清单中 uiAccess = true 的 C# WPF 应用程序

Run C# WPF application with uiAccess = true in manifest at startup

应用程序需要保持在 Metro 之上,因此需要 uiAccess 标志。这是应用程序的最新更改。在以前的版本中,没有设置 uiAccess 标志,我们可以使用此计划任务在用户访问时将应用程序设置为 运行:

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
  <RegistrationInfo>
    <Date>2014-04-23T11:31:11.9188616</Date>
    <Author>MU15\Utente</Author>
  </RegistrationInfo>
  <Triggers>
    <LogonTrigger>
      <Enabled>true</Enabled>
    </LogonTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>MU15\Utente</UserId>
      <LogonType>InteractiveToken</LogonType>
      <RunLevel>HighestAvailable</RunLevel>
    </Principal>
  </Principals>
  <Settings>
    <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
    <DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
    <StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
    <AllowHardTerminate>false</AllowHardTerminate>
    <StartWhenAvailable>true</StartWhenAvailable>
    <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
    <IdleSettings>
      <StopOnIdleEnd>false</StopOnIdleEnd>
      <RestartOnIdle>false</RestartOnIdle>
    </IdleSettings>
    <AllowStartOnDemand>true</AllowStartOnDemand>
    <Enabled>true</Enabled>
    <Hidden>false</Hidden>
    <RunOnlyIfIdle>false</RunOnlyIfIdle>
    <WakeToRun>false</WakeToRun>
    <ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
    <Priority>7</Priority>
    <RestartOnFailure>
      <Interval>PT1M</Interval>
      <Count>3</Count>
    </RestartOnFailure>
  </Settings>
  <Actions Context="Author">
    <Exec>
      <Command>"C:\Program Files (x86)\path\to\application.exe"</Command>
    </Exec>
  </Actions>
</Task>

我们最近添加了以下应用程序清单:

<?xml version="1.0" encoding="utf-8"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="requireAdministrator" uiAccess="true" />
      </requestedPrivileges>
      <applicationRequestMinimum>
        <defaultAssemblyRequest permissionSetReference="Custom" />
        <PermissionSet ID="Custom" SameSite="site" Unrestricted="true" />
      </applicationRequestMinimum>
    </security>
  </trustInfo>
  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
    </application>
  </compatibility>
</assembly>

计划任务现在失败并出现错误 0x800702e4:请求的操作需要提升。

我们尝试在 %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup 中设置快捷方式,但没有成功。

有没有办法 运行 设置 uiAccess 标志的应用程序?

问题是任务计划程序默认使用 CreateProcess,这不适用于 运行 具有需要提升清单的进程:您需要使用 ShellExecuteEx 为此。

可能还有其他方法可以做到这一点,但至少其中一种方法是使用任务调度程序将任务配置为在任务已经 运行 时停止其他现有实例。

通过 GUI:Settings -> "If task is already running (etc.)",设置为 "Stop the existing instance",或在 XML:

<MultipleInstancesPolicy>StopExisting</MultipleInstancesPolicy>