محمد رضى

بحث : كيفية تحديد صلاحيات مستخدمي Sql Server و البرامج المتصلة به.

22 ردود في هذا الموضوع

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

نظرا لأسئلة الأعضاء الكرام المتعددة حول طرق تسيير مستخدمي برامج الحاسوب, فكرت في عمل بحث في الموضوع. هذا البحث سيكون مقسما على جزأين, الجزء الأول سيتطرق لحماية برنامج من خلال تحديد المستخدمين عبر الحماية المدمجة مع نظام ويندوزWindows Authentification أما الجزء الثاني فسيكون مخصصا لطرق حماية و تسيير المستخدمين عبر الحماية المدمجة مع نظام SQL Server فقط. أعرف أن أغلبية الأعضاء في المنتدى يستخدمون النسخة الإنجليزية من البرنامج SQL Server Management Studio, لذا أعتذر عن الصور التي أخذتها من نسختي الفرنسية و أطلب من الأعضاء لو أمكن أخد صور مماثلة لهذه المعروضة في هذا الموضوع و إرسالها لي لنشرها بدل النسخة الفرنسية.

الجزء الأول : تسيير المستخدمين عبر نظام الحماية Windows Authentification.

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

نظام الحماية لـ SQL Server المستعمل لـ Windows Authentification يمكننا من تحديد صلاحيات مستخدمي نظام SQL Server من خلال حساب مستخدمي نظام تشغيل ويندوز. في هذه الحالة لن نحتاج لزيادة كود تسيير المستخدمين في برامجنا و إنما كود صغير حسب صغر المشروع يقوم بزيادة الصلاحيات لمستخدم ما إلى قاعدة البيانات و عناصرها. حيث سيتم تثبيت البرنامج و يكون كل المستخدمين لنظام التشغيل لهم صلاحية تشغيله لكن عند التشغيل فقط المستخدمين (SQL Server) الذين أعطيت لهم صلاحية الربط بقاعدة البيانات و عناصرها سيكونون قادرين على تشغيل البرنامج و الوصول إلى البيانات أما المستخدمين الآخرين الذين ليس لهم صلاحيات لن يستطيعوا تشغيل البرنامج لأن SQL Server سيرفض طلب الربط بقاعدة البيانات و سيغلق البرنامج.

لنبدأ في شرح كيفية تحديد الصلاحيات لمستخدمي قاعدة بيانات و جداولها من خلال البرنامج Microsoft SQL Server Management Studio عن طريق استعمال واجهة المستخدم أولا و بعدها سنناقش كيفية تحديد الصلاحيات بطريقة برمجية باستعمال VB.NET إضافة إلى جمل SQL.

1.1 : تحديد صلاحيات المستخدم في الربط بـ SQL Server :

كي يستطيع مستخدم آخر غير الذي قام بتثبيت SQL Server بالوصول إلى قاعدة البيانات يجب أن نسجله ضمن مستخدمي نظام تسيير قواعد البيانات أولا. فكما هو مبين على الصورة و بعد الربط بـ SQL Server نقوم بالنقر على المجلد Security لتظهر لنا عدد من المجلدات و ما يهمنا منها هو المجلد Connections الذي سيظهر لنا لائحة بأسماء مستخدمي SQL Server الحاليين. لزيادة مستخدم جديد, ننقر على المجلد Connections ثم نختار New connection… من القائمة التي ستظهر.

post-207152-1250522609_thumb.jpg

على النمودج الذي سيظهر ننقر على الزر Find… لنختار اسم مستخدم ويندوز الذي سنمنحه صلاحية الإتصال بـ SQL Server. بعدها سنختار Server roles من الائحة التي على يسار النمودج...

post-207152-1250522668_thumb.jpg

بعد الاختيار ستظهر لنا لائحة نوع حساب المستخدم الذي نريد إنشاءه. بالنسبة لمستخدم عادي يقوم بعملية تسجيل البيانات نختار public كما هو مبين على الصورة أدناه. للمزيد من المعلومات المرجو النقر هنا. بعدها نقوم باختيار User mapping من على الائحة الموجودة على يسار النموذج...

post-207152-1250522767_thumb.jpg

هنا سنحدد قواعد البيانات التي للمستخدم صلاحية الربط بها و كذلك دور المستخدم عند الربط بها.

post-207152-1250522835_thumb.jpg

بعد النقر على الزر OK و تأكيد نجاح العملية من طرف SQL Server سيكون للمستخدم صلاحية الربط بقاعدة البيانات و لكن فقط الربط بقاعدة البيانات لا غيرها و لا حتى عناصرها. إذا ما جربتم الآن تغيير المستخدم الحالي لنظام ويندوز و دخلتم بحساب المستخدم الذي زدنا له صلاحية الربط للتو ثم شغلتم SQL Server Management Studio و استعرضتم لائحة قواعد البيانات سوف لن تستطيعوا الوصول إلا إلى قاعدة البيانات التي أعطيتم الصلاحيات للمستخدم بالحساب ويندوز الحالي و لكن و كما قلت قاعدة البيانات فقط ولا تستطيعون الوصول إلى عناصرها من جداول و غيرها. هذا لأن لكل عنصر يجب تحديد صلاحية كل مستخدم للوصول إليه و هذا يتيح لنا إمكانية إنشاء جدول لمعلومات المستخدمين من اسم و كلمة مرور و غيرها مع عدم إعطاء صلاحية من أي نوع لأي مستخدم آخر غير المدير الذي له كل الصلاحيات و خاصة صلاحية زيادة مستخدم جديد بالطبع.

1.2 : تحديد صلاحية مستخدم للوصول إلى جدول في قاعدة البيانات.

الآن نبدأ باستعراض قواعد البيانات الموجودة و ذلك بالنقر على المجلد Databases على اللائحة التي بيسار البرنامج SQL Server Management Studio و في اللائحة التي ستظهر نقوم باختيار قاعدة البيانات التي نريد أن نحدد صلاحيات مستخدم لها. نقوم بالنقر على علامة زائد المجاورة للمجلد Tables لاستعراض الجداول التي تحتويها قاعدة البيانات ثم نقوم بالنقر على الجدول الذي يخصنا بالزر الأيمن للفأرة و أخيرا نقوم باختيار Properties من القائمة التي ستظهر.

post-207152-1250522888_thumb.jpg

