الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اغلاق الجهاز في وندوز 2000 و Xp

مغلق
بدأه madi في 21 نوفمبر 2001 · 15 رد · 1,207 مشاهدة · في لغة Delphi
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام ...

كل العام و انتم بخير ,,,

كيف يمكن اغلاق الجهاز في وندوز 2000 و XP

وشكرا

#2

الأخ Madi

السلام عليكم ورحمة الله وبركاته

هذا الإجراء يمكنك من انهاء العمل في Windows NT/2000/XP يمكنك تجربته واستخدامه

procedure TForm1.Button1Click(Sender: TObject);

const

SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

var

TokenHandle: THandle;

fResult : Boolean;

tkp: TTokenPrivileges;

L: DWORD;

begin

if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle)

then begin

ShowMessage('Handle the error here');

exit;

end;

if not LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid) then

begin

ShowMessage('Handle the error here');

exit;

end;

tkp.PrivilegeCount := 1;

tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(TokenHandle, False, tkp, SizeOf(TTokenPrivileges), tkp1 ,L);

fResult:= InitiateSystemShutdown(nil,'Put your message here', 20, True, True);

if not fResult then

begin

ShowMessage('Handle the error here');

Exit;

end;

end;

[code]

أرجو ان يكون هذا ما تريد

بالنسبة لـWin9x يمكنك استخدام ExitWindowsEx وهي سهلة جدا

السلام عليكم

#3

مشكور الف شكر خي العزيز .

جربت الكود لكن الجملة التالية ما رضت تشتغل

AdjustTokenPrivileges(TokenHandle, False, tkp, SizeOf(TTokenPrivileges), tkp ,L);

ورسالة الخطا كما يلي

There is no overloaded version of 'AdjustTokenPrivileges' that can be called with these arguments

وشكرا

#4

الأخ Madi

حاول كتابة هذا الإجراء ضمن زر Button ولا تنادية.

أما إذا أردته مستقلا فيمكنك عمل الآتي:

var

Form1: TForm1

tpk1: TTokenPrivileges

L: DWORD

ثم ابدأ الإجراء كالتالي:

procedure ShutDown

var

tpk: TokenPrivileges;

fResult: Boolean;

begin

.

.

.

AdjustTokenPrivileges(TokenHandle,False, tkp, SizeOf(TTokenPrivileges), tkp1, L);

.

.

.

end

أرجو أن يكون هذا قد حل مشكلتك، علما بأني كتبت هذا البرنامج بـC++ وحولته إلى دلفي 6 واشتغل بدون مشاكل.

إذا كنت تستخدم اصدار أقدم فإن البرنامج قد يحتاج إلى تعديلات بسيطة.

أرجو أن أسمع ردك قريبا

#5

و الله يا اخي العزيز انا بستخدم دلفي 5 , ووندوز 2000

لكن رسالة الخطاء تقول ان

There is no overloaded version of 'AdjustTokenPrivileges' that can be called with these arguments

وهدا يعني انه يوجد بارامترات ناقصة , او زائدة ,

وانا حاولت استخدم هده الدالة من قبل وواجهتن نفس المشكلة , لاني وجدت هده الملاحضة في مساعد دلفي

Windows NT: To shut down or restart the system, the calling process must use the AdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, see Privileges.

ارجو المساعدة , وشكرا .

#6

أخ Madi

حاول تغيير TokenHandle من Cardinal إلى THandle. وإذا ممكن تعطيني الكود اللي انت كاتبه ممكن نتوصل إلى حل

تمنياتي لك بالتوفيق

#7

;) مشكور اي العزيز

جربت اغير النوع دون فائدة ,

وياريت احد من الاخوة الاعضاء يجرب الكود الى اعطاه اخي محمود ويقولنا النتيجة .

وهدا الكود الي انا كتبته في البرامج .

var

Form1: TForm1;

tkp1: TTokenPrivileges;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

const

SE_SHUTDOWN_NAME = 'SetShutdownPrivilege';

var

TokenHandle: THandle;

fResult : Boolean;

tkp: TTokenPrivileges;

L:PDWORD;

begin

if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle)

then begin

ShowMessage('Handle the error here');

exit;

end;

if not LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid) then

begin

ShowMessage('Handle the error here');

exit;

end;

tkp.PrivilegeCount := 1;

tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(TokenHandle, False, tkp1, SizeOf(TTokenPrivileges), tkp ,L);

fResult:= InitiateSystemShutdown(nil,'Put your message here', 20, True, True);

if not fResult then

begin

ShowMessage('Handle the error here');

Exit;

end;

end;

وشكرا

(f)

#8

أخي الكريم Madi

