Zdalny shutdown - wylogowanie, wylaczenie, restartowanie komputerow w sieci lokalnej

BcbMan

Dla poczatkujacych...

Na pewno każdy z Was chcial zgasic zrestartowac w klasie komputer. Jest to mozliwe pod warunkiem, ze jestescie zalogowani jako administratorzy. Wtedy mozecie zdalnie wyłaczać i restartowac komputery w sieci lokalnej a takze swoj komputer lokalny.

Wystarczy programowo uruchomic polecenie systemowe 'shutdown' z odpowiednimi parametrami (dziala na pewno na Windows XP/2003 - na pewno nie dziala na platformie 9x - co do NT, 2000: nie wiem, czy dziala). Na nowszych windach pewnie tez bedzie dzialalo... :)

Ponizej podalem przykladowa aplikacje, ktora realizuje to zadanie (pod warunkiem, ze login, ktorym sie zalogowaliscie do sytemu jest w grupie administratorów). Wystarczy dorobic interfejs graficzny i mamy przydatny programik.

Wiecej informacji na temat polecenia 'shutdown' mozna znalezc w systemowej konsoli wpisujac 'shutdown' bez parametrow.

program ZdalnyShutdown;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, ShellApi;
 
var
  znak, czy_zdalny, polecenie : Char;
  // przechowuja: Znak T lub N - odpowiedz na pytanie, czy zastosowac
  // do zdalnego komputera, przechowuja: rodzaj zakonczenia pracy
  // (wylogowanie, restart, zamkniecie)
  ile_sek : Integer;
  // przechowuje czas wstrzymania przed zamknieciem/restartem systemu
  nazwa, tekst : String;
  // przechowuja: nazwe zdlanego komputera, tekst zawierajacy
  // parametry polecenia 'shutdown'
 
begin
  ile_sek := 0;   czy_zdalny := 'N';
 
  Write('Podaj polecenie dotyczace komputera'#13#10'(r - restart '
        + 's - wylaczenie l - wylogowanie (lokalnie), a - anulowanie): ');
  Readln(polecenie);
  // Uzytkownik musi wpisac jedna z liter: l, r, s, a, L, R, S, A.
  if Pos(polecenie, 'lrsaLRSA')=0 then  Exit;
  // Jesli nie wybrano anulowania restartu/zamkniecia systemu i wylogowania...
  if (UpCase(polecenie)<>'A')and(UpCase(polecenie)<>'L') then
   begin
     Write('Za ile sekund wykonac polecenie: ');   Readln(ile_sek);
     if ile_sek<0 then ile_sek := 0;  // liczba sekund nie moze byc ujemna
   end;
  // Jesli nie wybrano wylogowania to mozna odwolac sie do komputera w sieci...
  if UpCase(polecenie)<>'L' then
   begin
     Write('Czy polecenie wykonac na zdalnym komputerze [T/N]: ');
     Readln(czy_zdalny);
   end;
  // Jesli nie odwolano sie do komputera w sieci...
  if UpCase(czy_zdalny)<>'T' then
   begin
     if UpCase(polecenie)='A' then  tekst := '-' + polecenie
      else  tekst := '-' + polecenie + ' -f -t ' + IntToStr(ile_sek);
 
     Write('Czy napewno chcesz wykonac te operacje [T/N]? ');
     Readln(znak);
     if UpCase(znak)<>'T' then  Exit;
   end
   else
   begin
     Write('Podaj nazwe komputera w sieci LAN: ');
     Readln(nazwa);
     if UpCase(polecenie)='A' then  tekst := '-a -m ' + nazwa
      else  tekst := '-' + polecenie + ' -f -m ' + nazwa + ' -t '
                   + IntToStr(ile_sek);
   end;
 
  // Funkcja WinApi uruchamiajaca polecenie systemowe shutdown
  // z wybranymi wczesniej parametrami
  ShellExecute(0, 'open', PChar('shutdown'), PChar(tekst), nil, 0);
end.
 

Kodu nie opisywalem, bo wydaje mi sie zbyt banalny. W koncu jest w Delphi pomoc... :)
Ale jakby cos bylo niejasne do dajcie znac - dopisze...

Pozdrawiam, BcbMan.

13 komentarzy

  1. Napisał byś chociaż jak zrobić żeby program widział czy zamykanie sie powiodło

