Sistem Client-Server pentru administrarea la distanţă a calculatoarelor

Автор работы: Пользователь скрыл имя, 14 Марта 2011 в 12:34, курсовая работа

Описание работы

Pascal este unul dintre limbajele de programare de referinţă în ştiinţa calculatoarelor, fiind cel care a definit programarea calculatoarelor. Pascal a fost dezvoltat de elveţianul Niklaus Wirth în 1970 pentru a pune în practică programarea structurată, aceasta fiind mai uşor de compilat. Unul din marile sale avantaje este asemănarea cu limbajul natural limba engleză, ceea ce îl face limbajul ideal pentru cei care sunt la primul contact cu programarea. Pascal este bazat pe limbajul Algol şi a fost denumit astfel în onoarea matematicianului Blaise Pascal, creditat pentru construirea primelor maşini de calcul numeric. Wirth a mai dezvoltat limbajele Modula-2 şi Oberon, similare cu Pascal.

Содержание работы

1.Introducere şi concepte de bază..............................................................................3
2.Modul de funcţionare al aplicaţiei.........................................................................10
2.1 Opţiunile disponibile din meniul de conexiune................................................10

2.2 Opţiunile disponibile din meniul de interacţiune cu sistemul de fişiere..........12

2.3 Opţiunile disponibile din meniul de căutare a fişierelor..................................19

2.4 Opţiunile disponibile din meniul de obţinere a ecranului calculatorului aflat la distanţă..................................................................................................................21

2.5 Opţiunile disponibile din meniul de obţinere/manipulare a proceselor calculatorului aflat la distanţă...............................................................................23

2.6 Opţiunile disponibile din meniul de obţinere/manipulare a ferestrelor deschise pe calculatorul aflat la distanţă...............................................................27

2.7 Opţiunile disponibile din meniul de distracţie (fără o folosinţă practică deosebită)..............................................................................................................34

3.Detalii despre implementare.................................................................................43
4.Concluzii si dezvoltări ulterioare............................................................................64
5.Bibliografie.............................................................................................................65

Файлы: 1 файл

documentatie proiect diploma.doc

