Newsgroup: it.comp.lang.delphi
Titolo: Chiudere applicazione su altro pc

Ciao a tutti,
     in modo molto artigianale sono riuscito a far capire all'applicazione 
se un utente che si sta loggando ha gia' effettuato un login da altro 
computer.
Il modo molto artigianle sta, al momento del login, nel settare un flag nel 
db degli utenti a true e mettere in un campo blob (in questo caso un memo) 
il nome del pc da cui si e' loggati.
Quando l'utente esce, il programma resetta il flag a false ed elimina il 
testo.
Se pero' l'utente si logga da un altro pc, il programma avvisa che c'e' gia' 
una sessione aperta sul pc <nomepc>. (Credetemi, non e' un evento che capita 
cosi' raramente !!!)
Ora a sul form c'e' l'avviso di andare a de-loggarsi sull'altro pc o di 
forzare l'accesso sul pc nuovo, se si forza si aggiunge il nome della 
macchina nella lista.
Sempre per complicare le cose, mi sembra carino mettere un bottoncino che 
dica "Vuoi terminare la sessione sul pc <nomepc>" e se si clicca sul pc in 
oggetto il programma termina ....
Domandona :
Si puo' fare ???? Fare un logout (o meglio forzare l'uscita di un programma) 
sul pc X dal pc Y ??
Grazie a tutti
Ciao
Daniele 
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4052 (20090504) __________
The message was checked by ESET NOD32 Antivirus.
http://www.eset.com

 sul pc X dal pc Y ??
Tecnicamente la cosa è fattibile. Ma ci sono delle domande che
dovresti porti PRIMA di quella relativa alla fattibilità tecnica..
A.

 dovresti porti PRIMA di quella relativa alla fattibilit� tecnica..
Guarda, le domande che ho da pormi non sono, haime', di numero limitato.
E' invece limitata la mia esperienza come pseudo hobbi sviluppatore (e le 
mie domande lo confermano).
Tieni sempre conto del mio limitato skill, a volte quando mi dai delle 
indicazioni ho l'impressione che mi tratti da tuo pari ...!!
Grazie dell'interessamento !!!
Ciao,
Daniele 
__________ Information from ESET NOD32 Antivirus, version of virus signature database 4054 (20090505) __________


Ciao.
Ti suggerisco uno dei tanti sistemi "artigianali", questo basato sul
Turbopascal che hai citato.
In sostanza creiamo un semaforo sfruttando la gestione dell'accesso
esclusivo ad un file da parte del sistema operativo.
Quando un'applicazione viene killata tale accesso viene rimosso.
Sono contrario a killare un'applicazione aperta su un altro pc:
infatti e' una prassi che puo' compromettere l'integrità dei dati e
deresponsabilizza l'utente. Quindi non vorrei aiutarti ....
ecco l'esempio.
var
    F:TextFile;
begin
    // creo una cartella "C:\semafori" condivisa fra gli utenti
    // tento di creare un file semaforo con un nome basato sull'utente
    // inizializzo F
    AssignFile(F,'C:\SEMAFORI\USERNAME01.TXT');
    try
        // tento la scrittura del file.
        // se fallisce ragionevolmente qualcuno e' loggato
        Rewrite(F);
        // non fallisce pertanto sono l'unico loggato
        // posso memorizzare dove voglio il nome del computer su cui
solo loggato,
        // per rendere disponibile tale informazione dove occorre. Usa
db, TStringList.SaveToFile, etc
        // lancio l'applicativo
        ShowMessage('Sto eseguendo l''applicativo');
        // al termine chiudo il file "semaforo"
        // il file deve essere lasciato aperto per tutto il tempo
dell'applicazione
        CloseFile(F);
        // fine applicazione
    except
        ShowMessage('Hai lasciato aperto un''altra sessione.
Chiudila!');
    end;
end;
Ciao.
Paolo

 indicazioni ho l'impressione che mi tratti da tuo pari ...!!
Lo skill non puo essere illimitato sempre: si cresce. L'unico modo di
arrivare alla 2a volta è passare per la prima.
Per prima cosa, il software non è un qualcosa "a se"....
Va PENSATO per essere calato senza troppi traumi in contesti REALI.
Questo vuol dire che prima di scrivere una cosa, la si deve PENSARE.
E dopo averla pensata, occorre prima di tutto chiedersi: se uso questa
tecnica il cliente sarà costretto ad alterare qualcosa nella sua
confgurazione di rete? E se si, cosa?
Un conto è dire al cliente "mi serve un utente di rete cosi e
cosa..."...
Ma dire "mi devi aprire delle porte nel firewall..." è tutt'altra
cosa, vista la (a volte ma non sempre) giustificata paranoia sulla
sicurezza.
Se lo dico ad un mio amico sistemista mi lincia...e non sarebbe
l'unico!
Ancora, dire al cliente che ti serve la pw dell'amministratore di
rete....x poi metterla in un file non criptato!
senza contare poi che queste pw, volendo essere precisi, dovrebbero
cambiare con una certa frequenza....
..e senza contare che IO non la vorrei sapere...
...per non essere poi coinvolto in casini se qualche dirigente
paraculo fa una cazzata e poi dice "ma la pw la tiene pure alberto
salvati....."
Vedi come le cose si complicano?
La cosa grave non è che tu, che non sei skillato, a queste cose non
pensi...Nel tuo caso è accettabile...
La cosa grave è che gente con anni di esperienza queste domande (e
tante altre...) non se le fa...
La sintesi è: si, teoricamente puoi killare un processo su un altro
pc.
Ma per farlo potrebbe essere necessario fare cose che rendono la rete
meno sicura.
Ergo, la domanda ora è: ti senti di assumerti una responsabilita' del
genere per ottenere cio che vorresti fare?
A.

 genere per ottenere cio che vorresti fare?
Risposta : Assolutamente NO ! ergo non killo niente !!!


> Posso sapere perche' ???
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28393/toc.htm
http://publib.boulder.ibm.com/infocenter/wchelp/v5r6m1/index.jsp?topic=/com.ibm.commerce.database.doc/refs/rdbrdatatype.htm
A.

 sul pc X dal pc Y ??
Il programma va giï¿œ bene cosi' com'ï¿œ adesso: non esiste un software a 
mia conoscenza che permetta in maniera *standard* (pensa al 
funzionamento dei programmi quali office o altri gestionali tipo 
zucchetti, passepartout, esatto, eccc) di killare un processo attivo su 
un altro pc.. sarebbe una cagata pazzesca peggio della corazzata 
potemkin!
Quello che tu puoi fare ï¿œ misurare il tempo di inattivitï¿œ fino al 
raggiungimento del tuo limite prefissato, e chiudere poi il programma 
da solo abortendo tutte le eventuali scritture su db pendenti.
Esiste un evento perfetto per questo tipo di utilizzo, e si chiama 
OnIdle, una soluzione simile a quella che dovresti implementare si 
trova spiegata qui:
http://delphi.about.com/od/adptips2004/a/bltip1104_4.htm
Ciao
-- 
Morde

 
http://delphi.about.com/od/adptips2004/a/bltip1104_4.htm
Ho confuso onilde della tapplication con questo post, scusa. Segui il 
post su about.
Ciao
-- 
Morde