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

كيف نقوم بجعل أحد الأزرار في برنامجنا ينفذ أوامر تتطلب صلاحيات مدير في ويندوز فيستا

بدأه محمد سامر أبو سلو في 1 مارس 2008 · 10 رد · 1,498 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

نحتاج في بعض الأحيان للقيام بأعمال تتطلب صلاحيات خاصة في ويندوز فيستا وهنا سنواجه منعا من قبل UAC الخاص بويندوز فيستا ولكي يتمكن برنامجنا من تنفيذ هذه المهمة يحب علينا تنفيذ ذلك الكود بمستوى صلاحيات مدير Administrator حيث سنقوم في البداية بتعريف فئة تتعامل مع نظام الأمان في ويندوز فيستا مستخدمين الفئة WindowsIdentity للتعرف على مستخدم ويندوز الذي نعمل عليه والفئة WindowsPrincipal للتعرف على المجموعات التي ينتسب إليها ذلك المستخدم ثم نتحقق من أنه يعمل بصلاحيات مدير كما في الإجراء

Friend Shared Function IsAdmin() As Boolean
	Dim id As WindowsIdentity = WindowsIdentity.GetCurrent()
	Dim p As WindowsPrincipal = New WindowsPrincipal(id)
	Return p.IsInRole(WindowsBuiltInRole.Administrator)
End Function

فإن لم يكن المستخدم يعمل بصلاحيات مدير هنا نعيد بدء العملية الحالية Restart Current Process رافعين مستوى صلاحيات المستخدم إلى مستوى مدير كما في الإجراء

Friend Shared Sub RestartElevated()
	Dim startInfo As ProcessStartInfo = New ProcessStartInfo()
	startInfo.UseShellExecute = True
	startInfo.WorkingDirectory = Environment.CurrentDirectory
	startInfo.FileName = Application.ExecutablePath
	startInfo.Verb = "runas"
	Try
		Dim p As Process = Process.Start(startInfo)
	Catch ex As System.ComponentModel.Win32Exception
		Return 'If cancelled, do nothing
	End Try

	Application.Exit()
End Sub

بقي لدينا إضافة أيقونة الدرع الخاصة بالأزرار التي تستخدم صلاحيات مدير إلى زر الأوامر المطلوب حيث يتم ذلك باستخدام الدالة SendMessage الموجودة في المكتبة user32.dll التي تقوم بإرسال الرسالة BCM_SETSHIELD إلى الزر المطلوب كما في الإجراء

Friend Shared Sub AddShieldToButton(ByVal b As Button)
	b.FlatStyle = FlatStyle.System
	SendMessage(b.Handle, BCM_SETSHIELD, 0, &HFFFFFFF)
End Sub

وسيصبح الكود الكامل للفئة التي سنستخدمها لإجراء عملية تمكين الزر من تنفيذ أعمال تتطلب صلاحيات مدير كما يلي

Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.Runtime.InteropServices
Imports System.Diagnostics
Imports System.Windows.Forms
Imports System.Security.Principal

Public Class VistaSecurity
	Private Declare Auto Function SendMessage Lib "user32.dll" _
		(ByVal HWND As IntPtr, ByVal MSG As UInteger, ByVal WParam As UInt32, _
		 ByVal LParam As UInt32) As UInt32

	Private Const BCM_FIRST = &H1600
	Private Const BCM_SETSHIELD = (BCM_FIRST + &HC)

	Friend Shared Function IsVistaOrHigher() As Boolean
		Return Environment.OSVersion.Version.Major < 6
	End Function

	'/ <summary>
	'/ Checks if the process is elevated
	'/ </summary>
	'/ <returns>If is elevated</returns>
	Friend Shared Function IsAdmin() As Boolean
		Dim id As WindowsIdentity = WindowsIdentity.GetCurrent()
		Dim p As WindowsPrincipal = New WindowsPrincipal(id)
		Return p.IsInRole(WindowsBuiltInRole.Administrator)
	End Function

	'/ <summary>
	'/ Add a shield icon to a button
	'/ </summary>
	'/ <param name="b">The button</param>
	Friend Shared Sub AddShieldToButton(ByVal b As Button)
		b.FlatStyle = FlatStyle.System
		SendMessage(b.Handle, BCM_SETSHIELD, 0, &HFFFFFFF)
	End Sub

	'/ <summary>
	'/ Restart the current process with administrator credentials
	'/ </summary>
	Friend Shared Sub RestartElevated()
		Dim startInfo As ProcessStartInfo = New ProcessStartInfo()
		startInfo.UseShellExecute = True
		startInfo.WorkingDirectory = Environment.CurrentDirectory
		startInfo.FileName = Application.ExecutablePath
		startInfo.Verb = "runas"
		Try
			Dim p As Process = Process.Start(startInfo)
		Catch ex As System.ComponentModel.Win32Exception
			Return 'If cancelled, do nothing
		End Try

		Application.Exit()
	End Sub
