App als Administrator starten von einem Service mit SYSTEM privileg.



  • Hallo zusammen

    Zu meinem Problem. Ich schreibe an einem Überwachungstool das als Service ausgeführt wird mit SYSTEM rechen. Bei meinem Überwachungstool soll eine Screenshot Routine gestartet werden. Da aber der Service als SYSTEM läuft und nicht als Administrator, oder eben der der gerade eingelogt ist, werden die Screenshots nur Schwarz. Sobald ich mein Screenshot Proc unter Admin laufen lasse ist gut. Nur mein Problem ist jetzt halt dass das Proc. eben mit SYSTEM rechten läuft. Wie könnte ich also das Proc vom Service mit SYSTEM rechten als Admin starten ?

    mg NULL_



  • Hallo,

    du hast mehrere Möglichkeiten, dein Problem zu lösen.

    Deinen Service auf einer anderen Window Station platzieren

    Es gibt verschiede Window Stations auf denen wiederum verschiedene Desktops sein können.

    Info über Dienste http://msdn.microsoft.com/de-de/library/d56de412.aspx
    Info über Window Stations & Desktops http://msdn.microsoft.com/en-us/library/ms687098%28v=VS.85%29.aspx
    Funktionen für Window Stations & Desktops http://msdn.microsoft.com/en-us/library/ms687107%28VS.85%29.aspx

    Window Stations:
    SYSTEM -> Für Windows Services (keine Ein- oder Ausgabe über Hardware)
    WinSta0 -> Für "normale" Anwendungen

    Du musst also von Window Station "WinSta0" auf "default" wechseln, um auf die "normalen" Anwendungsfester und den Eingabedesktop zugreifen zu können.

    Lösung in C# (was besseres hab ich auf die schnelle nicht gefunden ;))
    http://www.codeproject.com/KB/system/SystemTrayIconInSvc.aspx

    Villeicht kannst du ja was draus machen... Immerhin hast du jetzt Stichworte 😉

    Deinen Lösungsvorschlag... da muss ich zugeben, habe ich auch grad nichts gefunden 😃

    Gruß



  • Hi

    Und wie mache ich das genau ?

    Bisher habe ich:

    hwinst = CreateWindowStation(NULL ,0 ,GENERIC_ALL ,NULL);
    SetProcessWindowStation(hwinst);
    

    Sollte doch gehen so ? Aber funktioniert nicht.

    NULL_



  • Es sollte vom Prinzip ungefähr so aussehen:

    //Handle von der Eingabe Window Station bekommen
    HWINSTA ws = OpenWindowStation(L"winsta0", ...);
    //Auf diese Window Station wechseln
    SetProcessWindowStation(ws);
    
    CloseWindowStation(ws);
    
    //Handle vom Eingabe Desktop bekommen
    HDESK dt = OpenInputDesktop(...);
    //Auf den Desktop wechseln
    SetThreadDesktop(dt);
    
    CloseDesktop(dt);
    

    Gruß



  • Probier das mal:

    (Ist syntaktisch korrekt aber nicht mit einem Service gestestet...)

    bool Interaction(void)
    {
    
    HWINSTA m_hWinsta = OpenWindowStation(L"winsta0", false, 
    									  WINSTA_ACCESSCLIPBOARD | 
    									  WINSTA_ACCESSGLOBALATOMS | 
    									  WINSTA_CREATEDESKTOP | 
    									  WINSTA_ENUMDESKTOPS | 
    									  WINSTA_ENUMERATE | 
    									  WINSTA_EXITWINDOWS | 
    									  WINSTA_READATTRIBUTES | 
    									  WINSTA_READSCREEN | 
    									  WINSTA_WRITEATTRIBUTES);
    
    if (m_hWinsta == NULL)
    {
    	//Fehler
    	return false;
    }
    
    SetProcessWindowStation(m_hWinsta);
    
    HDESK m_hDesk = OpenDesktop(L"default", DF_ALLOWOTHERACCOUNTHOOK, false,
    							DESKTOP_CREATEMENU |
    							DESKTOP_CREATEWINDOW |
    							DESKTOP_ENUMERATE |
    							DESKTOP_HOOKCONTROL |
    							DESKTOP_JOURNALPLAYBACK |
    							DESKTOP_JOURNALRECORD |
    							DESKTOP_READOBJECTS |
    							DESKTOP_SWITCHDESKTOP |
    							DESKTOP_WRITEOBJECTS);
    
    if (m_hDesk == NULL)
    {
    	//Fehler
    	return false;
    }
    
    SetThreadDesktop(m_hDesk);
    
    return true;
    }
    

    Gruß



  • Hi

    Funktioniert nicht. syntaktisch ok. Aber die Scrshot,s bleiben black.

    Vileicht sollte ich mein vorgehen einmal genau schildern.

    1. Das prog. wird als service gestartet.
    2. Der service hat systemrecht (SYSTEM)
    3. Aus dem service heraus starte ich ein program, das eben leider auch system rechte bekommt. Aber das möchte ich eben nicht. Möchte das das program mit dem gerade eingelogten user account startet.

    Kann ich einfach die vererbung abschalten bzw. auf false setzen beim startcode der der dan den process ladet aus dem hauptprog.?

    dan wäre zumindest gewärleistet das die Screenshots erstellt werden können. wie gesagt das programm muss mit dem aktuell eingeloogten user startendan funktioniert es. Doch eben mit systemrechten nicht.

    Muss der code in der zu startenden exe stehen ? denke schon.! Und was ist wen ich im hauptprog. Einen thread start. Muss der code dan in der thread prcedur stehen ?

    NULL_



  • HÄ?

    Mit dem Account hat das nix zu tun, es geht einfach nur darum in welcher Window-Station der Prozess startet.
    Ein Prozess der als SYSTEM läuft kann durchaus auf den Desktop zugreifen und hübsch Screenshots machen.

    Und einen Prozess einfach so mit dem Account eines eingeloggten Users starten geht nicht, dazu müsstest du sein Passwort kennen.



  • Hi

    Dan ist also der code schon richtig. Warscheinlich nur am falschen ort aufgerufen . Denke ich. werde das morgen noch testen. Bin leider am arbeiten.

    @hustebär

    Kannst du mir vileicht erklären wie das ist mit windowstation ? Grundprinzipien ? Verstehe das nich so ganz.
    Woher bekommt er den zb. Den str. Bzw. Namen "winsta0" und "default" ,die sind nirgend dokumentiert !

    NULL_



  • Guck mal auf den Beitrag von "While(true){}" um 16:44.
    Klick auf den 2. darin enthaltenen Link. Lesen + weiter Durchklicken -> BINGO
    Alles dokumentiert.



  • Hi

    Ja ist mir schon klar ! War gerade unterwegs und schrieb mit meinem Cell-Phone, und dachte halt könntest mir ein bischen davon erzählen, halt stichwort mässig.
    Da eben die ve**** Microsoft Seite auf meinem NE90 nicht richtig will, bzw. der Browser.

    Habs gerade getestet so wie gestern. Nur das ich eben die paar Zeilen in meine threadproc fügte. Und jetz läufts wunderbar. Kann auf alles zugreifen.

    Danke nochmal

    Gru$ lowbyte



  • Hi

    Wenn man direkt auf den aktuell eingeloggten zugreiffen will dan ...

    OpenInputDesktop(..,..,..);
    SetThreadDesktop();

    Wird automatisch auf default gesetzt !

    gruss lowbyte


Anmelden zum Antworten