buildTaskXml function
Builds the Task Scheduler definition XML for d.
System scope runs at boot as LocalSystem (S-1-5-18) with elevation;
user scope runs at logon for currentUser with an interactive token. The
action is wrapped in cmd.exe /c so OMNYSHELL_HOME can be set inline
(Task Scheduler has no per-task environment) and stdout/stderr can be
appended to logPath. The task has no execution time limit (so the daemon
is not killed after the default 72 h) and restarts on failure.
Implementation
String buildTaskXml(
svc.ServiceDescriptor d, {
required String logPath,
String? currentUser,
}) {
final system = d.scope == svc.ServiceScope.system;
final args = _commandLine(d, logPath);
final triggers = system
? '<BootTrigger><Enabled>true</Enabled></BootTrigger>'
: '<LogonTrigger><Enabled>true</Enabled>'
'${currentUser == null ? '' : '<UserId>${_xml(currentUser)}</UserId>'}'
'</LogonTrigger>';
final principal = system
? '<UserId>S-1-5-18</UserId>'
'<RunLevel>HighestAvailable</RunLevel>'
: '${currentUser == null ? '' : '<UserId>${_xml(currentUser)}</UserId>'}'
'<LogonType>InteractiveToken</LogonType>'
'<RunLevel>LeastPrivilege</RunLevel>';
return '''
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<RegistrationInfo>
<Description>${_xml(d.description)}</Description>
</RegistrationInfo>
<Triggers>
$triggers
</Triggers>
<Principals>
<Principal id="Author">
$principal
</Principal>
</Principals>
<Settings>
<AllowStartOnDemand>true</AllowStartOnDemand>
<RestartOnFailure>
<Interval>PT1M</Interval>
<Count>9999</Count>
</RestartOnFailure>
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
<AllowHardTerminate>true</AllowHardTerminate>
<StartWhenAvailable>true</StartWhenAvailable>
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
<Priority>7</Priority>
<Enabled>true</Enabled>
</Settings>
<Actions Context="Author">
<Exec>
<Command>cmd.exe</Command>
<Arguments>${_xml(args)}</Arguments>
</Exec>
</Actions>
</Task>
''';
}