Programm aus Service in bestimmter Session starten



  • Hi,

    ich will aus meinem Service heraus ein Programm starten sobald sich einer neuer Benutzer anmeldet. Das sich ein neuer Benutzer anmeldet bekomm ich durch den ServicHandler + SERVICE_CONTROL_SESSIONCHANGE mit. Diesere neue Prozess soll die gleichen Rechte haben wie meine Service, was ja mit CreateProcess wunderbar klappen wuerde aber dann laeuft er ja au in der Session 0 was dann wieder keine GUI heisst.
    Jetzt is meien Frage wie ich das Problem umgehe.

    Praise the Lord C0de4Fun



  • Hi,
    hat keienr vielleicht einen kleinen Tipp fuer mich.
    Was meine Idee gewesen waere ist:

    LogonUser / CreateProcessAsUser / SetTokenInfromation zu verwenden.
    1. Problem damit war das ich es nicht geschafft habe mich als LocalSystem anzumelden und
    2. waere es ja wahrscheinlich ein schmarn da ja dann ne neue Session gestartet werden wuerde und ich wieder eine Notification bekommen wuerde oder?

    Waere erfreut ueber jedliche Tipps

    Jah Blessed us all C0de4Fun



  • Dupliziere deinen eigenen Token (OpenProcessToken, DuplicateTokenEx[TokenPrimary]) und setze mit SetTokenInformation[TokenSessionId] die Session auf die neue Session ID. Jetzt kannst du mit CreateProcessAsUser den Prozess als LocalSystem in der neuen Session starten.

    Hoffe, ich hab da jetzt nix wichtiges vergessen 🙂 ... auf allen Win-Versionen testen ist da immer oberstes Gebot

    lg XOR



  • xor schrieb:

    Dupliziere deinen eigenen Token (OpenProcessToken, DuplicateTokenEx[TokenPrimary]) und setze mit SetTokenInformation[TokenSessionId] die Session auf die neue Session ID. Jetzt kannst du mit CreateProcessAsUser den Prozess als LocalSystem in der neuen Session starten.

    Hoffe, ich hab da jetzt nix wichtiges vergessen 🙂 ... auf allen Win-Versionen testen ist da immer oberstes Gebot

    lg XOR

    Ich danke dir vielmals. Hat funktioniert mit Win7 x64. Werds dann au noch auf anderen Versionen testen.

    Jah Jah light can be seen by the blind c0de4fun



  • Hallo,

    würde mich auch interessieren. Kannst du den relevanten Quellcode hier einmal posten? Danke!



  • williman schrieb:

    Hallo,

    würde mich auch interessieren. Kannst du den relevanten Quellcode hier einmal posten? Danke!

    Hi,

    hier sollte das sein, muss aber sagen das ich mit dem Projekt nimmer weiter gemacht hab und jetzt nicht mehr sicher weiss obs noch funktioniert:

    case SERVICE_CONTROL_SESSIONCHANGE:
    		if(dwEventType == WTS_SESSION_LOGON)
    		{
    
    			STARTUPINFO StartUp;
    			PROCESS_INFORMATION ProcInfo;
    			PWTSSESSION_NOTIFICATION pSessionNotifi = (PWTSSESSION_NOTIFICATION) lpEventData;
    			DWORD dwSessionID = pSessionNotifi->dwSessionId;
    
    			memset(&StartUp, 0, sizeof(StartUp));
    			memset(&ProcInfo, 0 , sizeof(ProcInfo));
    			StartUp.cb = sizeof(StartUp);
    
    			if( OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_SESSIONID | 
    								TOKEN_ASSIGN_PRIMARY | TOKEN_DUPLICATE , &hToken) )
    			{
    				if( DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityImpersonation, 
    								TokenPrimary, &hNewToken) )
    				{
    					if(SetTokenInformation( hNewToken, TokenSessionId, (LPVOID)&dwSessionID, sizeof(dwSessionID)) )
    					{
    						if( CreateProcessAsUser(hNewToken, NULL , "\"C:\\Windows\\system32\\calc.exe\"", 
    							NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &StartUp, &ProcInfo) )
    						{
    							sprintf(szLog, "Created process: %u\n", ProcInfo.dwProcessId);
    							Log(szLog);
    							CloseHandle(ProcInfo.hProcess);
    							CloseHandle(ProcInfo.hThread);
    						}
    						else
    						{
    							sprintf(szLog, "Error with CreatProcess: %u", GetLastError());
    							Log(szLog);
    						}
    					}
    					else
    					{
    						sprintf(szLog, "Error with SetTokenInformation: %u", GetLastError());
    						Log(szLog);
    					}
    				}
    				else
    				{
    					sprintf(szLog, "Error with DuplicateTokenEx: %u", GetLastError());
    					Log(szLog);
    				}
    			}
    			else
    			{
    				sprintf(szLog, "Error with OpenProcessToken: %u", GetLastError());
    				Log(szLog);
    			}
    
    		}
    		break;
    

    spreading knowledge is the very thing you should do
    C0de4Fun



  • hi

    geht auch so...

    Window Station and Desktop Creation (Windows) - MSdn
    einfach mal msdn fragen.

    lowbyte



  • Hi

    Sorry für den letzten Post. Jetzt etwas genauer :

    http://msdn.microsoft.com/en-us/library/ms687098(v=VS.85).aspx
    http://msdn.microsoft.com/en-us/library/ms681928(v=VS.85).aspx

    int Interaction(void)
    {
    
    	HWINSTA m_hWinsta;
    	HDESK m_hDesk;
    
    	/* Interaction -------------------------------------------- */
    
    	m_hWinsta = OpenWindowStation("winsta0", FALSE,
    								   WINSTA_ACCESSCLIPBOARD |
    								   WINSTA_ACCESSGLOBALATOMS |
    								   WINSTA_CREATEDESKTOP |
    								   WINSTA_ENUMDESKTOPS |
    								   WINSTA_ENUMERATE |
    								   WINSTA_EXITWINDOWS |
    								   WINSTA_READATTRIBUTES |
    								   WINSTA_READSCREEN |
    								   WINSTA_WRITEATTRIBUTES );
    
    	if(m_hWinsta == NULL) {
    		printf("error");
    		return 1;
    	}
    
    	SetProcessWindowStation(m_hWinsta);
    
    	m_hDesk = OpenInputDesktop( 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) {
    		printf("error");
    		return 1;
    	}
    
    	SetThreadDesktop(m_hDesk);
    
    	return 0;
    }
    

    lowbyte



  • @lowbyte:

    Schön, aber wo gebe ich das zu startende Programm (z.B."C:\\Windows\\system32\\calc.exe\") an?

    Oder rufe ich erst die Funktion interaction auf und starte danach wie gewohnt mit ShellExecute oder CreateProcess mein Programm?



  • hi

    du musst den code in deinem zielprozess aufrufen.

    lowbyte



  • @Code4Fun:

    Übernehme ich deinen Code, so kommt die Fehlermeldung "undefiniertes symbol PWTSSESSION_NOTIFICATION ".
    Was muss ich da vorher noch deklarieren?
    Bzw. wozu benötige ich das? Um die neue Session-ID zu erhalten?



  • @lowbyte:

    Zielprozess wäre also wie im Beispiel von mir die calc.exe.

    Habe deinen Code eingefügt im Ereignis OnCreate des Hauptformulares meiner zu startenden Anwendung. Funktioniert leider nicht. Anwendung wird zwar von meinem Dienst aus gestartet, aber unter Win7 erscheint nicht das Formular.



  • williman schrieb:

    @Code4Fun:

    Übernehme ich deinen Code, so kommt die Fehlermeldung "undefiniertes symbol PWTSSESSION_NOTIFICATION ".
    Was muss ich da vorher noch deklarieren?
    Bzw. wozu benötige ich das? Um die neue Session-ID zu erhalten?

    williman schrieb:

    Zielprozess wäre also wie im Beispiel von mir die calc.exe.

    Habe deinen Code eingefügt im Ereignis OnCreate des Hauptformulares meiner zu startenden Anwendung. Funktioniert leider nicht. Anwendung wird zwar von meinem Dienst aus gestartet, aber unter Win7 erscheint nicht das Formular.

    Lol und lol

    zum 1.: MSDN + sollte doch aus dem Code hervor gehen!?
    zum 2.: Sollte es dir nicht bewusst sein das man diesen Code in die Handler Funktion des Services eintragen soll, solltest du nochmal ueberlegen ob du wirklich was mit einenm Service machen willst (imho)

    Big up
    C0de4Fun



  • Sorry, mein letzter Beitrag bezog sich auf den Code von lowbyte!
    Nicht, dass wir hier jetzt etwas durcheinander bringen!
    Den Code von Lowbyte in die jeweilige exe, welche gestartet werden soll, reinzupacken, wäre meiner Meinung nach einfacher, als am Dienst etwas zu ändern.



  • hi

    debuggen,und überhaupt, informiere dich zuerts über services. glaub du scheinst da was durcheinander zu bringen.

    lowbyte



  • Aha, kommt der Code doch in den Service rein. Danke für den Hinweis.


Anmelden zum Antworten