pc'yi uzaktan kapatma programı ama çalışmıyor :(

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
sherlockholmes
Kıdemli Üye
Mesajlar: 930
Kayıt: 19 Tem 2004 09:13

pc'yi uzaktan kapatma programı ama çalışmıyor :(

Mesaj gönderen sherlockholmes »

selamlar ,

windows 2000 server'i uzaktan kapatmak istiyorum. windows 2000'ini kapatmak için gerekli kodlar elimde mevcut. client/server tipi bir uygulama yapıp client'tan server tarafa "kapat" bilgisi gönderdiğimde serveri'in kendisini kapatmasını sağlayacağım ama server'i açma şifresini bilmiyorum. yapacağım programı sistem yöneticisinden rica edeceğim server'e kopyalayacak. ben sadece sabahları server'in düğmesine basıyorum açılıyor akşamları giderken de direkt düğmeden kapatıyorum server'i. Ancak "bu kaptma işlemi server'e zarar verebilir" şeklinde bir şey duydum.
Server'i açtığım zaman "ctrl+alt+del tuşlarına basarak başlayın" ekranında kalıyor bahsettiğim programı servere yüklesem programım çalışır mı?
Bu durum için ne önerirsiniz?

iyi günler...
En son sherlockholmes tarafından 17 Eyl 2004 01:43 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

bir tane server - client program yazıcan client i servere kuracksın ondan sonra server programından clienta data göndererek bu işi çözersin (bunu indy ile rahatlıkla yapabilirsin)
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
Kullanıcı avatarı
sherlockholmes
Kıdemli Üye
Mesajlar: 930
Kayıt: 19 Tem 2004 09:13

Mesaj gönderen sherlockholmes »

client-server tipi bir uygulamayla bilgisayar kapatılabilir. benim asıl sormak istediğim server "ctrl+alt+del tuşlarına basarak başlayın" ekranında iken server dan bilgisayrı kapat komutunu gönderdiğimde bu bilgi yerine ulaşır mı?
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Bir form yapiniz ve uzerinde bir TEdit (Edit1), iki tane de TButton (Button1,Button2) olsun. Edit e gireceğiniz '\\xxx' adli makinaya birinci buton shutdown request gonderecek, ikinci buton ise bu istegi reddedecektir. Bu kodun çalıştğı makinadaki kullanıcının kapatılacak makinada shutdwon etme yetkisi olması gerekmektedir. İşte gerekli kodlar;

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function ShutDown(Computer: string; Msg: string; Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
var
  rl: Cardinal;
  hToken: Cardinal;
  tkp: TOKEN_PRIVILEGES;
begin
  if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
    ShowMessage('Process token acilirken hata olustu.')
  else
  begin
    if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
    begin
      tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      tkp.PrivilegeCount := 1;
      AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
      if GetLastError <> ERROR_SUCCESS then
       ShowMessage('Process yetkileri alinirken hata olustu !!!');
    end
  else
    ShowMessage('Yetki bilgisi bulunamadi.');
  end;
  Result := InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, Reboot)
end;

// Shutdown baslat
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not ShutDown(PChar(Edit1.Text), ' bu makina 30 sn içinde kapatılacak !!!', 30, true, true) then
    ShowMessage('Shutdown istegi reddedildi...');
end;

// shut down iptal
procedure TForm1.Button2Click(Sender: TObject);
begin
  AbortSystemShutdown(PChar(Edit1.Text));
end;

end.

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
sherlockholmes
Kıdemli Üye
Mesajlar: 930
Kayıt: 19 Tem 2004 09:13

Mesaj gönderen sherlockholmes »

verdiğiniz bilgiler için teşekkürler...

kapatmak istediğim server'da kapatma yetkim yok. amacım şu server'a yerleştireceğim program benden komut bekleyecek ben "kapat" komutunu göndereceğim ve server kapanacak. merak ettiğim nokta:server "ctrl+alt+del tuşlarına basarak başlayın " ekranında iken ben "kapat" komutunu göndersem server kapanır mı?