لقد وجدت هناك خطأين الأول من عندي والثاني من عندك:

1- في بداية الإجراء أخطأت أنا لأني كتبته مباشرة هنا :

const

SE_SHUTDOWN_NAME = 'SetShutdownPrivilege';

والصحيح هو:

const

SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

ولو تنفذ برنامجك بشكل صحيح لظهرت لك الرسالة Handle the error here

2- خطأك الذي سبب لك رسالة الخطأ تلك وهو:

var

.

.

L : PDWORD;

وهذا خطأ والصحيح هو:

L: DWORD;

أنا جربت البرنامج على دلفي 5,6 اشتغل بشكل صحيح

ملاحظة مهمة: إذا اشتغل هذا البرنامج بشكل صحيح سوف لن يكون بإمكانك إيقافه لذلك قم بتخزين عملك قبل التنفيذ أو استخدم الدالة التالي لتمكنك من إلغاء عملية إغلاق النظام:

AbortSystemShutdown()

أتمنى أن هذا هو الحل مع تمنياتي لك بالتوفيق

#9

حجرب و اقولك .

مشكوور اخي العزيز .

#10

:'( :'(

بعد ان نجحت بفضل اخي العزيز محمد في القضاء على دلك ERROR اللعين , و لكن الفرحة ما تمت :'( ,

بعد ان تنفد البرنامج بحمد الله و بركاته , وضغطت على الزر و انتضر انطفا الجهاز , اجد امامي هده المرة مصيبة جديدة وهي اخر جملة

وهي

fResult:= InitiateSystemShutdown(nil,'Put your message here', 20, True, True);

حيت FRESULT يرجع بقيمة FALSE ومعناها , :confused:

الباين مافيش امل .....

شكرا لك اخي العزيز محمد على عاونك معي ......

;)

#11

الأخ Madi

جرب وضع زر Button1 على الفورم ثم قم بنسخ الكود اللي كتبته انا وضعه داخل TForm1.Button1Click

جرب لأنك قد تكون أخطأت في أحد المتغيرات.

بالتوفيق ان شاء الله

#12

عزيزي محمد

احسن حل هو انك تاخد نسخة من البرنامج بالكامل و تضعه ,

او ان تبعت لي ملف الفور على الايمايل فقط ملف الفورم الدي بامتداد

pas . وتكون فضلت علي ووفيت ..

ومجددا شكرا :o لتعاونك (f)

#13

أخي Madi

هذا الملف .pas أرجو أن ترسل لي برنامجك إذا بالإمكان

حاولت أرسلك البرنامج كامل ولكن النظام لا يسمح إلا بـ1 بايت

unit MAin;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

tkp1: TTokenPrivileges;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

const

SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

var

TokenHandle: Cardinal;

fResult : Boolean;

tkp: TTokenPrivileges;

L: DWORD;

begin

if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle)

then begin

ShowMessage('Handle the error here');

exit;

end;

if not LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid) then

begin

ShowMessage('Handle the error here');

exit;

end;

tkp.PrivilegeCount := 1;

tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(TokenHandle, False, tkp, SizeOf(TTokenPrivileges), tkp1 ,L);

fResult:= InitiateSystemShutdown(nil,'Put your message here', 20, True, True);

if not fResult then

begin

ShowMessage('Handle the error here');

Exit;

end;

end;

end.

#14

واخيرا :) :D

شكرا لك اخي العزيز محمد على مجهودك الطيب .

شكرا (*)

#15

أخي Madi

إن شاء الله مشكلتك انتهت، لكن ضروري تضيف عليها AbortSystemShutdown()

تمنياتي لك بالتوفيق

#16

أشكر الأخ Mohammed على تعاونه(f)(f)(f)

لقد عمل الكود الأخير (المذكور في المشاركة: هذا البرنامج بالكامل)

عمل بشكل صحيح و أطفأ الجهاز

أما عندما كتبته في إجراء لوحده و حذفت منه معالجات الخطأ قام بإعادة تشغيل الجهاز :eek:بدلاً من إطفائه؟؟!!

فلماذا كان ذلك علماً أن الشيفرة لدي هي على الشكل التالي:

unit Main;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

tkp1: TTokenPrivileges;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

const SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';

var

TokenHandle: Cardinal;

tkp: TTokenPrivileges;

L: DWORD;

begin

OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,TokenHandle);

LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME, tkp.Privileges[0].Luid);

tkp.PrivilegeCount := 1;

tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(TokenHandle, False, tkp, SizeOf(TTokenPrivileges), tkp1 ,L);

InitiateSystemShutdown(nil,'', 0, True, True);

end;

end.

هذا الموضوع مغلق.

مواضيع مشابهة