Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  Programm aus Service in bestimmter Session starten  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
C0de4Fun
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.03.2009
Beiträge: 180
Beitrag C0de4Fun Mitglied 17:31:17 25.03.2010   Titel:   Programm aus Service in bestimmter Session starten            Zitieren

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
C0de4Fun
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.03.2009
Beiträge: 180
Beitrag C0de4Fun Mitglied 14:34:44 26.03.2010   Titel:              Zitieren

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
xor
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.03.2010
Beiträge: 58
Beitrag xor Mitglied 15:07:51 26.03.2010   Titel:              Zitieren

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
C0de4Fun
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.03.2009
Beiträge: 180
Beitrag C0de4Fun Mitglied 16:00:12 26.03.2010   Titel:              Zitieren

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
williman
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.10.2002
Beiträge: 305
Beitrag williman Mitglied 11:29:08 01.09.2010   Titel:              Zitieren

Hallo,

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

Benutzerprofil
Anmeldungsdatum: 06.03.2009
Beiträge: 180
Beitrag C0de4Fun Mitglied 16:38:52 01.09.2010   Titel:              Zitieren

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:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    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;
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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;
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    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
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 20:34:45 01.09.2010   Titel:              Zitieren

hi

geht auch so...

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

lowbyte
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 03:13:41 02.09.2010   Titel:              Zitieren

Hi

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

http://msdn.microsoft.com/en-us/library/ms687098%28v=VS.85%29.aspx
http://msdn.microsoft.com/en-us/library/ms681928%28v=VS.85%29.aspx

Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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;
}
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
williman
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.10.2002
Beiträge: 305
Beitrag williman Mitglied 07:19:37 02.09.2010   Titel:              Zitieren

@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?
lowbyte_
Unregistrierter




Beitrag lowbyte_ Unregistrierter 12:24:46 02.09.2010   Titel:              Zitieren

hi

du musst den code in deinem zielprozess aufrufen.

lowbyte
C/C++ Forum :: WinAPI ::  Programm aus Service in bestimmter Session starten  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.