Nie wiem jak to napisac, ale poszukam rozwiazania... a moze Ty dopiszesz taki kawalek? Byloby to z korzyscia dla wszystkich odwiedzajacych i podniosloby poziom tego artykulu.

Sam dawałem tutaj podobną -> duplikat

Nie wypominaj innym, ze robia cos nie tak, jesli sam robisz dokladnie tak samo. Poza tym sprawdzalem, czy jest tu juz taki artykul i nic takiego nie znalazlem. Moze podasz mi link do swojego artykulu?

Kodu nie opisywalem, bo wydaje mi sie zbyt banalny. W koncu jest w Delphi pomoc...

Pomoc w Delphi ma sluzyc do zrozumienia kodu dla tych, ktorzy go nie zrozumieli (a zakladam, ze wiekszosc osob go rozumie). Kodu z nikad nie zerznalem - napisalem go sam.

Zamiast znacznikow 'delphi' stosuje znaczniki 'code'. Te pierwsze powodowaly przy ktoryms z moich artykulow, ze kod kopiowal sie wniewlasciwy sposob, uniemozliwiajac kompilacje programu. Totez wole ich nie stosowac.

Przyznaje, troche mnie lenistwo ogarnelo, ale problem naprawiam. Komentarze pojawia sie w artykule.

Chcialbym jeszcze zaznaczyc, ze moze artykul nie jest zbyt odkrywczy to zaznaczylem to wpisujac, ze jest dla poczatkujacych. Z pewnoscia wsrod wielu internautow odwiedzajacych te witryne znalazlo sie co najmniej kilku, ktorych ta wskazowka nie tylko wzbogacila o nowa wiedze, ale moze rowniez popchala do lepszego poznania dostepnych polecen konsoli systemowej.

Ciesze sie, ze jest zainteresowanie nawet tak "banalnym" artykulem. Czekam na dalsze komentarze :)

Jak zrobic aby wylogowanie nie bylo lokalne tylko przez LAN ?

w starszych windowsach uzywano polecenia
rundll32.exe User,ExitWindows
ze strony sysinternals mozna zrzucic darmowe narzedzie
psshutdown - ktore jest lepsze niz shoutdown bo moze zestartowac zdalny komp
z DOWOLNYMI poswiadczeniami uzytkownika
pozdrawiam Syzer

A nie lepiej zrobić tak?

ShellExecute(0, 'open', 'shutdown', '-i', nil, 0);

lub po prostu Start >> Uruchom >> shutdown -i ?

Coś od Microsoft Corporation, i to okienkowe :D

Dodaj przynajmniej obsługę kodów przyczyny. Jeśli nie wiesz co to to w command line wpisz shutdown -?

Wystarczy programowo uruchomic polecenie systemowe 'shutdown'
Tak się składa, że to nie jest polecenie systemowe, a zwyczajny program dołączany do Windows od wersji XP. W systemie Win2000 i wcześniejszych on nie występuje.

Niby na takie programy mówiło się "polecenia zewnętrzne", ale to było za czasów DOSa.

Nom niezly niezly ale jak go wkleje na delphi to co mam potem robic moze szczegolowo bo ja jestem poczatkujacy mam delphi dopiero 4 dni

tylko uruchomic :) i czytac wyswietlajace sie napisy - w koncu to gotowiec... (jesli dalej jest cos niejasne to musisz dokladniej okreslic problem)

Czyli kod skads zernales, taki wniosek sie nasuwa

jesli ktos nie zamiescil komentarzy to nie znaczy od razu ze to nie jego kod !

inna sprawa ze powinien zamiescic

Kodu nie opisywalem, bo wydaje mi sie zbyt banalny. W koncu jest w Delphi pomoc... :)

Czyli kod skads zernales, taki wniosek sie nasuwa

Dokladnie, artukuły w stylu \"uruchom program z parametrem\" sa mało odkrywczę, każdy powinien to znać, mniejsza o to iż takie wskazówki nie dotycza programowania. Sam dawałem tutaj podobną -> duplikat

  1. Windowsa 2000 możesz zamknąć z pod XP/2003
  2. Możesz zamykać z pod Win 2000 jeśli przekopiujesz plik %SystemRoot%\system32\shutdown.exe z XP do 2000
  3. Windows\'a NT chyba też mozna zamknąć zdalnie.
  4. Napisał byś chociaż jak zrobić żeby program widział czy zamykanie sie powiodło :P

no artykul to to IMO nie jest ... <_< zreszta malo odkrywcze ...