Programm aus Service in bestimmter Session starten



  • 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