2009-06-04 14 views
8

Quando eseguo un servizio come account LocalSystem, posso utilizzare i seguenti codici per lanciare un programma con interfaccia grafica in corrente conto username:Come avviare un programma con interfaccia grafica in un servizio di Windows?

WTSGetActiveConsoleSessionId-> WTSQueryUserToken-> CreateProcessAsUser

Tuttavia, quando si esegue il servizio come il mio account personale, il programma GUI NON verrà visualizzato. Posso vederlo in task manager però.

Cosa devo fare per avviare il programma della GUI quando il servizio è in esecuzione con il mio account personale?

risposta

2

John e jdigital hanno entrambi ragione: dalla mia comprensione, i servizi in genere possono avere accesso desktop (è necessario utilizzare il sistema locale) o accesso alla rete (è necessario specificare un account per l'esecuzione in).

Avrete bisogno di due dividere la vostra app in due - uno per interagire con il desktop e l'altro per parlare attraverso la rete. Le due parti possono quindi comunicare tra loro per inoltrare le informazioni all'utente finale.

+0

Ho intenzione di eseguire il servizio dal mio account in modo che possa accedere alla risorsa locale e di rete. "parlerà per ricevere informazioni e controllarlo, ma una cosa strana, come ho scritto qui sotto, è che i file che ha generato sono di proprietà di" administrator ", NON il mio account (Vista OS). – trudger

0

Tutto ha a che fare con le autorizzazioni che credo.

LocalSystem dispone di privilegi sufficienti per impersonare l'utente corrente, ma il proprio account no.

Dovresti trovare un modo per estendere le autorizzazioni al tuo servizio, richiedendo credenziali o connettendosi a un servizio di supporto che viene eseguito come LocalSystem.

(Perché si desidera eseguire con il tuo account, invece di LocalSystem?)

Sono sicuro che ci sono molto più approfondita le risposte che si occupano di in di e fuori di di fare questo, ma ad un alto livello I pensa che questo è il problema.

+0

Grazie John, ci sono due ragioni: 1) Il LocalSystem non ha il permesso di accedere alle cartelle condivise di rete in Vista 2) Tutti i file generati dal servizio LocalSystem sono di proprietà di "amministratore". Voglio i file di proprietà del mio account personale. – trudger

0

Si può essere nell'esecuzione nella stazione di finestra errata o sul desktop. Vedi questo Microsoft reference on Window Stations and Desktops.

+0

Il servizio è in esecuzione dal mio account personale e sono attualmente connesso. Ho appena controllato, il programma è in esecuzione, ma non viene visualizzato. – trudger

+0

Se dai un'occhiata al link, vedrai che questo non è un problema di permessi. Microsoft utilizza Window Station e Desktop per fornire diversi livelli di isolamento dei processi. Ci sono modi per ovviare a questo problema, come SetProcessWindowStation e SwitchDesktop, ma la suddivisione dell'applicazione in due parti è la soluzione generalmente consigliata. – jdigital

+0

Sì, la modalità client/server è che ho intenzione di fare. Risolverà questo problema.Ma una cosa strana è che, sebbene il servizio sia gestito dal mio account personale, i file che ha generato sono di proprietà di "amministratore", NON del mio account. È possibile controllare questa proprietà in "Proprietà file-> Dettaglio-> Proprietario". Non dovrebbe essere di proprietà del mio account? – trudger

0

Credo che ciò che si sta tentando di fare possa essere considerato una vulnerabilità di sicurezza. Inoltre, è improbabile che funzioni anche in alcuni casi. Penso che jdigital sia corretto in quanto ha a che fare con le stazioni della finestra e sta cercando di ottenere l'accesso alla stazione della finestra utente corrente ed è desktop. Questo è molto confuso quando ci si trova sotto un server di servizi terminal dove ci sono più stazioni finestra correnti. Microsoft davvero non ti vuole quello che vuoi e lo rendono più difficile con ogni versione di Windows.

Penso che la soluzione migliore sia risolvere il problema da un'altra angolazione e creare un'applicazione GUI che l'utente esegue (manualmente o automaticamente all'accesso) e che parla al tuo servizio.

+0

In tal caso, l'utente non riceverà alcuna notifica se chiude l'app della GUI. Ma sembra che non abbia altra opzione. :( – trudger

+0

@trudger: No. L'utente inoltre non riceverà alcuna notifica se si alza e si allontana dal computer, ma ciò non significa che spedisci le manette con il tuo software. –

+0

Sì, questo rende sensati. usare la pipe per comunicare tra la GUI e il servizio Forse posso anche bufferizzare questi eventi e mostrarli agli utenti quando effettuano il login – trudger

Problemi correlati