démarrage d'un processus UAC élevé à partir d'un service non interactif (win32 / .net / powershell)

Je suis à l'aide d'une tierce partie service Windows qui gère les tâches d'automatisation en exécutant des scripts et exécutables à l'aide de CreateProcessAsUser(). Je suis en cours d'exécution dans les problèmes sur Windows Server 2008 en raison de l'UAC et de la façon dont le LUA élévation est gérée par le biais d'une Api.

Le service s'exécute en tant que système local et n'a pas de "Interagir Avec le Bureau" enabled". Les processus sont en cours d'exécution en tant qu'utilisateurs dans le groupe Administrateurs, mais pas le compte Administrateur (qui est exempté de nombreux UAC restrictions). Tout le contrôle de compte d'utilisateur paramètres par défaut.

Je peux passer des commandes arbitraires ou powershell code pour le service, mais je n'arrive pas à "sortir" de la non-élevée, non-processus interactif qui obtient lancé par le service.

Le nœud du problème semble être que la seule (public) de l'API option pour le démarrage d'un processus élevés est ShellExecute() avec le "runas" de verbe, mais aussi loin que je peux dire qui ne peut pas être appelée à partir d'un non-interactive de service ou si vous obtenez des erreurs du type "Cette opération nécessite une station windows interactive".

La seule solution que j'ai trouvé est mentionné ici:
http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx

Dans Vista, le fonctionnaire documentés
pour élever un processus est seulement à l'aide de la
shell API ShellExecute(Ex -) (pas
CreateProcess ou CreateProcessAsUser).
Si votre application doit appeler
ShellExecute(Ex) pour le lancement d'un helper
élevées pour appeler SendInput.
En outre, en raison de la Session 0
l'isolement, un service peut uniquement utiliser
CreateProcessAsUser ou
CreateProcessWithLogonW(ne peut pas utiliser
ShellExecute(Ex -)) pour spécifier le
bureau interactif.

..Je pense qu'il n'y a pas de moyen direct d'
frayer un taux élevé de processus à partir d'une
service windows. Nous ne pouvons que la première utilisation
CreateProcessAsUser ou
CreateProcessWithLogonW pour frayer un
non élevés processus de l'utilisateur
session interactive(bureau). Puis dans
le non-élevée, on peut utiliser
ShellExecute(Ex) pour frayer un taux élevé de
processus de la tâche réelle.

Pour ce faire .net/powershell code, on dirait que je devrais faire quelques élaborer P/Invoke trucs pour appeler CreateProcessAsUser ou CreateProcessWithLogonW depuis le .Net Système.Diagnostics.ProcessStartInfo n'a pas un équivalent de lpDesktop que je pourrais le mettre à "winsta0\par défaut". Et je ne suis pas clair si LocalSystem a même le droit d'appeler CreateProcessAsUser ou CreateProcessWithLogonW.

J'ai aussi regardé
http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx
et
Processus.Démarrer avec les informations d'identification différentes avec contrôle de compte d'utilisateur

Basé sur tout, je suis parvenu à la conclusion qu'il n'y a pas de façon simple de le faire. Ai-je raté quelque chose? Ce n'est pas vraiment sembler comme il devrait être si dur. Il se sent comme contrôle de compte d'utilisateur a juste jamais été conçu pour gérer les non-interactive de cas d'utilisation.

Et si tout des personnes de Microsoft fin de cette lecture, j'ai remarqué que la façon ShellExecute gère en interne l'élévation est en appeler à l'Application de l'Information de Service (AIS). Pourquoi n'est-ce pas ce même appel à l'AIS certains Win32 ou .NET API?
http://msdn.microsoft.com/en-us/library/bb756945.aspx

Désolé, qui a couru un peu long. Merci pour toutes les idées.

source d'informationauteur Chris Sears