aklıma takılan nokta şifre girilip bir oturum açılmadığı için server'e yerleştirdiğim program çalışmayacak yani gönderdiğim "kapat" komutunu alacak program başlatılmamış olacak. işte bu sorunu nasıl aşabilirim. yani programımı oturum açılmadan çalışacak şekilde nasıl konumlandırabilirim.
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Yazmaya çalıştığınız programı iyi niyetle yazdığınıza inanarak (umarım yanılmıyorumdur) bunun için delphi programını sistem servisi olarak hazırlamanız gerektiğini söyleyebilirim. Servisler art alanda çalıştıkları için login ekranında da hazır olurlar.

Kolay gelsin,
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
sherlockholmes
Kıdemli Üye
Mesajlar: 930
Kayıt: 19 Tem 2004 09:13

Mesaj gönderen sherlockholmes »

verdiğiniz bilgiler için teşekkür ederim sayın doğanzorlu. delphi de hizmet programını nasıl yazabilirim bunu biraz açabilir misiniz? ben hep normal program yazdım ve exe ye çevirdim vs.. hizmet programı sonucunda exe dosyası oluşturulabiliyor mu , hizmet programına başlarken normal programdan farklı olarak ne yapmak gerekiyor.

bu programı yazmaktaki amacımız şu: server'ı kapatırken direkt power düğmesinden kapatıyorum. bunun sisteme zarar verebileceğini öğrendim. başka bir çözüm yolu olarak böyle bir şey düşündüm.
şimdi şu düşünülebilir "o zaman admin şifresini versinler?" ama admin şifresini tek kişi biliyor onun haricinde bir kişi bilmiyor. server da başka kullanıcı ekleme fikrine pek sıcak bakmadı yöneticiler. ben de böyle bir öneri sundum onlara
doganzorlu
Kıdemli Üye
Mesajlar: 395
Kayıt: 22 Tem 2004 09:15
Konum: İzmir
İletişim:

Mesaj gönderen doganzorlu »

Selam,

Yeni bir proje oluşturuyorsunuz ve Service Application tipinde olacağını belirtiyorsunuz. Daha sonra aşağıdakine benzer bir kod oluşacak. TService1 üzerine inet bileşenlerinizi atıp gerekn kodları yazıyorsunuz. Exe olarak derliyorsunuz. Daha sonra windows\system32 içine kopyalayıp xxx.exe /install diyorsunuz. Control Panel servisler bölümünden de startup tipini otomatik yapıyorsunuz.

Kod: Tümünü seç

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  ScktComp;

type
  TService1 = class(TService)
    ServerSocket1: TServerSocket;
    procedure ServiceExecute(Sender: TService);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  Service1: TService1;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure TService1.ServiceExecute(Sender: TService);
begin
  while not Terminated do begin
    ServiceThread.ProcessRequests(True);
    // buraya thread içinde çalışacak diğer kodları yazabilirsiniz.
  end;
end;
end.
Doğan Zorlu, İzmir

------------------------
"Bu Kitap'ı sana yalnız şunun için indirdik: Hakkında ayrılığa düştükleri şeyi onlara iyice açıklayasın ve Kitap, iman eden bir topluluk için kılavuz ve rahmet olsun." (NAHL 64)
Kullanıcı avatarı
sherlockholmes
Kıdemli Üye
Mesajlar: 930
Kayıt: 19 Tem 2004 09:13

Mesaj gönderen sherlockholmes »

sayın Doğan Zorlu verdiğiniz bilgiler için teşekkür ederim.

şimdi bir client server tipi program yapıyorum eğer başarılı olabilirsem bu programı siteye gönderebilirim.

iyi çalışmalar...
Kullanıcı avatarı
sherlockholmes
Kıdemli Üye
Mesajlar: 930
Kayıt: 19 Tem 2004 09:13

