Supposons le scénario suivant :
- On écrit un script ou une application qui doit déclencher le processus d'auto-inscription pour l'utilisateur actuellement connecté.
- On constate alors que la tâche prévue ne peut pas être exécutée.
- Le message d'erreur est le suivant
The user account does not have permissions to run this task.
Le terme d'auto-enrollment désigne la demande automatique de certificats dans l'écosystème Windows. Les systèmes qui sont membres d'une structure globale Active Directory peuvent ainsi demander et renouveler automatiquement des certificats auprès d'une autorité de certification intégrée dans Active Directory (angl. Enterprise Certification Authority). Pour plus d'informations, voir l'article „Bases de la demande manuelle et automatique de certificats via Lightweight Directory Access Protocol (LDAP) et Remote Procedure Call / Distributed Common Object Model (RPC/DCOM)„ .
Le processus d'auto-enrôlement est lancé via des tâches planifiées prédéfinies (sous „Microsoft“ - „Windows“ - „CertificateServicesClient“).

Outre les déclencheurs automatiques, il peut par exemple être exécuté à l'aide de la commande de ligne de commande suivante :
certutil -pulse -user
Si l'on jette un coup d'œil au planificateur de tâches, on constate que cette commande exécute apparemment la tâche planifiée „UserTask“.

Si l'on essaie de démarrer manuellement la „UserTask“, on obtient toutefois un message d'erreur indiquant qu'elle ne peut pas être stackée en raison d'un manque de droits.

On obtient le même résultat lorsqu'on l'appelle via Windows PowerShell avec le „ ".„Start-ScheduledTask“ Commande :
Get-ScheduledTask -TaskName UserTask | Start-ScheduledTask Start-ScheduledTask : Access is denied. At line:1 char:40 + Get-ScheduledTask -TaskName UserTask | Start-ScheduledTask +~~~~~~~~~~~~~~~~~~~ + CategoryInfo : PermissionDenied: (PS_ScheduledTask:Root/Microsoft/…S_ScheduledTask) [Start-ScheduledTask], CimException + FullyQualifiedErrorId : HRESULT 0x80070005,Start-ScheduledTask
Le problème semble venir du fait que la „UserTask“ est configurée pour être exécutée avec le principal „INTERACTIVE“.

Si l'on analyse le fichier certutil.exe (par exemple avec le programme Moniteur API de Rohitab Batra), on se rend compte qu'ici, manifestement, les TaskScheduler classe est appelée.

Il s'agit d'un objet COM („Schedule.Service“) accessible entre autres via C# et PowerShell. Il possède une RunEx méthode, qui est associée au drapeau TASK_RUN_AS_SELF ce qui a pour conséquence que la tâche est exécutée sous l'identité de l'utilisateur actuellement connecté.
Exemple de code
Connaissez-vous TameMyCerts? TameMyCerts est un add-on pour l'autorité de certification Microsoft (Active Directory Certificate Services). Il étend la fonction de l'autorité de certification et permet de Application de la réglementationIl s'agit d'un logiciel de gestion des certificats qui permet d'automatiser l'émission de certificats en toute sécurité. TameMyCerts est unique dans l'écosystème Microsoft, a déjà fait ses preuves dans d'innombrables entreprises du monde entier et est disponible sous une licence libre. Il peut téléchargé via GitHub et être utilisé gratuitement. Une maintenance professionnelle est également proposée.
Windows PowerShell
Voici un exemple de code fonctionnel :
New-Variable -Option Constant -Name TaskRunFlags -Value @{
TASK_RUN_NO_FLAGS = 0
TASK_RUN_AS_SELF = 1
TASK_RUN_IGNORE_CONSTRAINTS = 2
TASK_RUN_USE_SESSION_ID = 3
TASK_RUN_USER_SID = 4
}
$TaskScheduler = New-Object -ComObject("Schedule.Service")
$TaskScheduler.Connect()
$UserTask = $TaskScheduler.GetFolder("Microsoft\Windows\CertificateServicesClient").GetTask("UserTask")
$UserTask.RunEx(
$null,
$TaskRunFlags.TASK_RUN_AS_SELF,
0,
$null
)
C#
Un exemple de code pour C# pourrait se présenter comme suit :
using TaskScheduler;
var Scheduler = new TaskScheduler.TaskScheduler();
Scheduler.Connect();
var UserTask = Scheduler.GetFolder("Microsoft\Windows\CertificateServicesClient").GetTask("UserTask");
UserTask.RunEx(
null,
(int)_TASK_RUN_FLAGS.TASK_RUN_AS_SELF,
0,
null
);
Il faut configurer une référence à l'objet COM TaskScheduler dans le projet Visual Studio.