End Class

دعنا نجرب معا الفئة التي قمنا بإنشائها للتو

سأقوم بالتجربة على كود مقتطف من برنامج قديم لي وهو يراقب خدمة النظام الخاصة بـ SQl Server ويتحكم بها وبما أن كود بدء أو إيقاف هذه الخدمة يعتبر من الأمور التي تحتاج إلى صلاحيات مدير لذا سأضع فقط قطعة الكود التي تفيدنا هنا حيث سنحتاج في البداية إلى إضافة مرجع إلى System.ServiceProcess وإلى الاستيرادات التالية في بداية الملف أيضا

Imports System.ServiceProcess
Imports Microsoft.Win32

وهذا هو الكود

Private SqlServiceCon As New _
		System.ServiceProcess.ServiceController("MSSQL$SQLEXPRESS")

Private Sub StopSQL()
	Try
		SqlServiceCon.Refresh()
		If SqlServiceCon.CanStop = True Then SqlServiceCon.Stop()

	Catch ex As Exception
		MsgBox(ex.Message)
	End Try
End Sub

Private Sub StartSql()
	Try
		SqlServiceCon.Refresh()
		If SqlServiceCon.Status <> ServiceControllerStatus.Running And _
		   SqlServiceCon.Status <> ServiceControllerStatus.StartPending Then

			SqlServiceCon.Start()
		End If
	Catch ex As Exception
		MsgBox(ex.Message)
	End Try
End Sub

الآن سنستخدم فئتنا السابقة VistaSecurity للتحقق أولا من أن برنامجنا يمتلك الصلاحيات المطلوبة باستخدام الدالة IsAdmin فإن لم يمتلك تلك الصلاحيات نعيد بدء العملية Process الحالية رافعين الصلاحيات للمستوى المطلوب باستخدام الدالة RestartElevated كما في الكود

If VistaSecurity.IsAdmin = True Then
	StartSql()
Else
	VistaSecurity.RestartElevated()
End If

وعملية إضافة أيقونة الدرع إلى زر الأوامر تتم باستخدام الكود

VistaSecurity.AddShieldToButton(Button1)

وفيما يلي سرد كامل لكود النافذة Form1 التي استخدمناها هنا وهي تمتلك زري أوامر Button1 و Button2

Imports System.ServiceProcess
Imports Microsoft.Win32

Public Class Form1

	Private SqlServiceCon As New System.ServiceProcess.ServiceController("MSSQL$SQLEXPRESS")

	Private Sub StopSQL()
		Try
			SqlServiceCon.Refresh()
			If SqlServiceCon.CanStop = True Then SqlServiceCon.Stop()

		Catch ex As Exception
			MsgBox(ex.Message)
		End Try
	End Sub

	Private Sub StartSql()
		Try
			SqlServiceCon.Refresh()
			If SqlServiceCon.Status <> ServiceControllerStatus.Running And _
			   SqlServiceCon.Status <> ServiceControllerStatus.StartPending Then

				SqlServiceCon.Start()
			End If
		Catch ex As Exception
			MsgBox(ex.Message)
		End Try
	End Sub

	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
		If VistaSecurity.IsAdmin = True Then
			StartSql()
		Else
			VistaSecurity.RestartElevated()
		End If
	End Sub

	Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
		If VistaSecurity.IsAdmin = True Then
			StopSQL()
		Else
			VistaSecurity.RestartElevated()
		End If
	End Sub

	Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
		VistaSecurity.AddShieldToButton(Button1)
		VistaSecurity.AddShieldToButton(Button2)
	End Sub

End Class

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 1 مارس 2008 في 09:54

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

جزاك الله خير

كنت أدور هالكود بشمعة...

لكن سؤال هل ممكن استخدام هالكود مع ويندوز XP؟؟؟

وياليت حتى المثال ببرنامج مرفق الله يرضى عليك

تحياتي لك

#3

طبعا لايمكن استخدام هذا الكود ولا بأي شكل على Windows XP هذا الكود خاص وحصري لـ Windows Vista :stop: :stop:

كما انه لا يوجد داعي لإرفاق مثال لأن المثال موجود فعلا ضمن نص الموضوع بعد العبارة

اقتباس
وفيما يلي سرد كامل لكود النافذة Form1 التي استخدمناها هنا وهي تمتلك زري أوامر Button1 و Button2

إضافة إلى ان كامل كود الفئة المستخدمة موجود أيضا ضمن الموضوع بعد العبارة

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

