Avvia il programma all'avvio del computer quando nessuno è connesso e mostra la finestra quando qualcuno accede (OS: Windows)


19

Ho un programma che viene avviato all'avvio del sistema utilizzando l'Utilità di pianificazione su Windows Server 2012. Il programma deve essere avviato anche se il computer si riavvia automaticamente.

L'amministratore è l'account utilizzato per avviare il programma, l'opzione "Esegui se l'utente è connesso o meno" è selezionata per l'attività.

Il problema è che quando finalmente qualcuno accede come amministratore usando Connessione desktop remoto l'interfaccia (finestra del programma) è nascosta.

A quanto ho capito, non c'è modo di risolverlo utilizzando l'Utilità di pianificazione.

Come posso risolvere questo?

Dovrebbe essere un problema abbastanza comune ma non riesco a trovare nulla cercando in rete. Sono abbastanza sorpreso dal fatto che Microsoft consenta tale limitazione nel loro programmatore. Posso creare un VBScript o qualcosa che viene eseguito all'avvio e avvia il programma che sarà quindi visibile quando l'utente accede effettivamente?

Altre idee?

(Non voglio creare un programma separato solo per la GUI che si collega al programma originale tra l'altro. Preferirei anche se non dovessi terminare il programma già in esecuzione al momento dell'accesso dell'utente e quindi avviare nuovamente.)


2
Firedaemon, installa l'app come servizio, quando RDPed passa a "Session 0" utilizzando Firedaemon. Vedi l'app.
TheCleaner

Questo potrebbe tecnicamente essere fatto se sviluppi il tuo servizio.
Ryan Ries,

1
Ho appena risposto alla mia domanda. Tuttavia, non posso accettare la mia risposta per due giorni, perché il sistema qui su serverfault.com è estremamente male (la maggior parte delle persone ora abbandonerebbe semplicemente questa pagina senza attendere due giorni e lascerebbe la domanda contrassegnata per sempre come non risolta).
Marcus,

2
@Marcus: i limiti su chi può fare cosa e quando sono destinati a fermare determinati abusi. Purtroppo a volte causano inconvenienti per tentativi autentici di fare le cose nel modo giusto, ma a volte tali compromessi devono essere fatti. Se hai un suggerimento che potrebbe migliorare la situazione (proteggendo almeno il sito ma disturbando meno gli utenti reali), sarebbe una buona idea sollevare il pensiero attraverso un sito "meta" pertinente ( meta.serverfault.com , meta. stackoverflow.com ) invece di lamentarsi in un commento che è improbabile che i corridori del sito vedano.
David Spillett,

Come puoi vedere dalle votazioni, la risposta che vuoi accettare non è quella che la gente approva perché il modo in cui stai cercando di farlo è sbagliato all'inizio.
JamesRyan,

Risposte:


28

Ho capito come farlo da solo. È un po 'una soluzione alternativa, ma è quello che mi aspettavo di ottenere.

Fermare! Non rabbrividire ancora. Continuare a leggere...

  • Eseguilo, impostalo in modo che l'Amministratore debba accedere automaticamente.

  • Creare un'attività in Utilità di pianificazione. Impostalo per l'esecuzione solo quando l'utente (Amministratore) è connesso. Il trigger è "all'accesso" e specifica che è solo quando l'amministratore accede.

  • Crea una seconda attività. Esegui solo quando l'utente è connesso, esegui il trigger all'accesso dell'amministratore. L'azione dovrebbe essere "avvia un programma" e il programma è "C: \ Windows \ System32 \ rundll32.exe" con il campo argomento impostato su "user32.dll, LockWorkStation".

Cosa succede ora se si riavvia il computer è che l'Amministratore accede automaticamente, il programma che si desidera avviare viene avviato e la stazione di lavoro viene bloccata. Se eseguo l'accesso tramite Connessione desktop remoto, posso vedere la finestra del programma e utilizzare la GUI. Posso bloccare / sbloccare il computer senza problemi e disconnettere / riconnettere come mi pare. Non ci sono problemi se vado sul server e accedo alla workstation reale. Poiché l'amministratore ha già eseguito l'accesso, l'attività non verrà eseguita di nuovo (non crea alcun loop di blocco di accesso infinito da cui non è possibile uscire).

Semplice come quella. Concesso c'è un secondo periodo di tempo prima che il computer si blocchi dopo il login automatico e immagino che un hacker professionista con accesso fisico al computer possa fare qualcosa di subdolo in questo intervallo di tempo, ma nel mio caso posso trascurare quel rischio per la sicurezza. Finché non faccio entrare hacker professionisti nella mia casa e faccio vedere loro il computer, il sistema dovrebbe essere relativamente sicuro. Soprattutto non c'è molto valore sul computer che necessita della protezione da super-caveau, quindi sono abbastanza contento di questa soluzione.


7
Nessuna mancanza di rispetto (o downvote), Marcus. Ma se questo è davvero il tipo di risposta che stavi cercando, questa domanda sarebbe stata più appropriata per SuperUser .
Ryan Bolger,

2
Non è stato facile decidere su quale scambio di stack pubblicare questo.
Marcus,

Ciao Marcus, ho seguito la tua risposta ma ho un problema con l'avvio di due programmi con GUI invece di uno solo. Ho inviato una domanda in SuperUser. Se potessi rispondere, ci sarà di grande aiuto - superuser.com/questions/902386/…
user2162550

1
In realtà, adesso anche il downvoting perché NON è una risposta alla domanda. La domanda definisce in modo esplicito che mezzogiorno è stato effettuato l'accesso e la tua "soluzione" qui effettua un accesso automatico (quindi qualcuno ha effettuato l'accesso). Forse non è una fomulazione intelligente nella domanda, ma la domanda è come è.
TomTom,

