CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Zamykanie wielu komputerów przez sieć

Zamykanie wielu komputerów przez sieć

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Zamykanie wielu komputerów przez sieć

Nowy postprzez szprotek » środa, 16 lutego 2011, 21:20

Potrzebuję napisać program, który wyłączy mi wiele komputerów przez sieć. Domyślam się, że należy użyć komponentu socket. Mogą to być 2 programy jeden na serwerze, drugi na kliencie i chyba tak będzie najlepiej. Kompletnie nie wiem jak się do tego zabrać i zupełnie nie znam tego komponentu. Poradźcie coś.
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez Cyfrowy Baron » czwartek, 17 lutego 2011, 09:47

Opis prostego komunikatora opartego na socketach znajdziesz w serwisie Cyfrowy Baron w dziale: kursy praktyczne -> komunikator sieciowy.
Jak miałby działać taki program? Na komputerach które chcesz wyłączać musiałby nasłuchiwać program kliencki, który po odebraniu jakiegoś umownego komunikatu od serwera wywołałby funkcją wymuszającą zamknięcie komputera.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez szprotek » czwartek, 17 lutego 2011, 16:38

Wielkie dzięki. działa bardzo skutecznie. Pozostał mi tylko jeden problem - program nie wyłącza wylogowanych komputerów. Może ktoś ma pomysł jak to rozwiązać. :)
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez Cyfrowy Baron » czwartek, 17 lutego 2011, 17:14

Pokaż kod który wymusza zamknięcie komputera.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez szprotek » czwartek, 17 lutego 2011, 17:43

Kod: Zaznacz cały
void __fastcall TForm1::ZamknijWindows()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);

ExitWindowsEx(EWX_FORCE | EWX_POWEROFF, 0);
 
}
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez szprotek » czwartek, 17 lutego 2011, 17:56

Nie tu leży na pewno główny problem - program nasłuchujący jest wrzucony do autostartu. Nie wiem jak to zrobić, żeby się nie zamykał przy wylogowaniu i żeby uruchamiał się przed zalogowaniem. Co do zamieszczonego kodu też nie wiem czy będzie działał przy nieazalogowanym komputerze. :(
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez Cyfrowy Baron » czwartek, 17 lutego 2011, 18:46

Po wywołaniu funkcji ExitWindowsEx zamknij aplikację. Funcja wysyła do systemu polecenie zamknięcia i nie musi czekać na efekty pracy. Poza tym dodaj do funkcji flagę EWX_LOGOFF by wymusić wylogowanie:

KOD cpp:     UKRYJ  
void __fastcall TForm1::ZamknijWindows(void)
{
 HANDLE hToken;
 TOKEN_PRIVILEGES tkp;
 OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
 LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);
 tkp.PrivilegeCount = 1;
 tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
 AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);

 ExitWindowsEx(EWX_LOGOFF | EWX_FORCE | EWX_POWEROFF, 0);

 Application->Terminate();
}


Jeszcze jednak uwaga, jeżeli tworzysz funkcję która nie pobiera żadnych argumentów to wstawiaj tam parametr void. Kiedyś miałem problemy z funkcją, która nie miała tam żadnego parametru. To nic nie kosztuje, a unikniesz ewentualnych problemów.

KOD cpp:     UKRYJ  
void __fastcall ZamknijWindows(void);

void __fastcall TForm1::ZamknijWindows(void)
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez szprotek » czwartek, 17 lutego 2011, 20:25

Jeszcze mam tu jeden problem. Program nasłuchujący jest na razie umieszczony w folderze autostart. Próbowałem go dodać do rejestru ale uruchamia mi się wtedy w trybie ukrytym, tzn. nie ma widocznego okna formatki.
Kod: Zaznacz cały
#include <Registry.hpp>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TRegistry& Rejestr = *new TRegistry();
   Rejestr.RootKey = HKEY_LOCAL_MACHINE;
   Rejestr.OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", false);
   Rejestr.WriteString("Program ExitWin", "C:\\Program files\\ExitWin\\ExitWin.exe");
   delete &Rejestr;
}
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez Cyfrowy Baron » czwartek, 17 lutego 2011, 20:44

W folderze Autostart nie umieszcza się programu lecz skrót do programu.

