Aktuell angemeldeten Benutzer ermitteln



  • Hallo!

    Für die Funktion CreateProcessAsUser benötige ich das Handle des aktuell angemeldeten Benutzers.

    Hintergrund: Ich habe einen Dienst, der unter bestimmten Bedingungen eine Anwendung startet. Diese Anwendung soll dann unter dem aktuell angemeldeten Benutzer laufen, bzw. nicht gestartet werden, wenn kein Benutzer angemeldet ist.

    Wie kann ich das Handle ermitteln?

    Vielen Dank im Voraus.

    Rob'



  • Hab noch die sowas gemacht, aber vielleicht...
    Erstmal denke ich wirst du rausbekommen müssen welche window station du verwenden willst. Entweder nimmst du dazu EnumWindowStations, oder du verwendest immer "winsta0", oder ... weiss nicht. Sei dir halt darüber im klaren dass es mehrere window stations geben kann (Terminal Services/Remote Desktop Connection), und sogar mehrere window stations wo der selbe User eingeloggt ist (!).

    Wenn du den Namen der window station hast kannst du die mittels OpenWindowStation aufmachen. Wenn du das Handle hast solltest du mittels GetUserObjectInformation(hWinSta, UOI_USER_SID, ...) die SID des eingeloggten Users abfragen können (wobei das jetzt nicht mehr als ein "educated guess" ist).
    EDIT: wenns mit der window station nicht klappt kannst du vielleicht den default desktop der window station aufmachen, und dann mit dessen Handle GetUserObjectInformation aufrufen... /EDIT

    Nochmal EDIT: Und zu der SID musst du dann den Usernamen und das Passwort ermitteln 😉 - was das grösste Problem sein wird. Argh, ich denke das wird dir nicht viel weiter helfen 😞 /EDIT

    Weiters solltest du CreateProcessWithLogonW die window station und den desktop mitteilen wo du den Process laufen haben willst. Wie es mit CreateProcessAsUser aussieht weiss ich nicht.

    Und guck dir evtl. kb327618 sowie kb165194 an (weiss nicht inwieweit dich das betrifft wenn der User sowieso der eingeloggte user der window-station ist).

    Vielleicht hilft dir das ja etwas weiter.



  • Hallo hustbaer,

    danke für Deine schnelle Antwort (hattest Du Schlafstörungen? 😉 ). Das Problem mit den verschiedenen Desktops ist mir bekannt. Die Anwendung, die der Dienst startet, soll immer auf winsta0/default gestartet werden. Das funktioniert auch einwandfrei (wird in STARTUPINFO bei CreateProcess angegeben). Das Problem ist, dass die Anwendung dann unter dem System-Account läuft.

    Bin dankbar für weitere Hinweise.

    Robb'


  • Mod

    Ich glaube das ist aus Sicherheitsgründen nicht möglich einen Prozess in einem anderen Kontext zu starten ohne das Du die detailierten Anmeldeinfos kennst!
    Wäre ja auch eine fatale Sicherheitslücke, wenn ein Service im LocalSystem Account auf einmal unter meinem Sicherheitskonext (ohne mein Wissen) ein Programm starten könnte.



  • Denke ich auch. 100% sicher bin ich aber nicht 🙂
    Es müsste aber auf jeden Fall gehen wenn man die Credentials des Users hat, denn dann kann man ja CreateProcessWithLogonW verwenden.

    Wenn man irgendwie an ein "impersonation token" oder ein "primary token" für den User drankommt müsste es fast gehen, denn dann müsste man CreateProcessWithTokenW verwenden können. Wobei diese Feststellung das Problem natürlich nicht löst, sondern bloss in "wie bekomme ich das dumme user token" abändert. 🙂



  • Den Verdacht hatte ich auch schon, dass es aus Sicherheitsgründen evtl. gar nicht möglich ist. Allerdings wird die Anwendung ja nicht durch irgendwas gestartet, sondern durch einen Dienst mit vollen Zugriffsrechten.

    Bin weiter auf der Suche nach dem "dummen Token"...

    Danke.

    Rob'


  • Mod

    Rob' schrieb:

    Den Verdacht hatte ich auch schon, dass es aus Sicherheitsgründen evtl. gar nicht möglich ist. Allerdings wird die Anwendung ja nicht durch irgendwas gestartet, sondern durch einen Dienst mit vollen Zugriffsrechten.

    Dann kannst Du diese Zugriffsrechte verwenden und keine anderen. Es gibt nirgends ein Recht mit dem es Dir erlaubt wäre Dir andere Rechte einfach zu nehmen ohne dafür auch ein Kennwort oder eine bestimmte Sicherungsprozedur zur durchlaufen.

    Und der angemeldete Benutzer läuft eben in einem anderen Sicherheitskontext als Dein Service!

    💡 Idee: Wenn nun natürlich in dem Kontext des Anwenders auch ein Prozess läuft, der von Deinem Service ein entsprechendes Kommando bekommt, dann kann dieser Prozess in seinem Kontext dieses Kommando ausführen.
    Du kommst aber eben nicht um einen zweiten Prozess im Kontext des Benutzers herum!


Anmelden zum Antworten