1
@TomTom Come opzione presentata a un utente finale "Esegui se l'utente è connesso o meno" potrebbe certamente significare "Non dovrai essere qui per fare da babysitter per assicurarti che inizi."
Aryeh Leib Taurog

16

Ho un programma che viene avviato all'avvio del sistema utilizzando l'Utilità di pianificazione su Windows Server 2012. Il programma deve essere avviato anche se il computer si riavvia automaticamente.

Quindi perché non renderlo un servizio di sistema, come definiscono le specifiche di Windows?

Come posso risolvere questo?

Non puoi. I programmi in background non dovrebbero interagire con l'interfaccia utente. Oppure: l'interfaccia utente dovrebbe eseguire il proprio programma che si connette al servizio. L'interfaccia utente in esecuzione nello spazio utente dell'utente che ha effettuato l'accesso esegue la presentazione, il servizio Windows esegue l'elaborazione. Ecco come il modello è stato progettato per circa 15 anni o giù di lì.

Sono abbastanza sorpreso dal fatto che Microsoft consenta tale limitazione nel loro programmatore.

Sono più sorpreso che tu non abbia mai chiesto il perché.

Esistono diversi problemi:

  • Quando più persone hanno effettuato l'accesso, chi ottiene l'interfaccia utente?
  • Quando l'utente si disconnette, si uccide il programma? AHIA.
  • Sicurezza. Il programma in background può essere eseguito con diritti limitati: esporre l'interfaccia utente all'utente significa che l'utente può eseguire il codice lì. Il modello di messaggistica di Windows è - ah - pieno di problemi.

A proposito, non voglio creare un programma separato solo per la GUI che si collega al programma originale.

Né a me né a Microsoft importa a questo punto cosa ti piace fare. Esiste un modello consolidato e supportato per associare l'elaborazione in background a un'interfaccia utente utente connessa: utilizzarla o meno. Ma in caso contrario, non lamentarti dei problemi di sicurezza che hai posto.


3
Amen. Vorrei che altri venditori di app avessero compreso questo concetto.
Ryan Bolger,

15
Wow, non sei snob nel tuo atteggiamento? Beh, suppongo che sia sfortunato. A meno che tu non sia male informato e qualcuno abbia un modo per risolverlo, tutti non possono sapere tutto, quindi potresti sbagliare con la parte assoluta "non puoi" del tuo post. Vorrei lasciare la domanda aperta per più risposte per un po 'più a lungo, nel caso in cui qualcuno abbia una soluzione insolita da condividere. Altrimenti accetterò la tua risposta.
Marcus,

In realtà è sempre più difficile fornire un'interfaccia utente a un servizio al giorno d'oggi sulle versioni attuali di Windows, ma non impossibile.
MDMoore313,

Non è attivamente ricercato a causa principalmente di problemi di sicurezza. Il problema principale qui è che - e hai davvero bisogno di ottenerlo - se mostri una finestra nella mia UI, posso eseguire il codice nel tuo processo. Posso quindi inviarti messaggi di Windows e che hanno un sacco di cose che possono essere sfruttate. Normalmente non è un problema - perché se si tratta di un'app utente, posso solo fare cose che io come utente potrei .... ma se il servizio ha privilegi più elevati, ecco l'incubo della sicurezza. Questo è il motivo per cui questo è stato chiuso molti anni fa e tutti coloro che hanno imparato a programmare e leggere la documentazione avrebbero dovuto leggerlo
TomTom

1
Se vuoi davvero andare lì, puoi provare i passaggi in coretechnologies.com/WindowsServices/FAQ.html#GUIServices - non sei sicuro che funzionino ancora nelle finestre correnti ma ci sono modi per rendere l'interfaccia utente accessibile e aprire tutti i problemi di sicurezza .
TomTom

0

Riguarda tutto Sessionciò in cui viene eseguito il tuo programma. Se nessuno ha effettuato l'accesso, non c'è alcuna sessione interattiva da visualizzare sotto, credo che funzioni sotto Session 0, che ha una strana UI che non si presenta come le altre.

Ora, se il tuo programma rileva quando viene explorer.exeavviato (o in qualche altro modo per rilevare l'accesso degli utenti) e magicamente si è rimodellato o ha generato un processo figlio su quel nuovo sessionid, allora chiunque accederà sarà felice di vedere cosa stai facendo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.