Mesaj gönderen sherlockholmes »

çalıştırmayı denediğim programın kodları. şimdilik tam çalışmıyor server'dan KAPAT bilgisini gönderiyorum ama client makine kapanmıyor. client pc ye hizmet programını kapat /install ile yükledim. yükleme başarılı oldu dedi. net start kapat ile hizmeti çalıştırdım başarıyla çalıştı dedi.

server tarafında çalışan program:

Kod: Tümünü seç

unit server;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdUDPServer1: TIdUDPServer;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
IdUDPServer1.Send('10.11.12.201', 1031, 'KAPAT');
end;

end.


client tarafında çalışan program


Kod: Tümünü seç

unit kapatpas;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
  IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer,IdSocketHandle;

type
  Tkapat = class(TService)
    IdUDPServer1: TIdUDPServer;
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    function GetServiceController: TServiceController; override;
    procedure kapatpro;
    { Public declarations }
  end;

var
  kapat: Tkapat;

implementation

{$R *.DFM}

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  kapat.Controller(CtrlCode);
end;

function Tkapat.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;

procedure Tkapat.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
  var 
  c:Word;
  stream : TStringStream;

begin
  stream := TStringStream.Create('');

  Try
    stream.CopyFrom( AData, AData.Size);
    if stream.DataString = 'KAPAT' then
    kapatpro;
    //kapatpro procedure sitedeki win2000 kapatmak ipucundan yazdım ve bilgisayarı kapatıyor tek olarak denedim.
    finally 
       stream.Free; 
    end; 

end;

procedure Tkapat.kapatpro;
var
   tkHandle : THandle;
   BufferLun,ret : DWORD;
   tk,tkPrevious : TTokenPrivileges;
   LID : TLargeInteger;
   LUID : TLuIDAndAttributes;
   versione : TOSVersionInfo;
begin
   BufferLun := 1024;
   ret := 0;
   versione.dwOSVersionInfoSize := sizeof(versione);
   GetVersionEx(versione);
   if versione.dwPlatformId = VER_PLATFORM_WIN32_NT then
         begin
         tkHandle := GetCurrentProcess;
         OpenProcessToken(tkHandle,TOKEN_ALL_ACCESS,tkHandle);
         LookupPrivilegeValue(PChar(''),PChar('SeShutDownPrivilege'),LID);
         LUID.Luid := LID;
         LUID.Attributes := SE_PRIVILEGE_ENABLED;
         tk.PrivilegeCount := 1;
         tk.Privileges[0] := LUID;
         AdjustTokenPrivileges(tkHandle,False,tk,BufferLun,tkPrevious,ret);
         end;
      ExitWindowsEx(EWX_SHUTDOWN or EWX_PowerOff,0);
   end;



end.
sorun nerede olabilir? hiçbir hata vermiyor.

service bileşenlerinin active özellikleri true.
Kullanıcı avatarı
sherlockholmes
Kıdemli Üye
Mesajlar: 930
Kayıt: 19 Tem 2004 09:13

Mesaj gönderen sherlockholmes »

client server tipi program ,diye forumda arattım istediğim sonuca ulaşamadım onun için soruyorum kusura bakmayın.

ağdaki makineyi kapatma programımda hatalı olan nedir? kullanmayı denediğim port (1031)'tan mı kaynaklanıyor? hangi portu kullanmalıyom

:roll:
P206
Kıdemli Üye
Mesajlar: 395
Kayıt: 17 Haz 2003 12:36
Konum: İstanbul

Mesaj gönderen P206 »

Selamlar

Bugün bu service ile uğraşayaım dedim biraz denemeler yaptım ama bu service işlemlerinden direk bir exe dosya çalıştırmak mümkün mü?
yoksa sadece socket tarzı bileşenlerle dinleme mi yapıyor?

Teşekkürler.
I love my car.
Blog Yaptık
Cevapla