Wie man Aktuell angemeldeten Benutzer die session-ID?
Bin ich mit einem Prozess aus einem windows-Dienst mithilfe
ProcessStartInfo processStartInfo = new ....
Process.Start(processStartInfo);
Das problem ist, wenn ich Dienst unter dem Konto lokales system, es läuft gut, aber es nicht zeigen die Programme " - Fenster.
Ich habe versucht, Benutzerdaten im service-Eigenschaften, aber dann "Allow service to interact with desktop' - checkbox wird deaktiviert.
Ich wirklich brauchen, um ausführen die app ruft es aus dem Dienst, und ich wirklich brauchen, um zu sehen, das app Fenster.
Mir bitte helfen.
UPD. Gut, Sie überladene version der Prozess.Starten Sie was braucht, Benutzername, Kennwort und Domäne - it wird ziehen Sie das Programm auf dem desktop. Aber jetzt startet die app unter einem Anmeldeinformationen, zeigt aber, dass auf einem anderen desktop des Benutzers. Wie kommt das?
UPD2: ich habe eine Idee! Die ich verwenden kann psexec.exe aus der Sysinternals-Suite. Aber das problem ist, ich brauche zu starten, die Sache stillschweigend "als administrator". Und ich weiß nicht, wie.
Ich meine, auch wenn du schon admin-Rechte, manchmal muss man manuell sagen "als administrator ausführen", bestätigen die Benutzerkontensteuerung und nur nach, dass Sie bereit sind zu gehen. Ich weiß nicht, wie leise etwas laufen bringen, ohne UAC-Sache....
UPD3: sehr Geehrter Herr. Ich habe das Ding! Endlich.
Ok. Am Anfang war das problem ja auch in der Sitzung 0-Isolierung Sache. Also ich brauchte zu build ein Mitte-app, die gestartet werden können, ist aus dem Dienst und dann, dass die app wiederum angenommen, zum start meiner Anwendung durch RPC und bringen es zu einem desktop. Anstelle von building middle layer-app, die ich beschlossen, zu verwenden psexec-tool (wie auch immer es funktioniert genau so, wie ich brauche - über RPC).
Und als ich versuchte zu verwenden, das Werkzeug, die unter dem LOKALEN SYSTEM-Konto hat es nicht funktioniert aus irgendeinem Grund. Und dann merkte ich - der Grund ist verdammt EULA popup-dialog, der die Mitgliedstaaten in jedem einzelnen pstool, und es war unmöglich, klicken Sie auf die Schaltfläche, um zu bestätigen-dialog unter dem lokalen system-Konto.
Also die Lösung ist das erstellen eines Schlüssels in der registry HKU.DEFAULT\Software\Sysinternals\PsExec " mit DWORD-Wert EulaAccepted = 1
Hurra, jetzt funktioniert es!
ABER! Jetzt muss ich bringen das Programm auf die derzeit angemeldete Benutzer-Bildschirm. Zu tun, dass ich bin gonna brauchen Sie die session-id!
Die Frage ist also: Wie bekommt man aktuell angemeldeten Benutzer die session-id? Und was passiert, wenn dort niemand angemeldet noch? Was die session-id, die wäre?
UPD4: Das ist es! Ich bekam das!
[DllImport("Kernel32.dll", EntryPoint = "Sie Wtsgetactiveconsolesessionid")]
public static extern int Sie wtsgetactiveconsolesessionid();
Danke Jungs!
InformationsquelleAutor iLemming | 2010-07-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Lösung wäre, um einen Dritten Prozess als Vermittler, und sagen Sie es zum starten von apps via RPC/Named pipes.
Prozesse:
Den shim schafft ein Kommunikations-Endpunkt (named pipe, WCF-endpoint) und hört auf. Wenn es eine Nachricht erhält, gehen Sie vor, leitet Sie die app, die Sie ausführen möchten.
Dann, wenn der Windows-Dienst will zu starten eine app, die es findet, und öffnet den Endpunkt (named pipe, WCF-Endpunkt), und sendet die Nachricht, die app zu starten. Dann wird die zwischengeschaltete Anwendung kümmert sich um den Prozess starten business, und nicht die Einschränkungen, die der Windows-Dienst hat.
Machen diese vermittelnde Prozess starten mit anmelden, und du bist gut zu gehen.
Dies ist ähnlich wie die Microsoft-test-agent/- controller arbeiten, wenn Sie müssen tests ausführen, die mit dem desktop interagieren.
InformationsquelleAutor Merlyn Morgan-Graham
Können Sie die aktive console session-id verwenden Sie wtsgetactiveconsolesessionid (aus der terminal-services-API). Sie kann es nur für WinXP/Win2K3 oder höher, aber das sollte in Ordnung sein, Sie können schwer-code 0 für die session-id auf Win2K oder früher. Hier ist die PInvoke-Signatur:
Soweit das starten eines Prozesses in der Sitzung des Benutzers, können Sie sich an die Antwort, die ich gab hier. Es beinhaltet im wesentlichen die callling vier-API ' s; WTSGEtConsoleSessionId, WTSQueryUserToken, DuplicateTokenEx, dann CreateProcessAsUser, und es funktioniert auf jedem Rechner mit WinXP/Win2K3 oder höher.
Sorry, ich erkannte, dass ich falsch verstanden, die eigentliche Frage und meinen Beitrag aktualisiert, um eine bessere Antwort.
InformationsquelleAutor Javert93
Diese kann getan werden, ohne eine intermediate-Prozess, aber es erfordert mehr als 500 Zeilen code zu tun. Im Grunde wollen Sie starten Ihre zweite Prozess, wie der momentan angemeldete Benutzer. Für Vista/7 Benutzer haben Ihre eigenen winlogon-Prozess, während für XP, haben Sie ein explorer-Prozess. Sie müssen ein primäres token, Umwelt block -, Sicherheits-Attribute, und thread-Sicherheit-Attribute, die ausgeführt werden kann, wird dann rufen Sie die Windows-API-Funktion CreateProcessAsUser mit all diesen Informationen, so dass Sie sicher, dass Sie wählen Sie die richtige Fenster-Bahnhof sowie (in der Regel ""WinSta0\Default""). Das ist alles machbar, aber vielleicht haben Sie eine bessere Zeit mit den anderen Vorschlag eines zweiten Prozess-und IPC.
InformationsquelleAutor Matthew Ferreira
Wenn Sie versuchen, dieses auf alles, was neuer als Windows XP, das wird nicht funktionieren. Dies ist, weil Sie ein neues feature in Vista /Windows 7 genannte Session-0-isolation. http://msdn.microsoft.com/en-us/library/bb756986.aspx Sie werden nicht in der Lage, eine app gestartet, die von einem service zu zeigen, bis auf dem Benutzer-desktop.
InformationsquelleAutor Flesrouy