Próbowałem go dodać do rejestru ale uruchamia mi się wtedy w trybie ukrytym, tzn. nie ma widocznego okna formatki.


To nie ma nic wspólnego z rejestrem. Źle napisałeś program - źle w tym sensie, że coś nie tak masz poustawiane z oknem programu.
U siebie używam dwóch programów własnej produkcji. Jeden uruchamia się jako ukryty gdyż tak go zaprogramowałem, drugi uruchamia się normalnie, czyli okno jest widoczne. Obydwa uruchamiają się z systemem poprzez rejestr.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez szprotek » piątek, 18 lutego 2011, 00:16

To jeszcze nie rozwiązuje kwestii nie działania programu kiedy komputer jest niezalogowany, o ile jest to możliwe w bcb. chodzi mi o to, żeby program uruchomił się i działał zanim uZytkownik się zaloguje, lub jak się wyloguje. Nie wiem też jak zrobić deinstalację wpisów w rejestrze.
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez Cyfrowy Baron » piątek, 18 lutego 2011, 11:38

Chodzi Tobie o to, żeby program uruchomił się przed podaniem przez użytkownika loginu i hasła? Przed zalogowaniem system nie może załadować żadnego profilu użytkownika, gdyż nie wie kto będzie się logował. Taki program będzie się uruchamiał dla każdego użytkownika.

Podaję procedurę dla Windows XP. W samym programie nic nie zmieniasz, jednak by to działało musisz zainstalować w systemie Windows Server 2003 Resource Kit Tools. Działa tylko z Windows 2003 i XP.

Po zainstalowaniu pakietu:

  • Uruchom konsolę CMD: menu Start -> Uruchom polecenie cmd.
  • W oknie konsoli przechodzisz do katalogu w którym zainstalowałeś Resource Kit Tools, czyli np. c:\Program Files\Windows Resource Kits\Tools>.
  • Teraz wpisujesz komendę, po niej nazwę aplikacji która ma się ładować przed zalogowaniem (tylko nazwę pliku aplikacji, bez ścieżki dostępu), a po niej ścieżkę dostępu do aplikacji, która ma uruchamiać ten program, czyli np: c:\Program Files\Windows Resource Kits\Tools>instsrv.exe mój_program.exe c:\Program Files\Windows Resource Kits\Tools\srvany.exe. Program instsrv służy do instalowania usług, a program srvany.exe do uruchamiania programów jako usługi.
  • Wciskasz ENTER. System wyświetli komunikat: The service was successfuly aded!.
  • Została utworzona nowa usługa. Teraz należy ja skonfigurować tak by program uruchamiał się automatycznie. Usługa jeszcze nie wie, gdzie znajduje się ten program.
  • Uruchamiasz edytor Rejestru: menu Start -> Uruchom polecenie regedit.
  • Przechodzisz do klucza: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services.
  • W kluczu Services znajdują się podklucze. Szukasz podklucza, który nazywa się tak jak Twoja aplikacja, tutaj mój_program.exe.
  • Klikasz prawym przyciskiem na tym podkluczu i wybierasz z menu polecenie: Nowy -> Klucz. Tworzysz klucz o nazwie Parameters.
  • Klikasz prawym klawiszem na podkluczu Parameters i wybierasz polecenie: Nowy -> Wartość Ciągu. Wartości która pojawi się w sekcji po prawej stronie nadajesz nazwę Application. Klikasz dwukrotnie na Application i w oknie które wyskoczy wpisujesz ścieżkę dostępu do aplikacji, która ma się ładować przed zalogowaniem, na końcu dodajesz parametr /tray, np: "c:\moje programy\mój program.exe" /tray. Zauważ, że wpisałem cudzysłowy. Taki program może być uruchomiony tylko jako usługa ukryta. Nie ma możliwości wyświetlenia okna jakiegokolwiek programu przed zalogowaniem się do systemu.
  • Ponownie klikasz prawym klawiszem na podkluczu Parameters i wybierasz polecenie Nowy -> Wartość Ciągu. Wartości która pojawi się w sekcji po prawej stronie nadajesz nazwę AppDirectory. Klikasz dwukrotnie na AppDirectory i w oknie które wyskoczy wpisujesz ścieżkę dostępu do aplikacji, która ma się ładować przed zalogowaniem np: "c:\moje programy\mój program.exe".
  • Zamykasz edytor rejestru i restartujesz system by sprawdzić, czy to działa.

