Ich verwende einen Windows-Dienst von Drittanbietern, der einige Automatisierungsaufgaben durch Ausführen von Skripts und ausführbaren Dateien mithilfe von CreateProcessAsUser() verarbeitet. Ich habe Probleme mit Windows Server 2008 aufgrund der UAC und der Art und Weise, wie die LUA-Erhöhung über die APIs gehandhabt wird.Starten eines erhöhten UAC-Prozesses von einem nicht interaktiven Dienst (win32/.net/powershell)
Der Dienst wird als LocalSystem ausgeführt und hat keine Interaktion mit dem Desktop aktiviert. Die Prozesse werden als Benutzer in der Gruppe Administratoren ausgeführt, nicht jedoch als Administratorkonto (das von vielen UAC-Einschränkungen ausgenommen ist). Alle UAC-Standardeinstellungen sind vorhanden.
Ich kann beliebige Befehle oder Powershell-Code an den Dienst übergeben, aber ich kann nicht von dem nicht erhöhten, nicht interaktiven Prozess, der vom Dienst gestartet wird, "ausbrechen". Der Kern des Problems scheint zu sein, dass die einzige (öffentliche) API-Option zum Starten eines erhöhten Prozesses ShellExecute() mit dem Verb "runas" ist, aber soweit ich sagen kann, kann nicht von dort aufgerufen werden ein nicht interaktiver Dienst oder Sie erhalten Fehler wie "Dieser Vorgang erfordert eine interaktive Fensterstation".
Die einzige Abhilfe, die ich gefunden habe, ist hier erwähnt: http://www.eggheadcafe.com/software/aspnet/29620442/how-to-proper-use-sendinp.aspx
In Vista, die offizielle Art und Weise dokumentiert ein Verfahren zu erheben nur mit der Shell API ShellExecute (Ex) (nicht Createprocess oder CreateProcessAsUser). Ihre Anwendung muss daher ShellExecute (Ex) aufrufen, um einen Helper ausgelöst zu starten, um SendInput aufzurufen. Außerdem ist es aufgrund Sitzung 0 Isolation kann ein Service verwendet nur CreateProcessAsUser oder CreateProcessWithLogonW (nicht ShellExecute (Ex) verwenden kann), um die interaktive Desktop zu spezifizieren.
..Ich denke, es gibt keinen direkten Weg zu spawnen einen erhöhten Prozess von einem Windows-Dienst. Wir können zuerst CreateProcessAsUser oder CreateProcessWithLogonW verwenden, um einen nicht erhöhten Prozess in den Benutzer Sitzung (interaktiver Desktop) zu spawnen. Dann in der nicht erhöhten Prozess, kann es ShellExecute (Ex) verwenden, um einen erhöhten Prozess für die echte Aufgabe zu generieren.
Um dies zu tun, von .net/Powershell-Code, es sieht aus wie ich einige aufwendige P zu tun haben würde/Invoke Sachen CreateProcessAsUser oder CreateProcessWithLogonW seit dem .Net System.Diagnostics.ProcessStartInfo zu nennen ein nicht haben Äquivalent von lpDesktop, das ich auf "winsta0 \ default" einstellen könnte. Und ich bin nicht klar, ob LocalSystem sogar die Rechte hat, CreateProcessAsUser oder CreateProcessWithLogonW aufzurufen.
Ich sah auch bei http://blogs.msdn.com/alejacma/archive/2007/12/20/how-to-call-createprocesswithlogonw-createprocessasuser-in-net.aspx und Process.Start with different credentials with UAC on
Basierend auf dass alle, ich bin zu dem Schluss erreicht, dass es keine einfache Möglichkeit, dies zu tun. Fehle ich etwas? Das scheint wirklich nicht so schwer zu sein. Es fühlt sich an, als wäre UAC nie nur für nicht interaktive Anwendungsfälle konzipiert worden.
Und wenn irgendwelche Microsoft-Leute am Ende das lesen, bemerkte ich, dass die Art, wie ShellExecute intern die Höhe behandelt, durch den Aufruf an Application Information Service (AIS). Warum ist AIS nicht über eine Win32- oder .NET-API verfügbar? http://msdn.microsoft.com/en-us/library/bb756945.aspx
Sorry, das lief ein bisschen lang. Danke für jede Idee.
Sagen Sie lieber, dass Server Core UAC nicht unterstützt. Scheint meine Einschätzung zu bestätigen. http://blogs.technet.com/server_core/archive/2009/01/19/user-account-control-uac-and-server-core.aspx –
Siehe meinen Beitrag hier, der erklärt, wie insbesondere die LinkedToken aussehen Abschnitt: http://brianbondy.com/blog/id/100/understanding-windows-at-a-deeper-level-sessions-window-stations-and-desktops –