نبدأ باختيار Permissions من الائحة على يسار النمودج Properties كما في الصورة أدناه. بعدها, ننقر على الزر Add… لزيادة المستخدم إلى لائحة المستخدمين الذين لهم صلاحية الوصول إلى الجدول. بعدها, نختار العمليات التي يمكن للمستخدم الجديد أن يقوم بها على الجدول. كما هو مبين في الصورة نعطي للمستخدم صلاحية الحدف Delete, الزيادة Insert, تشغيل جمل Select و تغيير محتوى التسجيلات Update. بمعني آخر, المستخدم لا يستطيع حذف الجدول, تغيير بنيته بزيادة حقل أو حذفه مثلا و غيرها من الصلاحيات المخصصة للمدير و مسيري النظام.

post-207152-1250522938_thumb.jpg

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

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

في الجزء الثاني سنقوم بشرح كيفية إعطاء صلاحيات الربط بـ SQL Server و قواعد البيانات و عناصرها و لكن بطريقة برمجية باستخدام VB.NET و جمل SQL. و حتى ذلك الحين, أتمنى أن يكون البحث مفيدا لكم بقدر ما وجدت إعداده مفيدا لي.

تحياتي...

2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

جارى قراءة الدرس ويبدو أنه درس دسم ,, جزاك الله خيرا وزادك علما ونفع بك أخى محمد وجعله الله فى ميزان حسناتك :blush:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جزاك الله كل الخير و الله كنت محتاجا لمثل هكذا درس , لانني فعلا اعاني من مشكلة في الصلاحيات , جزاك الله الجنة و جعله في ميزان حسناتك.

:wub: و لكن أليس هذا قسم VB.Net

آه .. نعم لم اقرأ هذه الجملة

و بعدها سنناقش كيفية تحديد الصلاحيات بطريقة برمجية باستعمال VB.NET إضافة إلى جمل SQL.

أنا في انتظار هذا الجزء الحساس بالنسبة لي بكافة أوجه الصبر , و مشكور اخي مسبقا.

تم تعديل بواسطه assaf_abdullah
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

نعم أخي عبد الله, هذا فقط الجزء الأول من البحث ففي الأجزاء التالية سنتكلم عن كيفية التطبيق بطريقة برمجية باستعمال كود VB.NET و جمل SQL. أتمنى أن تتابع معنا هذا البحث الذي ما زال في بدايته و أتمنى أن يرقى إلى المستوى المطلوب.

شكرا لكم و بارك الله لكم في علمكم و عملكم.

تحياتي...

تم تعديل بواسطه محمد رضى
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

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

بعد إتمام تطوير المشروع و تجربته, يجب أن ننقل نسخة الإصدار و تثبيتها على جهاز المستخدم. هذا الجهاز طبعا لا يحتوي على قاعدة البيانات و أسهل طريقة لإنشاء قاعدة البيانات برمجيا هي بتشغيل جمل SQL تكون سيناريو إنشاء قاعدة البيانات ثم إنشاء عناصر قاعدة البيانات من جداول وغيرها. سنفترض أننا قمنا باستعمال واجهة البرنامج Microsoft SQL Server Management Studio لإنشاء قاعدة البيانات. سنتطرق الآن إلى طريقة إنشاء سيناريو إنشاء قاعدة البيانات. لإتمام هذا العمل نحتاج إلى أن تكون قاعدة البيانات تامة التصميم و لم تعد تحتاج لأي تغيير أو تصحيح.

بعد تشغيل برنامج SQL Server Management Studio و ربطه بـ SQL Server, نقوم بالنقر على المجلد Databases لاستعراض قواعد البيانات المرتبطة بالسيرفر. بعد ذلك نقوم بالنقر على قاعدة البيانات التي تخصنا بالزر الأيمن للفأرة ثم نختار Scrip generation… من على القائمة التي تظهر عند وضع الكيرسور على العنوان Tasks كما هو مبين في الصورة أذناه.

post-207152-1250687809_thumb.jpg

سيظهر مساعد إنشاء سيناريو إنشاء قاعدة البيانات حيث سنكتفي بالنقر على الزر Next

post-207152-1250687870_thumb.jpg

على النموذج الذي سيظهر, سنقوم بتحديد قاعدة البيانات التي نريد إنشاء سيناريو إنشائها ثم نحدد خانة الاختيار Generate a script for all selected objects in the database و ذلك لكي يتيح لنا المساعد إمكانية تحديد عناصر قاعدة البيانات من جداول و غيرها بغية تحديد تلك التي سيتم تفعيلها في سيناريو الإنشاء.

ثم نقوم بالضغط على الزر Next للانتقال إلى المرحلة التالية.

post-207152-1250687915_thumb.jpg

على النموذج الذي سيظهر سنقوم بتغيير Generate database script و إعطائها المحتوى True حتى نحصل على سيناريو إنشاء قاعدة البيانات. كذلك, Include if NOT EXISTS لزيادة جمل شرطية تتأكد من عدم و جود عنصر قبل تشغيل سيناريو الإنشاء.

post-207152-1250687964_thumb.jpg

و أخيرا نضغط عل الزر Finish لتبدأ عملية إنشاء سيناريو إنشاء قاعدة البيانات. بعد انتهاء العملية سيقوم SQL Server Management Studio بإنشاء مستند جديد عليه سيناريو إنشاء قاعدة البيانات مكون من العديد من جمل SQL.

فيما يلي, سنقوم باستعمال السيناريو الذي حصلنا عليه لتشغيله عبر كود VB.NET لكي يقوم البرنامج بإنشاء قاعد البيانات أوتوماتيكيا على جهاز المستخدم. عملية الإنشاء تسبقها طبعا عملية التأكد من عدم و جود قاعدة البيانات, حيث لن نقوم بعملية الإنشاء إلا بعد التأكد من عدم و جود قاعدة البيانات. لإتمام هذه العملية, سنقوم بتشغيل جملة SQL تعيد لنا اسم قاعدة البيانات إذا كانت موجودة و Nothing في حالة عدم وجودها. جملة SQL التي سنستعمل :

 SELECT name FROM sys.databases WHERE name = N'example1'

حيث example1 هو اسم قاعدة البيانات.

لتشغيل جملة SQL كهذه أو كسيناريو إنشاء قاعدة البيانات نحتاج إلى جملة ربط مباشرة بالسيرفر و ليس بقاعدة بيانات. و لهذا سنستعمل جملة الربط هذه :

 Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Connect Timeout=30

