Come posso rilevare un'altra istanza della stessa applicazione Win32 in esecuzione su un'altra stazione di lavoro?

StackOverflow https://stackoverflow.com/questions/549534

  •  23-08-2019
  •  | 
  •  

Domanda

Ho una piccola applicazione, che è gratuito per uso personale, ma richiede una licenza a pagamento per l'uso aziendale.

E 'più probabile che in un ambiente aziendale la mia applicazione verrà eseguita su più workstation. Se è la versione freeware, voglio mostrare un messaggio discreto. (E continua)

Non deve a prova di proiettile, se non è possibile (cioè firewall) quindi l'applicazione deve solo continuare. E io non voglio fare l'utente creare una sorta di servizio centrale per monitorare le istanze. Non voglio infastidire i miei utenti (specialmente non il pagamento di quelle * g *)

C'è un modo per raggiungere questo tipo di funzionalità?

Mi ricordo una vecchia versione di Dreamweaver ha avuto questo tipo di funzione. Non si poteva correre più di una volta nella stessa rete.

È stato utile?

Soluzione

Un modo: Ascoltare per UDP in onda su porte specifiche. Lasciate ogni istanza invio broadcast pacchetto UDP su questa porta alla rete locale. Se applicazione riceve tale pacchetto, e riconosce la sua struttura, si sa che altro istanza esegue.

È possibile includere i dettagli della licenza per evitare i messaggi se si usano due licenze valide.

Le trasmissioni di solito non sono indirizzate, quindi questo funziona solo su rete locale. (E l'utente può disabilitare completamente tramite firewall troppo ... ma se si vuole usare qualche porta standard come 53 (DNS), non verrà bloccato).

Un altro modo è quello di utilizzare server personalizzato, che viene informato su tutte le istanze di tutto il mondo; -)

Altri suggerimenti

Ci sono due modi principali per raggiungere questo obiettivo:

In primo luogo, è possibile impostare una piccola applicazione server su ogni stazione di lavoro che comunica con altre stazioni di lavoro in rete (personalmente vorrei usare Bonjour per la scoperta, ma ci sono altre opzioni). Lo svantaggio è che si sta andando a scrivere un po 'più di codice per fare questo lavoro che l'opzione # 2.

In secondo luogo (probabilmente più semplice) sarebbe quella di utilizzare WMI per enumerare i processi su altre stazioni di lavoro (di nuovo, probabilmente usare un sistema simile a Bonjour per la scoperta), e trova il tuo processo in esecuzione su altre macchine. Lo svantaggio di questo è che il codice di enumerazione richiede privilegi su tutte le macchine per condurre la ricerca.

Quando l'applicazione viene avviata, invia una trasmissione UDP su una porta specifica. Questo sarà limitato alla subnet locale, e non potrebbe farlo attraverso i firewall. Questa è la "è chiunque in esecuzione altro, o posso cominciare?" query.

Se non ci sono risposte, l'applicazione viene avviata come di consueto, l'ascolto per questa trasmissione UDP. Se si vede uno, risponde con un "Sono già in esecuzione, non è possibile avviare". Packet

L'applicazione che è appena iniziato riceve il pacchetto di risposta e poi si rifiuta di avviare o (se non si vuole essere che una rigorosa) visualizza un messaggio di avviso per l'utente.

Che ci si vuole includere la chiave di ID del prodotto e la licenza (o di un hash) nella richiesta iniziale, in modo che si può avere più di una licenza sulla stessa rete. La risposta probabilmente vuole che il nome della macchina in esso, in modo che il secondo utente può andare a trovare il primo utente e chiedere se hanno davvero bisogno di utilizzare l'applicazione.

soluzione Corporation Evil:
Avere la casa chiamata applicazione ogni volta che si avvia. Se più di una domanda di licenza si sveglia, dire che non a. Se non v'è alcuna connessione a internet, non iniziare affatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top