service.png


Zadajesz pewnie sobie pytanie jak to zrobić bez Windows Server 2003 Resource Kit Tools. Musisz napisać nie tyle zwykłą aplikację ile usługę i zarejestrować ją w systemie. Jak napisać usługę? Nie wiem! Nigdy żadnej nie napisałem.

Dla systemu Windows 7 jest Remote Server Administration Tools for Windows 7 and Windows Servers, ale poza tym nic więcej o tym nie wiem.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez szprotek » piątek, 18 lutego 2011, 20:42

Pozostaje jeszcze pytanie - jak to wszystko w razie potrzeby odinstalować ? :shock:
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez Cyfrowy Baron » piątek, 18 lutego 2011, 20:49

Resource Tools Kits nie musisz odinstalowywać, gdyż to tylko zbiór programów, które nie integrują się z systemem, więc wystarczy to usunąć, jeżeli nie ma opcji deinstalacji. Usługę wystarczy usunąć - ► patrz serwis: Cyfrowy Baron dział: porady -> API -> usuwanie usługi.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez szprotek » sobota, 19 lutego 2011, 00:17

:?: Jeszcze jedno pytanko. Jak usunąć wpisy z rejestru za pomocą kodu bcb. Wie tylko, że są funkcje RegDeleteKey i RegDeleteValue, ale nie mam pojęcia jak ich użyć.
Avatar użytkownika
szprotek
Bladawiec
Bladawiec
 
Posty: 33
Dołączył(a): niedziela, 13 lipca 2008, 21:44
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Windows XP, Windows 7
Kompilator: C++ Builder 6.0 Enterprise Suite,
C++ Builder 6.0 Personal
Gadu Gadu: 6403317
    Windows XPInternet Explorer 8

Re: Zamykanie wielu komputerów przez sieć

Nowy postprzez Cyfrowy Baron » sobota, 19 lutego 2011, 10:52

Jak to nie wiesz jak ich użyć?! :shock: A pliki pomocy od czego są? :evil:

► patrz serwis: Cyfrowy Baron dział: teoria -> obsługa rejestru.


KOD cpp:     UKRYJ  
#include <Registry.hpp>
#include <memory>

void __fastcall TForm2::Button1Click(TObject *Sender)
{
 TRegistry *Rejestr = new TRegistry(KEY_WRITE);
 Rejestr->RootKey = HKEY_LOCAL_MACHINE;
 Rejestr->OpenKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", false);

 Rejestr->DeleteValue("nazwa wartości");

 Rejestr->CloseKey();
 delete Rejestr;
}
//-------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 std::auto_ptr<TStrings> vList(new TStringList);

 TRegistry *Rejestr = new TRegistry();
 Rejestr->RootKey = HKEY_LOCAL_MACHINE;

 if(!Rejestr->OpenKey("SOFTWARE\\CodeGear", false))
 {
  ShowMessage("Nie można otworzyć klucza");
  return;
 }

 Rejestr->GetKeyNames(vList.get());

 int x = 0;
 do
 {
  Rejestr->DeleteKey(vList->Strings[x]); /* kasuje wszystkie podklucze klucza CodeGear */
 }
 while(vList->Count - 1 > x++);

 Rejestr->CloseKey(); /* trzeba zamknąć klucz SOFTWARE\CodeGear */
 Rejestr->DeleteKey("SOFTWARE\\CodeGear"); /* kasuje klucz CodeGear */

 Rejestr->CloseKey();
 delete Rejestr;
}

By skasować jakiś klucz, trzeba najpierw skasować jego wszystkie podklucze, nie trzeba jednak kasować wartości podkluczy. Przed przejściem do nowego klucza o poziom wyżej trzeba najpierw zamknąć stary klucz.

Radzę postępować ostrożnie przy edycji rejestru, gdyż nieodpowiedzialne majstrowanie w rejestrze może doprowadzić do sytuacji w której komputer już się nie uruchomi i jedyne co pozostanie to ponowne zainstalowanie systemu.



Uzupełnij profil, gdyż nie widać w jakim środowisku programujesz, a przy obecnej mnogości środowisk jest to istotna informacja potrzebna do udzielania precyzyjnych odpowiedzi.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 7 gości