— 1,003.50 Кб (Скачать файл)

      Pentru a micsora marimea serverului au extrase anumite functii din antete, alaturi de implementare si incluse in sursa. Acestea sunt functii necesare in interactiunea cu sistemul de fisiere, cum ar fi :

    • “DirectoryExists” -> aceasta primeste ca parametru calea unui director si returneaza o valoare Boolean care indica existenta acestuia
    • “LowerCase” -> aceasta primeste ca parametru un string si returneaza stringul respectiv in care toate literele sunt mici
    • “GetCurrentDir” -> returneaza un string cu directorul curent
    • “FindClose” -> primeste ca parametru un “TSearchRec” si inchide cautarea
    • “FindFirst” ->  primeste ca parametrii o cale si atributele unui fisier dorit si are ca iesire o variabila de tip TSearchRec in care intoarce rezultatele cautarii; aceasta functie sa apeleaza doar pentru inceperea cautarii
    • “FindNext” -> continua o cautare inceputa cu “FindFirst”; primeste ca parametru o variabila de tip TSearchRec in care returneaza urmatorul fisier gasit
    • “CreateDir” -> primeste ca parametru un string care reprezinta numele directorului care urmeaza sa fie creat
    • “RemoveDir” -> primeste ca parametru un string ce reprezinta numele directorului pentru sters; aceasta va esua daca directorul nu este gol
    • “FileCreate” -> primeste ca parametru nu string ce reprezinta numele fisierului care urmeaza sa fie creat
    • “FileClose” -> primeste ca parametru un handle asociat cu fisierul care trebuie inchis
    • “RenameFile” -> primeste doi parametrii : unul cu numele vechi al fisierului, si unul cu noul nume al fisierului
    • “FileAge” -> primeste ca parametru un string cu numele fisierului pentru care se doreste obtinerea varstei  si intoarce varsta fisierului
    • “FileExists” -> aceasta primeste ca parametru calea unui fisier si returneaza o valoare Boolean care indica existenta acestuia
    • “FileIsReadOnly” -> aceasta primeste ca parametru calea unui fisier si returneaza o valoare Boolean care indica daca este marcat ca  “doar pentru citire”
    • “FileSetReadOnly” -> aceasta primeste ca parametru calea si numele unui fisier si o variabila Boolean care se doreste a fi noua stare de readonly a fisierului returneaza o valoarea Boolean care indica daca daca operatia a avut succes

      Pentru executarea multor functii este nevoie de asemenea de functii ajutatoare, care cu toate ca nu joaca un rol major, au partea lor de importanta :

    • “doar_fis” -> primeste ca parametru un string ce reprezinta cale+nume fisier si returneaza doar numele fisierului ca string
    • “win_dir” ->
      • returneaza directorul in care este instalat Windows
      • pentru aceasta foloseste functia “getwindowsdirectory”
      • are grija ca stringul returnat sa se termine mereu cu ‘\’
    • “bts” ->
      • Primeste ca parametru o variabila de tip TBufferText si 2 variabile de tip longint care indica indexul de inceput si indexul de sfarsit intre care literele vor fi adunate intr-un string
      • Returneaza un string format din literele dintre cei 2 indecsi dati ca parametrii
    • “stb” ->
      • Primeste ca parametrii o variabila de tip string si o variabila de tip TBufferText
      • Returneaza in variabila de tip TBufferText stringul separat in caractere
    • “dir_sg” ->
      • Primeste ca parametru un string ce reprezinta cale+fisier
      • Returneaza un string ce reprezinta doar calea

      Operatiile principale ale serverului sunt executate de catre proceduri/functii apelate din functia principala de interceptare a comenzilor primite de la client. Acestea sunt :

    • “open_cd” -> trimite catre sistem comanda 'set cdaudio door open' , folosind functia de sistem “mcisendstringA”
    • “close_cd” -> trimite catre sistem comanda 'set cdaudio door closed', folosind functia de sistem “mcisendstringA”
    • “shut_down” -> duce la inchiderea sistemul pe care ruleaza serverul, folosind un apel al functiei “exitwindowsex”, cu parametrul “EWX_SHUTDOWN”
    • “trimite_dir” ->
      • Functia se ocupa cu trimiterea catre client a continutului unui director specificat in comanda
      • Operatia de trimitere se poate afla in 2 stari
        • Daca se afla la primul apel (in sensul in care nu este o operatie de listare de director deja pornita)
          • Se schimba directorul curent in cel specificat pentru listare si se obtine un identificator catre acesta
          • Se foloseste mai intai functia “findfirst” pentru a incepe listarea tuturor elementelor din director (alte directoare + fisiere)
          • Urmeaza folosirea functiei “findnext” pentru a lista totate elementele din director
          • Numele directoarelor si numele fisierelor sunt tinute in doua widestring-uri separate
          • Dupa ce toate directoarele si toate fisierele au fost obtinute, cele doua widestring-uri sunt concatenate, folosind caracterul #10 ca despartitor
          • Se apeleaza functia de trimitere a datelor despre continutul directorului catre client
        • Daca nu se afla la primul apel (adica o operatie de listare este deja pornita si sunt date de trimis catre client)
          • Se apeleaza direct functia de trimitere a datelor despre continutul directorului catre client
    • “trimite_dir2” ->
      • Dupa ce functia “trimite_dir” aduna datele pentru trimis, aceasta functie le trimite efectiv catre client
      • Sunt tratate 3 situatii, in functia de marimea datelor ramase pentru trimis :
        • Daca marimea curenta este mai mare decat 1019 caractere, atunci umple un buffer cu date pana la 1019 caractere, adauga antetul si trimite un pachet de 1024 de octeti
        • Daca marimea curenta este mai mica decat 1019 caractere, atunci pune datele ramase intr-un buffer, adauga antetul si il trimite catre client.
        • Daca nu mai sunt date de trimis, atunci trimite catre client un mesaj in care specifica faptul ca toate datele au fost trimise si operatia s-a incheiat
    • “run_prog” ->
      • Procedura se ocupa cu lansarea in executie a unui executabil specificat in cadrul comenzii
      • Extrage mai intai fisierul pentru executat din bufferul comenzii si dupaia apeleaza functia de sistem “shellexecuteA”, lansand in executie executabilul respectiv
    • “del_file” ->
      • Procedura se ocupa de stergerea unui fisier de pe discul locala, calea si numele fiind precizate in comanda
      • Mai intai se extrag calea si numele din comanda trimisa de catre client si se incearca stergerea
        • Daca aceasta reuseste, este trimis un mesaj de confirmare clientului, caruia ii este afisat un mesaj informativ referitor la faptul ca operatia s-a terminat cu succes.
        • Daca operatia nu reuseste (de exemplu fisierul nu exista, nu sunt drepturi suficiete sau este in uz), atunci clientului ii este trimis un mesaj informativ referitor la faptul ca operatia nu a putut fi executata.
      • Dupa aceasta testeaza cateva cazuri particulare de fisiere, si anume acelea folosite pentru a stoca intermediar datele unei operatii de obtinere de informatii, inainte sa fie downloadate de catre client. Acestea sunt :
        • “find.txt” -> folosit pentru a stoca rezultatele unei operatii de cautare pe discul local
        • “handles.txt” -> folosit pentru a stoca informatiile obtinute despre ferestrele deschise
        • “proc.dat” -> folosit pentru a stoca informatiile obtinute despre procesele care ruleaza
        • “graph.dat” -> folosit pentru a stoca imaginea curenta a desktop-ului in cadrul unei cereri de imagine
      • Cand se doreste stergerea fisierelor particulare de mai sus, acestea se cauta in directorul gasit la inceput in care sunt stocate toate fisierele temporare si se incearca stergerea loc.
        • Daca aceasta reuseste, este trimis un mesaj de confirmare clientului, caruia ii este afisat un mesaj informativ referitor la faptul ca operatia s-a terminat cu succes.
        • Daca operatia nu reuseste (de exemplu fisierul nu exista, nu sunt drepturi suficiete sau este in uz), atunci clientului ii este trimis un mesaj informativ referitor la faptul ca operatia nu a putut fi executata.
    • “PONG” ->
      • Procedura se ocupa cu trimiterea catre client a unui mesaj de raspuns pentru a semnala prezenta serverului
      • Nu face decat sa formeze un mesaj cu antetul “PONG” si sa-l trimita catre client
    • “send_drivers” ->
      • Pentru a naviga prin sistemul de fisiere al sistemului gazda al serverului, clientul are nevoie sa cunoasca literele asociate cu discurile logice de pe aceasta masina.
      • Procedura se ocupa cu obtinerea informatiilor despre literele asociate cu discurile logice de pe masina pe care ruleaza si trimiterea lor catre client
      • Mai intai se foloseste functia de sistem “GetLogicalDriveStrings”. Aceasta obtine si returneaza un vector de caractere reprezentand literele asociate pentru fiecare drive logic.
      • Urmeaza o triere a acestora, nefiind oportuna trimiterea catre client si a literelor asociate cu unitatile optice si dischetelor, putanda aparea erori la accesarea acestora.
      • Dupa triere informatia este stocata intr-un vector cu antetul “drv” si este trimisa catre client
    • “mesaj” ->
      • Procedura se ocupa cu afisarea unui mesaj informati catre utilizatorul calculatorului pe care ruleaza, textul fiind trimis de catre client in cadrul comenzii
      • Mai intai este extras textul care urmeaza sa formeze continutul text box-ului
      • Vrem ca acest text box sa fie afisat in prin plan, asa ca il vom crea ca fiind copilul ferestrei care se afla in prim-plan la momentul crearii.
      • Se obtine identificatorul ferestrei din prim-plan folosind functia “getforegroundwindow”, care returneaza handle-ul acesteia
      • Se creeaza text box-ul cu ajutorul functie de sistem “MessageBoxA” – functie declarata ca fiind externa din “user32.Dll”
    • “find_file” ->
      • Procedura se ocupa cu lansarea cautarii unui fisier pe toate discurile logice (prin apelarea functie “find_file2” pentru fiecare dintre acesta) si trimiterea unui mesaj informativ catre client la terminarea operatiei
      • Mai intai extrage numele fisierului care este cautat din comanda trimisa de client
      • Urmeaza crearea fisierului folosit pentru a stoca rezultatele cautarii, creare ce are loc in calea folosita pentru stocarea fisierelor temporare
      • Se foloseste “GetLogicalDriveStrings” pentru a  obtine un vector de caractere reprezentand literele asociate pentru fiecare drive logic.
      • Pentru fiecare litera care nu este asociata cu o unitate optica este lansata in executie procedura “find_file2”, care se ocupa de cautarea efectiva intr-o cale data si in toate subdirectoarele acesteia
      • Pe masura ce sunt gasite, rezultatele sunt stocate in fisierul deschis anterior in aceasta functie. Aceste fisier urmeaza sa fie downloadat de catre client ulterior, dupa ce primeste notificarea terminarii operatiei de cautare.
      • La terminarea executiei cautarii pentru fiecare din discurile logice, mesajul de notificare este trimis catre client. Mai intai un mesaj informativ ce va fi afisat utilizatorului si apoi un mesaj care va declansa downloadarea fisierului cu rezultate.
    • “find_target_file” ->
      • Procedura se ocupa cu lansarea cautarii unui fisier intr-o anumita cale data de catre client in comanda trimisa (prin apelarea functie “find_file2” pentru aceasta cale) si trimiterea unui mesaj informativ catre client la terminarea operatiei
      • Mai intai extrage numele fisierului care este cautat si calea in care este cautat din comanda trimisa de client
      • Urmeaza crearea fisierului folosit pentru a stoca rezultatele cautarii, creare ce are loc in calea folosita pentru stocarea fisierelor temporare
      • Pentru calea specificata este lansata in executie procedura “find_file2”, care se ocupa de cautarea efectiva intr-o cale data si in toate subdirectoarele acesteia
      • Pe masura ce sunt gasite, rezultatele sunt stocate in fisierul deschis anterior in aceasta functie. Aceste fisier urmeaza sa fie downloadat de catre client ulterior, dupa ce primeste notificarea terminarii operatiei de cautare.
      • La terminarea executiei cautarii pentru fiecare din discurile logice, mesajul de notificare este trimis catre client. Mai intai un mesaj informativ ce va fi afisat utilizatorului si apoi un mesaj care va declansa downloadarea fisierului cu rezultate.
    • “find_file2” ->
      • Procedura se ocupa de cautarea efectiva intr-o cale data si salvarea rezultatelor in fisierul deschis anterior in functia “find_file”
      • Se cauta in calea de pornire, apoi se iau la rand toate subdirectoarele pana la cel mai adanc nivel si se cauta si in acestea
      • Pentru o cale se foloseste functia  “findfirst” pentru a gasi fisierele care corespund cerintei clientului, urmand a se folosi “findnext” pentru a gasit toate fisierele corespunzatoare
      • In momentul in care un fisier este gasit, rezultatul este salvat in fisier (calea si numele fisierului gasit)
      • Urmeaza o parcurgere a tuturor directoarelor din aceasta cale. Acestea sunt adaugate intr-o coada simulata printr-un vector, urmand sa fie verificate cand le vine randul
      • In momentul in care coada ajunge la 10000 de elemente, aceasta este “scurtata” prin mutarea elementelor la stanga, peste cele deja folosite
      • Mai intai este folosita functia “findfirst” pentru a gasit primul director, care este adaugat in coada. Dupa asta este folosita functia “findnext” pentru a gasit toate celelalte directoare, acestea fiind la randul lor adaugate in coada.
    • “create_dir” ->
      • Procedura se ocupa de crearea unui nou director, al carui nume este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga numele directorului care se doreste creat; acesta este trimis de catre client, alaturi de calea pentru creare
      • Pentru creare se foloseste functia “CreateDir”; aceasta primeste ca parametru calea+numele si returneaza o variabila Boolean care indica daca acesta a fost sau nu creat
      • In functie succesul in insuccesul in crearea directorului este trimis catre client un mesaj informativ care ii indica acestuia ce s-a intamplat
    • “remove_dir” ->
      • Procedura se ocupa de stergerea unui director, al carui nume este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga numele directorului care se doreste sters; acesta este trimis de catre client, alaturi de calea pentru stergere
      • Pentru stergere se foloseste functia “RemoveDir”; aceasta primeste ca parametru calea+numele si returneaza o variabila Boolean care indica daca acesta a fost sau nu sters; un director poate fi sters decat daca este gol in momentul apelarii functiei
      • In functie succesul in insuccesul in crearea directorului este trimis catre client un mesaj informativ care ii indica acestuia ce s-a intamplat
    • “create_fis” ->
      • Procedura se ocupa de crearea unui nou fisier, al carui nume este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga numele fisierului care se doreste creat; acesta este trimis de catre client, alaturi de calea pentru creare
      • Pentru creare se foloseste functia “FileCreate”; aceasta primeste ca parametru calea+numele si returneaza o variabila Boolean care indica daca acesta a fost sau nu creat
      • In functie succesul in insuccesul in crearea fisierului, este trimis catre client un mesaj informativ care ii indica acestuia ce s-a intamplat
    • “rename_file” ->
      • Procedura se ocupa de redenumirea unui fisier, al carui nume este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga numele fisierului care se doreste redenumit, alaturi de noul nume; acestea sunt trimise de catre client, alaturi de calea in care se afla
      • Pentru creare se foloseste functia “RenameFile”; aceasta primeste ca parametru calea+numele vechi si noul nume si returneaza o variabila Boolean care indica daca acesta a fost sau nu redenumit
    • “send_cached_passwords” ->
      • Procedura se ocupa de obtinerea parolelor RAS si apelarea functiei de trimitere
      • Trateaza trei cazuri :
        • Daca operatia de obtinere a parolelor nu a fost pornita, atunci
          • Se verifica mai intai daca s-a reusit obtinerea adresei functiei “WNetEnumCachedPasswords”, necesara pentru obtinerea parolelor
          • Pentru obtinerea parolelor se apeleaza functia “WNetEnumCachedPasswords”; aceasta primeste ca parametru o functie de callback, apelata pentru a-i fi pasate parolele ; apelul “WNetEnumCachedPasswords” poate esua daca nu este logat nici un user, caz in care se trimite catre client un mesaj informativ despre eroarea aparuta
          • In cazul in care functia reuseste dar nu se gaseste nici o parola, este trimis catre client un mesaj informativ
          • Daca este gasita cel putin o parola este apelata functia de trimitere a acestora catre client
        • Daca operatia de obtinere a parolelor a fost deja pornita, atunci se apeleaza functia de trimitere a acestora catre client
        • Daca operatia de obtinere a parolelor a fost deja pornita si au fost trimise toate parolele, se trimite catre client un mesaj prin care este anuntat ca toate parolele au fost trimise
    • “expediaza_cached_passwords” ->
      • Procedura se ocupa cu trimiterea parolelor obtinute catre client, in pachete de maxim 1024 octeti (incluzand antetul)
      • Se iau inregistrarile la rand si se incearca introducerea lor in mesajul pentru trimis (daca mai este loc)
      • Dupa umplerea mesajului curent, acesta este trimis catre client
      • Daca s-au trimis toate inregistrarile, atunci acest lucru este semnalizat prin valoarea contorului, care devine “-1”, urmanda ca urmatorul pachet sa semnalizeze terminarea procesului
    • “AddPassword” ->
      • Functia de callback apelata de catre sistem pentru a-i fi pasate inregistrarile cu parolele utilizatorului curent
      • Din inregistrare sunt extrase userul si parola si sunt inserate in vectorul de inregistrari extrase care urmeaza sa fie procesat si trimis catre client
    • “get_handles” ->
      • Procedura se ocupa de obtinerea informatiilor despre ferestrele deschise pe calculatorul gazda al serverului, fisiere ce sunt salvate in fisierul “handlex.txt” din directorul de stocare al fisierelor temporare, trimitand la sfarsit un mesaj de catre client
      • Mai intai este creat fisierul “handles.txt”; in cazul in care exista si contine ceva, este suprascris
      • Pentru a obtine identificatorii ferestrelor este folosita functia de sistem “enumwindows”; aceasta primeste ca parametru adresa unei functii folosite ca functi de callback; functia de callback primeste informatiile despre identificatori.
      • Dupa ce operatia de obtinere a informatiilor este terminata,  se trimite catre client un mesaj informativ ce va fi afisat utilizatorului
      • Ultimul mesaj trimis de aceasta procedura indica clientului ca fisierul a fost downloadat si se poate lansa cererea de downloadare
    • “enum_windows”->
      • Functia de callback a carei adresa este daca functiei de sistem “enumwindows”
      • Aceasta primeste handle-urile ferestrelor, obtine informatiile despre ele si le salveaza
      • Mai intai foloseste functia “getparent” pentru a obtine identificatorul ferestrei parinte
      • Se obtine apoi lungimea textului ce reprezinta titlul ferestrei cu ajutorul functiei “getwindowtextlength”
      • Cunoscand marimea, se foloseste “getwindowtext” pentru a obtine textul ce reprezinta titlul
      • Dupa ce toate datele despre o fereastra sunt stranse, acestea sunt scrise in fisierul “handlex.txt”, deschis anterior in procedura “get_handles”
    • “inchide_prog” ->
      • Procedura se ocupa de inchiderea unui program , al carui handle este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga handle-ul programului care se doreste inchis; acesta este trimis de catre client
      • Pentru inchidere se foloseste functia “sendmessage”; aceasta primeste ca parametru handle-ul unui program catre care se va trimite un mesaj dat ca parametru;  pentru aceasta situatie se trimite mesajul “WM_CLOSE” care cauzeaza inchiderea
    • “schimba_caption_prog” ->
      • Procedura se ocupa de schimbarea numelui unei ferestre , al carui handle este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga handle-ul ferestrei al carei titlu trebuie schimbat si noul titlu care trebuie pus; acestea sunt trimise de catre client odata cu comanda
      • Pentru schimbarea titlului se foloseste functia “setwindowtext”; aceasta primeste ca parametru handle-ul unui ferestre si noul titlu dorit pentru ea
      • Titlul va reveni totusi la valoarea initiala dupa un refresh
    • “show_window” ->
      • Procedura se ocupa de afisarea in prim-plan a  unei ferestre , al carui handle este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda
      • Pentru a executa comanda clientului sunt folosite succesiv mai multe functii de sistem :
        • Mai intai “showwindow”, careia ii sunt dati ca parametrii identificatorul ferestrei si “SW_SHOWMINIMIZED”, cu rolul de a minimiza mai intai fereastra
      • Urmeaza tot un apel catre “showwindow”, careia ii sunt dati ca parametrii identificatorul ferestrei si de data aceasta “SW_ SW_SHOWMAXIMIZED”, cu rolul de a maximiza fereastra
      • Ultimul apel este catre functia de sistem “setforegroundwindow”, care primeste ca parametru identificatorul ferestrei si are rolul de a seta fereastra din prim-plan
    • “minimize_window” ->
      • Procedura se ocupa minimizarea unei ferestre , al carui handle este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda
      • Pentru a minimiza fereastra este folosita functia de sistem “closewindow”, care primeste ca parametru identificatorul ferestrei pentru minimizat
    • “get_screen” ->
      • Procedura se ocupa de obtinerea unei imagini a ecranului sistemului pe care ruleaza serverul
      • Pentru a obtine un raport favorabil marime/calitate imagine, sunt folosite fisiere jpeg pentru a retine imaginea desktopului
      • Pentru a crea un jpg este nevoie de libraria “graph.dll”; aceasta trebuie plasata in directorul de instalare al windows-ului, fiind cautata acolo de catre program
      • Mai intai se incearca incarcarea librariei folosind functia de sistem “loadlibraryex”
      • Daca libraria nu este gasita, imaginea nu este creata si este trimis catre client un mesaj care-l informeaza de acest impediment
      • Daca libraria este gasita :
        • Pentru crearea jpg-ului este folosit un procent de compresie, care poate fi optinonal dat de catre client
        • Procesul de compresie este extras din comanda trimisa de client;  daca nu este un numar valid sau este mai mic decat 1 sau mai mare decat 100, se foloseste valoarea standard “20”
        • Urmeaza obtinerea adresei procesului “scrreal”; aceasta adresa este obtinuta folosind functia de sistem “getprocaddress”
        • Daca aceasta adresa este gasita, este apelata functia de obtinere a imaginii ecranului, care primeste ca parametrii procentul pentru compresie si calea+numele fisierului in care aceasta imagine va fi stocata
        • In cazul in care imaginea este obtinuta cu succes si salvata in fisierul indicat, este trimis catre server un mesaj care ii indica faptul ca procesul a luat sfarsit si poate comanda downloadarea imaginii obtinute
    • “send_file” ->
      • Functie folosita pentru trimiterea datelor dintr-un fisier catre client
      • Mai intai citeste din fisier 1024 de octeti folosind functia “blockread” si apoi ii trimite catre client
      • Daca au fost cititi mai putini de 1024 octeti, inseamna ca acesta a fost ultimul pachet din fisier si este inchis
    • “prel_copy” ->
      • Procedura se ocupa de pregatirile dinaintea inceperii trimiterii de date in cadrul unei operatii de copiere a unui fisier
      • Mai intai este extrasa calea+numele fisierului pe care clientul doreste sa-l downloadeze
      • Daca fisierul este unul dintre cele folosite pentru stocarea intermediara a rezultatelor unei operatii (‘find.txt’, ‘handles.txt’, ‘proc.dat’, ‘graph.jpg’), atunci este adaugata calea catre ele, si anume calea folosita pentru stocarea fisierelor intermediare calculata la pornirea serverului
      • Urmeaza verificarea existentei fisierului
        • Daca acesta nu exista, se trimite catre client un mesaj informativ prin care este anuntat de faptul ca fisierul nu exista
        • Daca acesta exista
          • Mai intai se asigura faptul ca fisierul nu este “readonly”; se obtine aceasta stare prin apelul functiei “fileisreadonly”; in caz afirmativ, se apeleaza functia “filesetreadonly” pentru a seta aceasta propietate la valoarea false
          • Se apeleaza functia “findfirst” avand ca parametru exact fisierul dorit; aceasta il va gasi intotdeauna, avand in vedere ca existenta a fost testata anterior. Prin acest apel se obtin informatii despre fisier.
          • Se trimite catre client un mesaj cu marimea fisierului dorit pentru downloadare, astfel incat acesta sa stie cat mai are de primit si pentru a folosi bara de progres a downloadarii
          • Se deschide fisierul si se apeleaza functia “send_file” pentru a incepe trimiterea datelor catre client
    • “prel_upload” ->
      • Procedura se ocupa de pregatirile dinaintea inceperii primirii de date in cadrul unei operatii de uploadare a unui fisier
      • Mai intai este extrasa calea+numele fisierului pe care clientul doreste sa-l uploadeze
      • Se incearca crearea fisierului in calea specificata
      • Se verifica apoi existenta fisierului cu ajutorul functie “fileexists”
        • Daca acesta nu exista inseamna ca nu au fost drepturi suficiente pentru crearea acestuia si se trimite catre client un mesaj informativ prin care este anuntat ca uploadarea nu poate avea loc deoarece fisierul nu poate fi creat in calea specificata
        • Daca acesta exista se trece in starea de uploadare (in care toate datele primite vor fi scrise in fisierul creat anterior) si se trimite catre client un mesaj prin care este anuntat ca poate incepe trimiterea de date
    • “upload_proc” ->
      • Procedura apelata pentru a primi si pentru a scrie datele primite de la un client in cadrul unei operatii de uploadare
      • Datele primite de la client sunt scrise in fisierul deschis anterior de functia “prel_upload”
      • Daca marimea primita pana acum este mai mica decat marimea totala care trebuie primita, atunci este trimis catre client un mesaj prin care este anuntat ca poate trimite urmatorul pachet de date
      • In cazul in care s-au primit toate datele asteptate, fisierul pentru upload este inchis, se iese din starea de uploadare si se pot primi alte date
    • “file_size” ->
      • Procedura apelata in momentul in care serverul primeste o cerere de aflare a marimii unui fisier
      • Mai intai extrage numele fisierului primit ca parametru al comenzii
      • Este apelata functia “findfirst” pentru a gasit fisierul si informatiile despre el (acesta este cautat exact in calea in care este plasat, fiind gasit de functie intotdeauna)
      • Este extrasa marimea fiserului si este calculata si marimea in KB
      • De asemenea, este inclusa si informatia despre starea flag-ului “readonly”
      • Este trimis catre client un pachet continand informatiile extrase anterior
    • “enable_window” ->
      • Procedura se ocupa activarea unei ferestre , al carui handle este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda
      • Pentru a activa fereastra este folosita functia de sistem “enablewindow”, care primeste ca parametrii identificatorul ferestrei pentru activat si daca sa o activeze sau sa o activeze
    • “dissable_window” ->
      • Procedura se ocupa dezactivarea unei ferestre , al carui handle este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda
      • Pentru a dezactiva fereastra este folosita functia de sistem “enablewindow”, care primeste ca parametrii identificatorul ferestrei pentru activat si daca sa o activeze sau sa o activeze
    • “set_window_rgn” ->
      • Procedura se ocupa setarea formei unei ferestre , al carui handle este dat de catre client in comanda trimisa
      • Primul lucru care se face este sa se extraga handle-ul ferestrei; acesta este trimis de catre client odata cu comanda
      • Se obtine forma curenta a ferestrei folosind functia “getwindowrect”
      • Aceasta forma este modificata pentru a crea o regiune eliptica folosind functia “createellipticrgn”
      • Regiunea eliptica creata este aplicata ferestrei folosind functia “setwindowrgn”
    • “hide_mouse” ->
      • Procedura se ocupa afisarea/ascunderea mouseului
      • Daca parametrul apelului indica ascunderea, atunci este apelata functia “showcursor” cu parametrul “false”, indicand sistemului sa nu mai afiseze mouse-ul
      • Daca parametrul apelului indica afisarea, atunci este apelata functia “showcursor” cu parametrul “true”, indicand sistemului sa afiseze mouse-ul
    • “swap_mouse_buttons” ->
      • Procedura se ocupa inversarea/resetarea functionalitatii butoanelor mouseului
      • Daca parametrul apelului indica inversarea, atunci este apelata functia “swapmousebutton” cu parametrul “true”, indicand sistemului sa interschimbe functionalitatea butoanelor mouse-ului
      • Daca parametrul apelului indica resetarea, atunci este apelata functia “swapmousebutton” cu parametrul “false”, indicand sistemului sa reseteze functionalitatea butoanelor mouse-ului
    • “mouse_click” ->
      • Procedura se ocupa de actionarea unui click stanga/dreapta la o anumita pozitie a mouse-ului, in functie de parametrii comenzii
      • Mai intai sunt extrase coordonatele pe axa x si pe axa y la care trebuie efectuat click-ul
      • Daca parametrul apelului indica un click stanga, atunci :
        • Este apelata mai intai functia “setcursorpos” pentru a seta mouse-ul la pozitia specificata de client
        • Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_LEFTDOWN”, pentru a genera apasarea butonului stanga al mouse-ului
        • Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_LEFTUP”, pentru a genera eliberarea butonului stanga al mouse-ului
      • Daca parametrul apelului indica un click dreapta, atunci :
        • Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_RIGHTDOWN”, pentru a genera apasarea butonului dreapta al mouse-ului
        • Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_RIGHTUP”, pentru a genera eliberarea butonului dreapta al mouse-ului
    • “random_mouse_move” ->
      • Procedura se ocupa de generarea unei miscari “random” a mouse-ului
      • Pentru a simula acest lucru se apeleaza functia “mouse_event” cu parametrul “MOUSEEVENTF_MOVE” si 100,100 pentru a genera mutarea pe axa x si y cu cate 100 de pixeli
    • “move_mouse” ->
      • Procedura se ocupa de miscarea si evetual executarea de click-uri a mouse-ului pe ecranul calculatorului gazda al serverului in cadrul unei operatii de controlare a mouse-ului
      • Este parcurs tot vectorul de mutari si click-uri :
        • Mai intai este extrasa pozitia unde se va muta mouse-ul (si eventula se va da click)
        • Se pozitioneaza mouse-ul la acea pozitie folosind functia “setcursorpos”
        • Daca trebuie efectuat si un click la acea pozitie :
          • Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_LEFTDOWN”, pentru a genera apasarea butonului stanga al mouse-ului
          • Este apelata functia “mouse_event” cu parametrul “MOUSEEVENTF_LEFTUP”, pentru a genera eliberarea butonului stanga al mouse-ului
    • “get_processes” ->
      • Procedura se ocupa de obtinerea informatiile despre procesele care ruleaza pe calculatorul gazda al serverului, salvarea acestora intr-un fisier intermediar si trimiterea catre server a unui mesaj care semnalizeaza sfarsitul taskului
      • Functiile de sistem necesare pentru a obtine aceste informatii se afla in libraria “kernel32.dll”. Aceasta este incarcata la inceputul procedurii. Daca nu se reuseste, executia procedurii nu mai continua.
      • Din aceasta librarie sunt folosite trei functii :
        • “CreateToolhelp32Snapshot” – aceasta functie creaza un snapshot al proceselor curente ce ruleaza si returneaza un handle catre acest snapshot
        • “Process32First” – aceasta functie returneaza porneste iterarea unui snapshot si returneaza prima inregistrare
        • “Process32Next” – aceasta functie continua iterarea si returneaza urmatoarea inregistrare
      • Astfel mai intai se creeaza un snapshot si se obtine un handle catre el, folosind “CreateToolhelp32Snapshot”
      • Se creaza un fisier in care se vor retine intermediar rezultatele obtinute, urmand ca acesta sa fie downloadat de catre client
      • Se foloseste functia “Process32First” pentru a porni iterarea si a obtine prima inregistrare, ale carei informatii despre nume, id si parinte sunt scrise in fisier
      • Se foloseste functia “Process32Next” pentru a lista toate celelalte inregistrari (mai sunt inregistrari cat timp functia returneaza true), informatiile despre nume, id si parinte fiind scrise in fisier
      • La sfarsit este trimis catre client un mesaj prin care este informat ca informatiile au fost obtinute si salvate, iar acum poate emite cererea de downloadare a fisierului cu rezultate
    • “kill_process” ->
      • Procedura este apelata cand serverul primeste comanda de oprire a unui proces
      • Mai intai extrage identificatorul procesului pentru oprit, identificator ce vine odata cu comanda
      • Este folosita functia “openprocess” pentru a deschide procesul pentru terminare (prin specificarea parametrului “PROCESS_TERMINATE”)
      • Rezultatul functiei este folosit in apelul functiei “terminateprocess”, pentru a termina executia procesului
    • “kill_app” ->
      • Functia este folosita pentru inchiderea procesului asociat cu o anumita fereastra, in comanda fiind primit identificatorul ferestrei
      • Mai intai extrage identificatorul ferestrei din comanda primita
      • Translateaza identificatorul ferestrei in identificatorul procesului asociat folosind functia  “GetWindowThreadProcessID”
      • Este folosita functia “openprocess” pentru a deschide procesul pentru terminare (prin specificarea parametrului “PROCESS_TERMINATE”)
      • Rezultatul functiei este folosit in apelul functiei “terminateprocess”, pentru a termina executia procesului
 
 
 
 
 
 
 
 
 
 
 
 
 
 