لذا لن أقوم بإرفاق أي مثال حاليا

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 7 مارس 2008 في 23:22

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#4

حبيت أن أشكرك لأني لم أجد زر الشكر في نهاية موضوعك ؟؟؟ يا ترى ليه؟؟؟؟

شكرا على مجهودك الرائع و المفيد لأبعد حد

جزاك الله كل خير و جعله في ميزان حسناتك يوم القيامة

اللهم اغفر لي و لوالدي و للمؤمنين يوم يقوم الحساب

لا إله إلا الله عدد ما كان و عدد ما يكون و عدد الحركات و السكون

#5
بن ملعاط كتب:
شكرا على مجهودك الرائع و المفيد لأبعد حد

جزاك الله كل خير و جعله في ميزان حسناتك يوم القيامة

لا شكر على واجب أخي

وأهلا بك دوما - وأرجو الفائدة للجميع

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 3 مارس 2008 في 01:48

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#6

اخي شكرا على هذا الكود

لقد حاولت تركيب هذا الكود دون فائدة

ارجو ارفاق ملفات الكود (( المشروع ))

#7
maayah كتب:
اخي شكرا على هذا الكود

لقد حاولت تركيب هذا الكود دون فائدة

ارجو ارفاق ملفات الكود (( المشروع ))

مع أن طريقة العمل واضحة جدا ولايوجد داعي إطلاقا لإرفاق مثال سأقوم بإرفاق مثال ولكن لماذا لم تذكر أين الصعوبات التي واجهتها؟؟؟؟؟؟؟؟؟؟؟؟؟ :mad: :mad: :mad: :mad: :mad:

لتجريب الكود يجب أن يكون SQL Server 2005 Express منصبا على الجهاز وأرفقت ضمن المثال الملف التنفيذي لبرنامجي الخاص بمراقبة خدمة SQL Server حتى تتمكن من رؤية أن الخدمة تتوقف وتشتغل فعليا لاحظ أنه في المرة الأولى لتنفيذ أحد الأزرار سيعاد تشغيل البرنامج وستظهر لك رسالة من UAC الخاص بويندوز فيستا وبعد موافقتك على الرسالة عندها سيتم تنفيذ عملية بدء وإيقاف هذه الخدمة في المرات التالية التي ستجرب فيها أزرار التطبيق

VistaSecurityExample.zip

تم تعديل هذه المشاركة بواسطة محمد سامر أبو سلو في 8 مارس 2008 في 12:57

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#8

شاكرين لك أخوي انك ارفقت الملف

لأنه جربنا نشغله من الموضوع وما ضبط معنا ابدا ابدا

طيب أخوي لدي سؤال

كيف نعمل نفس الفكره مع XP

لنقل المستخدم معه صلاحيه Limtied وليس administrator

ونريد تنفيذ بعد الأوامر من خلال البرنامج

لكن التنفيذ يفشل بحكم المستخدم Limtied

فهل لديك طريقه؟؟؟

#9

شكرا استاذي العزيز على الموضوع.

و أخي قاهر:

لا يمكنك أن تعمل هذه على الـXP :)

لكن يمكنك الحصول على باسوورد الأدمن من خلال البرامج المشهورة مثل Ophcrack أو Cain & Abel

و بعد كسر باسوورد السام / السيس كي يمكنك أن تنفذ ما شئت , لكن برمجيا (على حد علمي) لا يمكنك تخطي الصلاحية في الـXP.

تم تعديل هذه المشاركة بواسطة croconile في 8 مارس 2008 في 07:03

rasool4k.gif

[وسط]mimetex.cgi?MSN:root@root-shell.net.

[/وسط]

#10
qaher كتب:
شاكرين لك أخوي انك ارفقت الملف

لأنه جربنا نشغله من الموضوع وما ضبط معنا ابدا ابدا

طيب أخوي لدي سؤال

كيف نعمل نفس الفكره مع XP

لنقل المستخدم معه صلاحيه Limtied وليس administrator

ونريد تنفيذ بعد الأوامر من خلال البرنامج

لكن التنفيذ يفشل بحكم المستخدم Limtied

فهل لديك طريقه؟؟؟

أولا - أتمنى من كل من لم يستطع تنفيذه من الموضوع مباشرة طرح ماهي المشاكل التي واجهها - طبعا أولا بيشتغل على الـ 2008 وويندوز فيستا - أو إرفاق المثال الذي لم يشتغل معه

ثانيا - لم أجرب التعامل مع برمجة تتعلق بالصلاحيات في WindowsXP ولم أعد أستطيع التجربة بما أنه غير منصب لدي في الوقت الحاضر

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#11

مبدع كدأبك أستاذي العزيز

جعله الله في ميزان حسناتك

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…