و بالتالي يكون الكود المستعلم عن وجود قاعدة البيانات بالشكل التالي :

		  ' SQL Server إنشاء كائن الربط مع

Dim con As New SqlClient.SqlConnection("Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Connect Timeout=30")

' إنشاء أمر التأكد من و جود قاعدة البيانات أم لا

Dim cmd As New SqlClient.SqlCommand("USE [master]" + vbCrLf + "SELECT name FROM sys.databases WHERE name = N'example1'", con)

Dim o As Object

Try

con.Open()

' تشغيل جملة التأكد من وجود قاعدة البيانات

o = cmd.ExecuteScalar()

con.Close()

Catch ex As Exception

If con.State = ConnectionState.Open Then con.Close()

MsgBox("خطأ عند التأكد من وجود قاعدة البيانات" + vbCrLf + ex.Message, MsgBoxStyle.Critical)

Application.Exit()

Return

End Try

بعد ذلك, يجب التأكد من الكائن الذي أرجعته الدالة ExecuteScalar حيث إذا كان يحوي اسم قاعدة البيانات, فهذه الأخيرة موجودة و لا داعي لإنشائها. أما إذا كانت غير موجودة فسنبدأ بتشغيل سيناريو إنشاء قاعدة البيانات. يجب الانتباه إلى أن سيناريو الإنشاء الذي حصلنا عليه يحو سيناريو إنشاء قاعدة البيانات و سيناريو إنشاء عناصرها معا و عند تشغيل السيناريو الجامع سنحصل على استثناء, لذلك وجب تقسيم السيناريو إلى قسمين الأول ينشئ قاعدة البيانات و الثاني ينشئ الجداول و غيرها.

الكود التالي, يقوم بإنشاء قاعدة البيانات :

				  ' تشغيل سيناريو تثبيت قاعدة البيانات

cmd.CommandText = My.Resources.CreateDBScript.Replace("GO", "")

Try

con.Open()

cmd.ExecuteNonQuery()

con.Close()

Catch ex As Exception

If con.State = ConnectionState.Open Then con.Close()

MsgBox("خطأ اثناء تثبيت قاعدة البيانات!" + vbCrLf + ex.Message, MsgBoxStyle.Critical)

Application.Exit()

Return

End Try

لاحظوا معي هنا أننا قمنا فقط بتغيير الخاصية cmd.CommandText و أضفنا إليها سيناريو إنشاء قاعدة البيانات كما حصلنا عليه من البرنامج SQL Server Management Studio. ستلاحظون معي أيضا أنني وضعت نص السيناريو داخل مورد على المشروع أسميته CreateDBScript حيث ستجدون سيناريو إنشاء قاعدة البيانات. ملاحظة أخيرة, البرنامج الذي أنشأ لنا السيناريو أنشأه بطريقة Transact SQL حيث يجب فصل جمل SQL بالكلمة المحجوزة GO التي قمنا بمحوها لأن الدالة ExecuteNonQuery لا تستحملها.

الكود التالي, يقوم بإنشاء عناصر قاعدة البيانات المحددة في سيناريو الإنشاء :

				  ' بعد تثبيت قاعدة البيانات, نشغل سيناريو إنشاء عناصر قاعدة البيانات من جداول و حقول و غيرها

cmd.CommandText = My.Resources.CreateDBObjectsScript.Replace("GO", "")

Try

con.Open()

cmd.ExecuteNonQuery()

con.Close()

Catch ex As Exception

If con.State = ConnectionState.Open Then con.Close()

MsgBox("خطأ إثناء إنشاء عناصر قاعدة البيانات!" + vbCrLf + "المرجو إزالة قاعدة البيانات يدويا قبل إعادة تشغيل البرنامج مرة أخرى." + vbCrLf + ex.Message, MsgBoxStyle.Critical)

Application.Exit()

Return

End Try

نفس الملاحظات كما في الكود السابق. بعد نجاح العملية يمكن للبرنامج الاشتغال بكل أمان.

بعد عملية إنشاء عملية إنشاء قاعدة البيانات, نحتاج إلى تهيئها. هذه العملية تكون إما بطريقة برمجية أو الطريقة السهلة هي عمل استعادة قاعدة البيانات انطلاقا من نسخة احتياطية تم تهيئها لتكون نقطة انطلاق عمل قاعدة البيانات عند تثبيت البرنامج. أنقر هنا لانتقال إلى موضوع يناقش عملية إنشاء نسخ احتياطية لقواعد بيانات SQL Server و استعادتها.

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

تحياتي...

example1.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

اخي محمد رضى عندي سؤال بريئ , تابعت الدرس و فهمته جيدا , لكن سؤالي كيف اضفت ال Script الى الـ Resorce ; كما في الصورة

226122406.jpg

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
اخي محمد رضى عندي سؤال بريئ , تابعت الدرس و فهمته جيدا , لكن سؤالي كيف اضفت ال Script الى الـ Resorce ; كما في الصورة

226122406.jpg

Copy & Paste :lol:

جميل أخى محمد وربنا يبارك فيك

5 starts :clapping:

تم تعديل بواسطه GHOST2010
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

:blink: :blink: جيد لم تخطر على بالي تحديد النوع String و اضافتها :nose_patch: Copy & Paste, شكرا جزيلاً للاخوة محمد رضى و Ghost2000

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ياعم عساف ,, إسمى GHOST2010 مش 2000 ,, رجعتنا 10 سنين للخلف :lol: :lol:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

