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



应用程序需要保持在 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>MU15Utente</Author>
  </RegistrationInfo>
  <Triggers>
    <LogonTrigger>
      <Enabled>true</Enabled>
    </LogonTrigger>
  </Triggers>
  <Principals>
    <Principal id="Author">
      <UserId>MU15Utente</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)pathtoapplication.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%MicrosoftWindowsStart MenuProgramsStartup中放置快捷方式,但没有成功。

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

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

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

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

<MultipleInstancesPolicy>StopExisting</MultipleInstancesPolicy>

最新更新