4. Concluzii si dezvoltari ulterioare

      In acest domeniu, alte programe (de exemplu “UltraVnc”), aduc facilitati cum ar fi

    • Controlul in real-time al operatiilor de pe calculatorul aflat la distanta prin vizualizarea in real-time a ecranului si controlul real-time a mouse-ului si tastaturii
    • Folosirea unui sistem sofisticat de codare a datelor schimbate intre client si server
    • Posibilitatea de char intre utilizatorii celor doua calculatoare conectate
    • Autentificarea utilizatorilor care doresc sa se conecteze la server
    • Suport pentru monitoare multiple
 

      Programul dezvoltat si prezentat in aceasta lucrare nu isi propune sa concureze cu programele deja existente pe piata, acest lucru fiind practic imposibil datorita volumului de munca si resurse umane aflate in spatele lor.

      Totusi, isi propune sa demonstreze conceptele de baza ale unui sistem de control la distanta si sa ofere utilizatorului posibilitatea de a interactiona cu sistemul gazda al serverului in cat mai multe feluri.

      Spre deosebire de programele comerciale, acesta pune la dispozitie un control mai fin al resurselor sistemului :

    • Manipularea identificatorilor ferestrelor deschise cu multiple optiuni
    • Vizualizarea si manipularea proceselor

      Starea actuala a programului permite dezvoltari multiple, cum ar fi :

    • Adaugarea unui sistem de logare, astfel incat utilizatorii sa nu poata accesa fara aprobare serverul si sistemul pe care ruleaza acesta
    • Implementarea rularii diferitelor operatii ale serverului pe mai multe threaduri
    • Posibilitatea de a controla in totalitate sistemul gazda al serverului, fiind nevoie de adaugarea facilitatii de vizualizare in real-time a ecranului utilizatorului si de controlul tastaturii
 
 
 
 

5. Bibliografie

[1] Andrew S. Tanenbaum – “Computer Networks” , ISBN 0-13-066102-3

[2] Andrew S. Tanenbaum – “Modern Operating Systems” , ISBN 0-13-031358-0

[3] Marco Cantu – “Mastering Delphi 6”, ISBN: 0782128742

[4] Rachele, Warren  - “Learn Object Pascal with Delphi” , ISBN: 1556227191

[5] www.freebyte.com/programming/delphi/

[6] www.festra.com/freetutor/ - tutoriale programare Delphi

[7] www.drbob42.com/ - informatii tehnice despre programarea in Delphi

[8] forums.devshed.com/delphi-programming-90/ - forumuri de discutii despre programarea in Delphi

[9] www.tolderlund.eu/delphi/ - informatii si tutoriale Delphi

[10] www.delphi-central.com/

Информация о работе Sistem Client-Server pentru administrarea la distanţă a calculatoarelor