و لا تزعل :(

خلص Ghost2010 بس شو بدك اتسوي يا مسكين في عام 2011 :wacko:

صدقني لم انتبه ركزت على Ghost أما العام لم انتبه عليه , سلام :thumbup:

و تحياتي الخالصة لصاحب الموضوع محمد رضى المتألق الفنان

تم تعديل بواسطه assaf_abdullah
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

خاص بنسخة MS SQL Server 2000

إنشاء مستخدم جديد و اعطاء الصلاحيات

تم تعديل بواسطه طارق إبراهيم
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أهلا بالإدارة و أهل الإدارة تشرفنا بمشاركتك أخي الكريم طارق ابراهيم و سأستفيد و باقي الأعضاء الكرام من الموضوع الذي أشرت إليه.

أظنني سأربح الوقت و الجهد أثناء اكمال هذا البحث. شكرا لك و بارك الله فيك.

آسف على التأخير يا إخوان فقد تسببت عاصفة رعدية بقطع التيار الكهربائي و لم أستطع التواصل معكم لظروف العمل و السفر.

شكرا لكم لتواجدكم معي.

تحياتي...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

في هذا الجزء سنتكلم, إن شاء الله, عن كيفية تحديد صلاحيات مستخدم SQL Server الذي سيكون في الأصل مستخدم نظام تشغيل ويندوز. تذكروا معي أننا لازلنا في الجزء الأول من هذا البحث و هذا الجزء الأول يتكلم عن نظام الحماية Windows Authentification الذي يحدد صلاحيات مستخدمي SQL Server من خلال حسابات مستخدمي و يندوز. في هذا الجزء سنتعلم كيف نحدد صلاحيات مستخدم من خلال تشغيل جمل SQL خاصة بهذا المجال. لنبدأ على بركة الله.

في البداية كنت أفكر في استعمال مكتبة Microsoft SMO للقيام بهذا العمل, لكن, سهولة و بساطة جمل SQL المخصصة لتحديد صلاحيات المستخدم جعلتني أغير رأيي. في هذا البحث لن نتكلم عن صلاحيات العمل و التحكم في قواعد البيانات لأن هذا الموضوع خارج عن نطاق البحث. ما يهمنا هو تحديد صلاحيات المستخدم للوصول و التعامل مع البيانات, فهناك بيانات نريد لمستخدم ما أن يصل إليها بينما لا نريد لمستخدم آخر الوصول لنفس هذه البيانات. و هذا هو موضوع هذا البحث.

لتشغيل جمل SQL التي سنستعرضها في هذا الجزء سنستعين بخدمات البرنامج Microsoft SQL Server Management Studio و نشغل كل كود على مستند Query جديد نلصق به الكود ثم نضغط على الزر [Execute] للتشغيل.

أولا و قبل كل شيء نحتاج إلى زيادة مستخدم جديد و إعطائه صلاحية الربط بقاعدة البيانات. مثال :

  USE <table_name>
GO
CREATE USER [<machine>\<user>] FOR LOGIN [<machine>\<user>]
GO

حيث <machine>\<user> هو مستخدم و يندوز له حساب خاص على نظام التشغيل. و المستخدم يحدد اسمه بطريقة اسم الحاسوب متبوع بـ back slash متبوع باسم المستخدم.

و قبل التطرق لصلاحيات المستخدم كل واحدة على حدى, لنلق نظرة على بنية جملة SQL التي من خلالها سنحدد الصلاحيات :

 GRANT <permission> ON <table> TO [<machine>\<user>]

حيث :

<permission> : هو معرف صلاحية المستخدم الذي نريد تحديده و سنتطرق في هذا البحث لـ DELETE, INSERT, REFERENCES, SELECT, UPDATE.

<table> : إسم الجدول الذي نريد تحديد صلاحية المستخدم عليه.

<machine>\<user> : المستخدم كما ذكرنا هو في الأصل مستخدم ويندوز و لهذا فاسم المستخدم يكتب بطريقة اسم الحاسوب\ اسم المستخدم.

فيما يلي شرح لكل صلاحية من الصلاحيات المذكورة أعلاه :

DELETE : تعطي للمستخدم صلاحية حذف الأسطر من على الجدول.

INSERT : تعطي للمستخدم صلاحية زيادة الأسطر على الجدول.

REFERENCES : تعطي للمستخدم الوصول إلى الجدول عن طريق مرجع بواسطة مفتاح خارجي. هذا يعني أنه في حالة تم تشغيل جملة SELECT على جدول للمستخدم صلاحية الوصول إليه و لكن هذه الجملة يجب أن تصل إلى جدول آخر عبر مفتاح خارجي foreign key فهذا الجدول يجب أن تكون للمستخدم صلاحية REFERENCES و إلا فإن SQL SERVER سيرفض تشغيل الجملة و ستفشل SELECT.

SELECT : تعطي للمستخدم صلاحية استعمال جمل SELECT على الجدول لقراءة البيانات.

UPDATE : تعطي للمستخدم صلاحية تحرير محتوى أسطر الجدول عن طريق تشغيل جمل UPDATE.

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

  USE <table_name>
GO
CREATE USER [MACHINE_NAME\USER_NAME] FOR LOGIN [MACHINE_NAME\USER_NAME]
GO
use <table_name>
GO
GRANT DELETE ON <table_name> TO [MACHINE_NAME\USER_NAME]
GO
use <table_name>
GO
GRANT INSERT ON <table_name> TO [MACHINE_NAME\USER_NAME]
GO
use <table_name>
GO
GRANT SELECT ON <table_name> TO [MACHINE_NAME\USER_NAME]
GO

أو بطريقة كتابة مختصرة :

  USE <table_name>
GO
CREATE USER [MACHINE_NAME\USER_NAME] FOR LOGIN [MACHINE_NAME\USER_NAME]
GO
use <table_name>
GO
GRANT DELETE, INSERT, SELECT ON <table_name> TO [MACHINE_NAME\USER_NAME]
GO

لاحظوا معي هنا أننا لا نحتاج لإعطاء صلاحية الوصول و الربط بقاعدة البيانات إلا مرة واحدة فقط. في المرة الثانية سوف يفشل الأمر و نحصل على إطار رسالة خطأ.

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

الخطوة الأولى :

- لنغير مستخدم الويندوز الحالي من المدير إلى الحساب الآخر للمستخدم العادي.

- افتح البرنامج Microsoft SQL Server Management Studio ثم حاول استعراض محتويات قاعدة البيانات. طبعا سيرفض SQL Server و يظهر لك البرنامج إطار به رسالة خطأ.

الخطوة الثانية :

- لنعد إلى حساب المدير لنقم على البرنامج Management Studio بفتح مستند Query بالضغط على الزر [New query] و إلصاق جمل SQL التالية التي ستقوم بإعطاء المستخدم الآخر صلاحية الربط بقاعدة البيانات :

  USE <table_name>
GO
CREATE USER [MACHINE_NAME\USER_NAME] FOR LOGIN [MACHINE_NAME\USER_NAME]
GO

حيث [MACHINE_NAME\USER_NAME] يجب تعويضها باسم الحاسوب و اسم المستخدم الذي نريد إعطاءه صلاحية الربط.

نضغط على الزر [Execute] عند إجابة البرنامج بأن الأمر تم تنفيذه بنجاح, نخرج من حساب ويندوز المدير الحالي و ندخل بحساب المستخدم العادي ثم نجرب استعراض محتويات قاعدة البيانات. الآن يمكننا SQL Server من الربط بقاعدة البيانات و الدليل على ذلك هي المجلدات التي تظهر عند النقر على علامة زائد بجوار المجلد الممثل لقاعدة البيانات. و لكن هناك مشكلة. عندما نحاول استعراض محتوى المجلد Tables لا نستطيع رؤية الجدول الذي قمنا بزيادته. هذا أمر طبيعي لأننا حتى الآن أعطينا فقط المستخدم صلاحية الربط بقاعدة البيانات. للوصول إلى عناصر هذه القاعدة و جب على المدير إعطاء صلاحية الوصول إلى كل عنصر على حدى.

الخطوة الثالثة :

لنعد إلى حساب المدير و لنلصق على البرنامج جملة SQL التالية على مستند [New query] جديد ثم نضغط على الزر [Execute] :

  use [<table_name>]
GO
GRANT SELECT ON <table_name> TO [MACHINE_NAME\USER_NAME]
GO

لنخرج من المستخدم الحالي المدير و لندخل بحساب المستخدم العادي و لنر ماذا تغير. الآن, أصبح بمقدورنا رؤية الجدول <table_name> على مجلد Tables. فتح الجدول لقراءة البيانات يمر بسلاسة لكن ! لا يمكننا لا تحرير محتوى حقل و لا زيادة سطر و لا حذف سطر ! هذا لأننا لم نعط للمستخدم سوى صلاحية قراءة البيانات.

الخطوة الرابعة :

لنعد إلى حساب مستخدم المدير و لنلصق على البرنامج جملة SQL التالية على مستند [New query] جديد ثم نضغط على زر [Execute] :

  use [<table_name>]
GO
GRANT UPDATE ON <table_name> TO [MACHINE_NAME\USER_NAME]
GO

الآن سيتمكن المستخدم الآخر من تحرير محتوى حقول الجدول لأننا أعطيناه صلاحية تحرير البيانات. و لكنه لا يستطيع حتى الآن حذف أسطر الجدول. لزيادة هذه الصلاحية قم بتشغيل جملة SQL التالية بنفس الطريقة كما سبق :

  use [<table_name>]
GO
GRANT DELETE ON <table_name> TO [MACHINE_NAME\USER_NAME]
GO

الآن يمكن للمستخدم الآخر غير المدير – الذي لديه كل الصلاحيات – حذف أسطر الجدول.

الآن و بعد أن فهمنا كيفية تحديد صلاحيات مستخدم ويندوز للوصول إلى قواعد بيانات SQL SERVER و البيانات المسجلة على الجداول, سنتحدث قليلا عن الطريقة التي يمكن لنا تطبيق ما سبق بطريقة برمجية باستعمال كود VB.NET :

الملف المرفق في الجزء السابق به كل الكود اللازمة لتشغيل جمل SQL حيث سنحتاج لجملية ربط بالسيرفر و ليس قاعدة البيانات :

 Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Connect Timeout=30

بعد ذلك سنحتاج كود يمكننا من ربط الإتصال بـ SQL SERVER :

	  ' SQL Server انشاء كائن الربط مع
Dim con As New SqlClient.SqlConnection("Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Connect Timeout=30")
' إنشاء أمر تحديد صلاحية الربط بقاعدة البيانات
Dim cmd As New SqlClient.SqlCommand("USE <table_name>" + vbCrLf + "CREATE USER [MACHINE_NAME\USER_NAME] FOR LOGIN [MACHINE_NAME\USER_NAME]", con)
Try
con.Open()
' تشغيل جملةSQL
cmd.ExecuteNonQuery()
con.Close()
Catch ex As Exception
If con.State = ConnectionState.Open Then con.Close()
MsgBox("خطأ عند تحديد صلاحية الربط بقاعدة البيانات" + vbCrLf + ex.Message, MsgBoxStyle.Critical)
End Try

عند نجاح عملية تحديد صلاحية الربط بقاعدة البيانات, نقوم بتحديد صلاحيات الوصول إلى الجدول و بياناته :

		  ' إنشاء الأمر 
cmd = New SqlClient.SqlCommand("USE <table_name>" + vbCrLf + "GRANT DELETE, INSERT, SELECT ON <table_name> TO [<MACHINE_NAME\USER_NAME>]", con)
Try
con.Open()
' تشغيل جملة SQL
cmd.ExecuteNonQuery()
con.Close()
Catch ex As Exception
If con.State = ConnectionState.Open Then con.Close()
MsgBox("خطأ عند تحديد صلاحيةالمستخدم على الجدول" + vbCrLf + ex.Message, MsgBoxStyle.Critical)
End Try

أتمنى أن أكون قد وفقت للشرح الجيد لهذا الجزء. في الجزء القادم إن شاء الله, سنطور برنامجا صغيرا يغير من طريقة تشغيله تبعا لصلاحيات SQL Server المتوفرة لمستخدم ويندوز الحالي.

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

تحياتي...

تم تعديل بواسطه محمد رضى
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا محمد رضى , مجهود رائع و ننتظر الجزء الثاني باحر من الجمر :nose_patch:

عندي اقتراح لماذا لا تطلب من المشرف ان يعيد ترتيب الدروس بطريقة متلاحقة , و بعد ذلك الردود

تم تعديل بواسطه assaf_abdullah
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

شكرا أخي عساف على الاقتراح و سأقوم بالطلب من المشرفين في نهاية البحث إن شاء الله.

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

  use [master]
GO
GRANT CREATE DATABASE TO [MACHINE_NAME\USER_NAME]
GO

جمل SQL هاته يمكن تشغيلها إما باستعمال البرنامج Microsoft SQL Server Management Studio أو بطريقة برمجية كما بينا ذلك في الجزء السابق من هذا البحث.

و الأن و على بركة الله, نبدأ في شرح كيفية تهيئة برامجنا للتعرف على صلاحيات مستخدم ويندوز الحالي الذي هو في نفس الآن مستخدم SQL Server الحالي حيث عند فتح حساب مستخدم ويندوز يشتغل SQL Server مستخدما حساب ويندوز الذي قام بتشغيله. و كالجزء السابق, سوف نستخدم جمل SQL للتعرف على صلاحيات المستخدم. فإذن, فلنبدأ بدراسة جملة SQL التي سنستخدمها في برنامجنا :

post-207152-1251065341_thumb.jpg

جملة SQL تقوم برسم جدول عليه اسم مستخدم SQL Server [user] و اسم العنصر [Object] و معرف الصلاحية[action] و معرف نوع الحماية[protecttype] و في الأخير معرف المدير الذي أعطى الصلاحية [set by] . هذا هو نص جملة SQL الممثلة على الصورة أعلاه :

  USE [example1]
GO
SELECT u.name AS 'User',
o.name AS 'Object',
[action],
protecttype,
g.name AS 'Set by'
FROM sysprotects p, sysusers u, sysusers g, sysobjects o
WHERE p.uid = u.uid AND p.grantor=g.uid AND
p.id=o.id AND o.xtype = 'U'
GO

قبل التعرف على محتويات الجدول, يجب أن نعرف معنى العدد 205 الموجود على كل أسطر الجدول على العمود protecttype. هذا العدد يعني أنه تم تشغيل جملة SQL GRANT التي رأينا وظيفتها في الجزء السابق و التي تعطي صلاحية ما لمستخدم ما. المهم أن هذا العدد يخبرنا أن الصلاحية المعرفة جانبه على العمود action قد تم إعطاؤها للمستخدم User من طرف المدير أو مالك قاعدة البيانات Set by. العمود action يمكن أن يحتوي على الأعداد التالية :

193 = SELECT : هذا العدد مقرونا بالعدد 205 على العمود protecttype يخبرنا أن للمستخدم User صلاحية تشغيل جمل الاستعلام SELECT على العنصر Object. هذه الصلاحية لها دور أساسي بالنسبة للتطبيقات الغير مرتبطة أو disconnected حيث أن التطبيق ملزم على قراءة محتوى الجدول عند التحميل. بدون هذه الصلاحية, هذا النوع من التطبيقات لا يمكن أن يعمل. و هكذا الحال بالنسبة لبرنامجنا هذا. ففي دالة الحدث Load إذا لم تكن للمستخدم صلاحية قراءة بيانات الجدول سيتم غلق البرنامج في الحال.

195 = INSERT : هذا العدد مقرونا بالعدد 205 على العمود protecttype يخبرنا أن للمستخدم User صلاحية تشغيل جمل زيادة أسطرفي الجدول INSERT على العنصر Object.

196 = DELETE : هذا العدد مقرونا بالعدد 205 على العمود protecttype يخبرنا أن للمستخدم User صلاحية تشغيل جمل حذف أسطر من الجدول DELETE على العنصر Object.

197 = UPDATE : هذا العدد مقرونا بالعدد 205 على العمود protecttype يخبرنا أن للمستخدم User صلاحية تشغيل جمل تحرير محتوى الحقول UPDATE على العنصر Object.

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

قبل الإنتقال إلى النقطة التالية و جب ذكر أن هذا الجدول لا يظهر صلاحيات المدير. المدير له كل الصلاحيات و لهذا وجب التعامل معه بشكل خاص. في الكود المخصص للتعرف على صلاحيات المستخدم, سنقوم أولا بالتعرف على اسم مستخدم SQL Server الحالي, إذا كان الإسم هو [dbo] فهذا اسم المدير و سنهيء البرنامج لإعطاء المستخدم كل الصلاحيات. أما إذا كان اسم آخر, فسنقوم آنذاك بالتعرف على الصلاحيات كل واحدة على حدى. فيما يلي جملة استعلام اسم مستخدم SQL Server الحالي :

 SELECT SESSION_USER

في برنامجنا, سنستعمل جملة مصغرة كالتي قمنا بدراستها للتو. هذه الجملة ستعيد لنا فقط العدد 205 إذا كانت الصلاحية ممنوحة, فراغ إذا كانت الصلاحية غير ممنوحة :

  USE [example1]
GO
SELECT protecttype
FROM sysprotects p, sysusers u, sysusers g, sysobjects o
WHERE p.uid = u.uid AND p.grantor=g.uid AND
p.id=o.id AND o.xtype = 'U' AND
u.name = ORIGINAL_LOGIN() AND
o.name = @table_name AND
action = @action_code
GO

لهذه الجملة اثنان من البارامتر. الأول @table_name الذي سنمرر من خلاله اسم الجدول الذي نريد استعلام منح الصلاحية عليه. البارامتر الثاني @action_code الذي سنمرر من خلاله معرف الصلاحية الذي نريد. هذه الجملة بعد تشغيلها سترجع لنا العدد 205 إذا كانت الصلاحية ممنوحة أو فراغ في الحالة المعاكسة.

لنبدأ الآن في زيادة كود التعرف على صلاحيات المستعمل و تهيئة البرنامج للتعامل معها. سنأخذ البرنامج المرفق مع الجزء قبل الأخير و سنقوم بزيادة الكود اللازم. أولا سنزيد الثوابت التي ستمكننا من التعرف السهل على معرفات الصلاحيات :

  Private Const SQL_SELECT As Integer = 193
Private Const SQL_INSERT As Integer = 195
Private Const SQL_UPDATE As Integer = 197
Private Const SQL_DELETE As Integer = 196

بعد ذلك سنزيد معرف منح الصلاحية :

  Private Const SQL_GRANT As Integer = 205

المرحلة التالية هي زيادة المتغيرات التي سنسجل عليها منح الصلاحية True أو عدمها False :

  Private CanSqlSelect As Boolean = False
Private CanSqlInsert As Boolean = False
Private CanSqlUpdate As Boolean = False
Private CanSqlDelete As Boolean = False

سنزيد الدالة CheckSQLServerObjectsPermissions(SqlConnection) التي تستقبل كائن من نوع SqlConnection و تستعمل جملة SQL – التي تكلمنا عليها سابقا - للاستعلام حول صلاحيات المستخدم الحالي. هذه الدالة سننادي عليها بعد التأكد من وجود قاعدة البيانات و/أو تثبيتها.

		  ' قراءة الصلاحيات
CheckSQLServerObjectsPermissions(con)
' لا يمكن العمل بدون صلاحية قراءة البيانات
If Not CanSqlSelect Then
MsgBox("لا يمكن للبرنامج أن يعمل بدون صلاحية قراءة البيانات." + vbCrLf + "المرجو الإتصال بمدير النظام.", MsgBoxStyle.Critical)
Application.Exit()
Return
End If

بعد المناداة على دالة الاستعلام حول صلاحيات المستخدم التي سنتكلم عليها لاحقا, سنتأكد من أن المستخدم له صلاحية استعمال جملة الاستعلام SELECT. و كما سبق ذكره فإن برنامجنا هذا من نوع غير المرتبط Disconnected فيجب تحميل البيانات عند تشغيل البرنامج و إذا لم تكن صلاحية جملة SELECT متاحة فسيتعذر ذلك و بالتالي سيرفع استثناء و سيغلق البرنامج بطريقة غير لائقة و لهذا فسوف نقوم بغلق البرنامج بأنفسنا و بطريقة لائقة مع تنبيه المستعمل أنه لا يملك الصلاحيات الكافية لتشغيل البرنامج.

بعد ذلك, سنقوم و حسب الصلاحيات التي تم التعرف عليها بتحديد خصائص كل من UserInfoBindingNavigator و UserInfoDataGridView لإتاحة الوظائف التي تتلاءم و الصلاحيات الممنوحة للمستخدم.

		  ' تحديد خصائص الداتاجربدفيو لتتلائم مع صلاحيات المستخدم
UserInfoDataGridView.AllowUserToAddRows = CanSqlInsert
UserInfoBindingNavigator.AddNewItem.Enabled = CanSqlInsert
UserInfoDataGridView.ReadOnly = Not CanSqlUpdate
UserInfoDataGridView.AllowUserToDeleteRows = CanSqlDelete
UserInfoBindingNavigator.DeleteItem.Enabled = CanSqlDelete

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

	  Private Sub UserInfoBindingNavigator_RefreshItems(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserInfoBindingNavigator.RefreshItems
UserInfoBindingNavigator.AddNewItem.Enabled = CanSqlInsert
UserInfoBindingNavigator.DeleteItem.Enabled = CanSqlDelete
End Sub

الدالة UserInfoBindingNavigator_RefreshItems ستتم المناداة عليها في كل مرة سيتم فيها تعديل في حالة أزرار الأداة UserInfoBindingNavigator حيث سيتم تنشيط أو إلغاء تنشيط زر زيادة الأسطر و زر حذف الأسطر حسب صلاحيات المستعمل.

	  Private Sub UserInfoDataGridView_CurrentCellChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UserInfoDataGridView.CurrentCellChanged
If UserInfoDataGridView.CurrentCell Is Nothing Then Exit Sub
If Not CanSqlUpdate Then
Dim row As DataGridViewRow = UserInfoDataGridView.Rows(UserInfoDataGridView.CurrentCell.RowIndex)
If row.IsNewRow Or (row.Tag <> Nothing) Then
UserInfoDataGridView.ReadOnly = False
row.Tag = "INSERTED"
Else
If row.Tag Is Nothing Then
UserInfoDataGridView.ReadOnly = True
End If
End If
End If
End Sub

الدالة UserInfoDataGridView_CurrentCellChanged ستتم المناداة عليها في كل مرة تم تغييرمكان الخلية الحالية و ذلك للتفريق بين خلايا الأسطر التي تمت زيادتها و خلايا الأسطر التي تمت قراءتها من الجدول. هذا الكود ستكون له الأهمية الكبرى عندما يكون المستخدم غير مخول لتحرير الأسطر و في نفس الوقت يكون له صلاحية زيادة الأسطر حيث سيقوم هذا الكود بالتفرقة بين الأسطر التي تمت زيادتها و في هذه الحالة سيتم تسجيلها عن طريق جملة INSERT و الأسطر التي تمت قراءتها من الجدول و التي سيتم اعتبارها أسطرا تم تحريرها بعد عملية التحرير و في هذه الحالة سنحتاج لتسجيلها عبر جمل UPDATE التي في حالتنا هاته ليست لنا صلاحية استعمالها. ملخص القول أن هذه الدالة تمكننا من تحرير خلايا سطر أو تمنعنا من ذلك حسب الصلاحيات المتوفرة.

و في الأخير سنتكلم عن الدالة CheckSQLServerObjectsPermissions التي ستستعلم لنا عن الصلاحيات التي يتمتع بها المستخدم.

		  Dim cmd As New SqlCommand("USE example1" + vbCrLf + "SELECT SESSION_USER", sqlCon)
Dim o As Object
Try
sqlCon.Open()
o = cmd.ExecuteScalar()
sqlCon.Close()
Catch ex As Exception
If sqlCon.State = ConnectionState.Open Then sqlCon.Close()
MsgBox("خطأ أثناء التعرف على المستخدم الحالي!" + vbCrLf + "المرجو مراجعة مدير النظام للتأكد من أنكم لكم صلاحيات استعمال البرنامج.", MsgBoxStyle.Critical)
Application.Exit()
Return
End Try

سنشغل جملة SQL التي سترجع لنا اسم مستخدم SQL Server الحالي. إذا كان الاسم هو dbo فهذا يدل على اسم مدير النظام و الذي سنعطيه كل الصلاحيات كما هو مبين في الكود التالي :

		  If o.ToString() = "dbo" Then ' المستخدم الحالي هو المدير
' كل الصلاحيات
CanSqlDelete = True
CanSqlInsert = True
CanSqlSelect = True
CanSqlUpdate = True
MsgBox("مرحبا سيدي المدير. لكم كل الصلاحيات سيدي...", MsgBoxStyle.Information)

في حالة اسم آخر غير dbo سنحتاج إلى قراءة الصلاحيات واحدة بعد الأخرى. أولا سنقوم بتهيئة الكائنات المستعملة في التخاطب مع SQL Server :

			  ' التعرف على الصلاحيات كل واحدة على حدا
Dim param As SqlParameter
cmd.CommandText = My.Resources.GetObjectPermissions.Replace("GO", "")
' اسم الجدول
param = New SqlParameter()
param.ParameterName = "@table_name"
param.SqlDbType = SqlDbType.Char
param.Size = 8 '"UserInfo".Length
param.SqlValue = "UserInfo"
cmd.Parameters.Add(param)
' الصلاحية المراد التأكد منها
param = New SqlParameter()
param.ParameterName = "@action_code"
param.SqlDbType = SqlDbType.Int
cmd.Parameters.Add(param)

بعد ذلك سنقوم باستعلام كل صلاحية على حدى بالشكل التالي :

			  ' SELECT صلاحية
cmd.Parameters(1).SqlValue = SQL_SELECT
Try
sqlCon.Open()
o = cmd.ExecuteScalar()
sqlCon.Close()
If CInt(o) = SQL_GRANT Then CanSqlSelect = True
Catch ex As Exception
If sqlCon.State = ConnectionState.Open Then sqlCon.Close()
MsgBox("خطأ أثناء التعرف على صلاحية SELECT!" + vbCrLf + ex.Message, MsgBoxStyle.Critical)
Application.Exit()
Return
End Try

حيث سنقوم بتحديد معرف الصلاحية التي نريد الاستعلام عنها :

 cmd.Parameters(1).SqlValue = SQL_SELECT

و بعد تشغيل جملة الاستعلام, نتأكد من محتوى الرجوع :

 If CInt(o) = SQL_GRANT Then CanSqlSelect = True

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

- سنحتاج لحسابين ويندوز الأول غير محدد حيث بداخله تم تثبيت SQL Server و الآخر حساب ويندوز محدد الذي سيتم تجربة الصلاحيات فيه.

- سنقوم بتشغيل البرنامج من داخل حساب المدير كي يتمكن البرنامج من إنشاء قاعدة البيانات بشكل أوتوماتيكي.

- بعد إدخال عدد من الأسطر و غلق البرنامج, سنقوم بتحديد صلاحيات المستخدم الآخر عبر جمل SQL التالية :

  use [master]
GO
GRANT CREATE DATABASE TO [MACHINE_NAME\USER_NAME]
GO
USE [master]
GO
CREATE LOGIN [MACHINE_NAME\USER_NAME] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
GO
USE [example1]
GO
CREATE USER [MACHINE_NAME\USER_NAME] FOR LOGIN [MACHINE_NAME\USER_NAME]
GO

هذه الجمل ستزيد مستخدم ويندوز إلى مجموعة مستخدمي SQL Server الذين لهم صلاحية الربط بقاعدة البيانات example1 . بعد ذلك يمكننا زيادة صلاحيات المستخدم على الجدول example1 كما شئنا كما هو مبين في الجزء الأول من هذا البحث. و بعد كل تغيير صلاحيات نقوم بالخروج من حساب المدير و ندخل الحساب الآخر و نشغل البرنامج لنرى كيف يتلاءم و يتماشى مع الصلاحيات الممنوحة للمستخدم من طرف المدير.

أتمنى أن أكون قد وفقت للشرح الجيد. لا أدري إن كان هناك ما يمكن زيادته في هذا الموضوع أي تحديد صلاحيات مستخدم ويندوز عبر نظام الحماية Windows Authentification قبل المرور إلى نظام الحماية الآخر. سأفكر في الأمر و أعلمكم.

تحياتي...

example1.rar

تم تعديل بواسطه محمد رضى
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

جميل جدا أخى محمد بارك الله فيك

سيتم نقل الدرس إلى قسم الدروس المتميزة عندما تنتهى منه إن شاء الله :blush:

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا أخي GHOST2010, البحث مازال جاريا :) ...

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

بتحديد أنواع المستخدمين يمكننا إنشاء سيناريو إعطاء الصلاحيات. هذا السيناريو عبارة عن جمل SQL كالتي قمنا بدراستها في الأجزاء السابقة. فلنفترض أن برنامجنا سيكون له ثلاثة أنواع من المستخدمين : مستخدمون عاديون دورهم تسجيل البيانات, مستخدمون مشرفون دورهم مراجعة البيانات و التأكد من صحتها, و في أعلى الشجرة, هناك المدير الذي له كل الصلاحيات. لنبدأ من عند سعادة المدير.

المدير يجب أن تكون له كل الصلاحيات. تذكروا أننا مازلنا في الجزء الأول و نتكلم عن نظام الربط و الحماية Windows Authentification لـ SQL Server. نظام تسيير قواعد البيانات SQL Server يجب أن يتم تثبيته من حساب مدير نظام ويندوز لتكون لصاحب هذا الحساب كل الصلاحيات أي مدير نظام SQL Server. قاعدة البيانات التي سيرتبط بها برنامجنا يجب أن يتم إنشاؤها من حساب المدير حتى يصبح سعادته الـ dbo أو Database Owner.

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

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

سأبدأ إن شاء الله في الجزء الثاني من هذا البحث و الذي سيتطرق لنظام الربط و الحماية Mixed Mode Authentification. و حتى ذلك الحين أشكر كل من تفاعل معي في هذا الموضوع و كل من بدل الوقت و الجهد في قراءته.

تحياتي...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

تم نقل الموضوع إلى قسم الدروس والمواضيع المتميزة ,,

نتمنى المزيد من هذه الدروس القيمة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا أخي GHOST2010...

هذا رابط نحو الجزء الثاني من هذا البحث الذي أتمنى أن يكون قد ارتقى إلى المستوى الذي كان ينتظر منه.

ألقاكم هناك...

تحياتي...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

هل كل الشرح المرفق ينطبق على التعامل مع sql server2005 ام الوضع مختلف فى طريق التعامل بين sqlexpress&sqlserver2005_2008 و معذرة على المقاطعة لاننى مبتدأ فى هذا المجال و ان اشاء الله ساحترفه من خلال هذه الدروس الرائعة .سدد الله خطاكم و نفعنا و اياكم بعلمكم يوم لا ينفع مالا و لا بنون الا من اتى الله بقلب سليم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرااااااااااااا الله يعطيك العافيه وسلامه

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

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

لدي اثنان مستخدمان للويندوز: procomputer\bahaa و procomputer\usertest، قمت بحذف usertest من تاب security في شجرة sqlserver وقمت بحذف المستخدم الخاص به من كل قواعد البيانات الموجودة في sql server ثم ولجت للويندوز من usertest و تصورت أنني لن أستطيع الولوج لsql server و لكنني فوجئت بأنني قد ولجت و أيضاً يمكنني أن افعل أي شئ تقريباً بقواعد البيانات رغم عدم وجود المستخدم usertest بها، و قمت بنفس التجربة مع المستخدم الآخر bahaa و أيضاً وجدت نفسي أفعل كل شئ بسلاسة غير متوقعة فما الخطأ هنا؟؟؟

أيضاً قمت بإستخدام الامر deny لإزالة صلاحية الإضافة للجداول بالنسبة للمستخدم bahaa و لكنني وجدت أنني أستطيع الإضافة و أحياناً ينفذ أمر deny و أحياناً أخرى لا ينفذه و تظهر رسالة خطأ و لكن ليست باللون الأحمر مفادها أنني لا أستطيع إزالة الصلاحيات من هذا المستخدم أو المستخدم sa او المستخدم sys، فما المشكلة هنا أيضاً؟؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .