2016-08-31 1 views
0

Mon programme d'installation installe actuellement quelques fichiers dans un répertoire, puis exécute certains scripts CustomAction pour créer 2 tâches planifiées nommées Script1 et Script2.WiX CustomAction avec privilèges élevés SCHTASKS "Accès refusé"

J'ai deux autres scripts CustomAction appelés RemoveScript1 et RemoveScript2.

Ils sont du même type 34 OPN avec les attributs suivants:

<CustomAction Id="XXXXXX" 
       Directory="AFolder" 
       ExeCommand="XXXXXX" 
       Execute="deferred" 
       Impersonate="no" 
       Return="asyncWait" /> 

Et la séquence suivante d'installation.

<InstallExecuteSequence> 
    <Custom Action="RemoveScript1" Before="InstallFinalize" >REMOVE="ALL"</Custom> 
    <Custom Action="RemoveScript2" Before="InstallFinalize" >REMOVE="ALL"</Custom> 
    <Custom Action="Script1" Before="InstallFinalize" >(NOT Installed) OR MaintenanceMode="Modify"</Custom> 
    <Custom Action="Script2" Before="InstallFinalize" >(NOT Installed) OR MaintenanceMode="Modify"</Custom> 
</InstallExecuteSequence> 

Exemple Créer script:

SCHTASKS.exe /Create /TN NAME /TR "pathtosomeexe" /SC ONEVENT /EC System /MO *[System/EventID=XXXX] /F 

Exemple Supprimer script:

SCHTASKS /Delete /TN NAME /F 

Le créer des scripts exécutent bien, cependant, les scripts de suppression ne semblent pas fonctionner. Lors de la vérification des journaux, je vois les lignes suivantes liées à RemoveScriptX.

  • MSI (s) (60: B0) [17: 20: 49: 555]: Action Faire: RemoveScript1
  • Action start 17:20:49: RemoveScript1.
  • Action terminée 17:20:49: RemoveScript1. Valeur de retour 1.
  • MSI (s) (60: B0) [17: 20: 49: 649]: exécution op: ActionStart (Name = RemoveScript1 ,,)
  • MSI (s) (60: B0) [ 17: 20: 49: 649]: Exécution de op: CustomActionSchedule (Action = RemoveScript1, ActionType = 3234, Source = Dossier, Cible \: \ Windows \ SysWOW64 \ SCHTASKS.exe/Supprimer/TN NOM/F,)
  • 1: RemoveScript1 2: 1631

Lorsque j'essaie de supprimer ces scripts créés par le programme d'installation, en utilisant la ligne de commande normale, j'obtiens "ERREUR: l'accès est refusé". . Qui est genial! Cela signifie que les tâches planifiées ont été créées par admin. Je peux supprimer la tâche en utilisant la ligne de commande d'administration comme prévu.

Si je crée une tâche en utilisant la ligne de commande normale, je peux la supprimer normalement comme prévu.

Je dois noter que j'ai essayé à la fois InstallScope = perMachine, et perUser. La seule différence semble être que je dois exécuter le programme d'installation en tant qu'administrateur pour perUser afin d'accéder au répertoire ProgramFiles pour l'installation des autres fichiers.

Pourquoi mes scripts de suppression n'utilisent-ils pas les privilèges admin/elevated? Ai-je manqué quelque chose de stupide? J'avais supposé que "1631" était le code d'erreur retourné par SCHTASKS.exe, corrigez-moi si je me trompe.

OS: Windows 10

WixVersion: 3.10

+0

Comment créez-vous la tâche en premier lieu? L'erreur est probablement que vous essayez de supprimer une tâche du contexte système qui ne contient pas cette tâche car elle a été créée dans le contexte de l'utilisateur lors de l'installation. Si vous mettez/RU "SYSTEM" dans votre SCHTASKS/CREATE il peut résoudre ce problème. –

+0

Je viens d'essayer ça. La tâche crée toujours, mais elle ne supprime pas. Il semblerait que les tâches ne créent pas en utilisant "perMachine" sans/RU "SYSTEM" cependant. –

+0

Je ne sais pas quelle serait la solution alors, c'était juste une supposition. Il semble qu'il existe des journaux pour les schtasks dans C: \ windows \ tasks \ schedlgu.txt s'ils existent, ils peuvent apporter plus de lumière sur le problème. L'erreur 1631, je pense est juste une erreur générique d'action personnalisée a échoué. –

Répondre

0

Cela peut ne pas être la solution idéale, mais il est comment je résolu le problème.

Au lieu d'appeler SCHTASKS avec les arguments comme ceci:

[SystemFolder]SCHTASKS.exe /Create /TN TASKNAME 

Je place appelé POWERSHELL donner SCHTASKS et ses arguments comme suit:

[POWERSHELLEXE] &amp; SCHTASKS /Create /TN TASKNAME 

Je ne peux pas poster le code exact je pour la version powershell que je suis passé à l'aide de WiX QtExec http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html.

Il faut placer le script dans l'attribut "Value" au lieu de "ExeCommand" utilisé dans la question initiale, et le formatage est légèrement différent pour chacun.