التعامل مع نظام تأمين ويندوز فيستا

المحتويات

محتويات هذا الدرس:

  • المحتويات
  • نظرة خاطفة
  • تأمين UAC
  • التعامل مع UAC من خلال الويندوز
  • تشغيل وإيقاف تشغيل UAC
  • التحكم المتقدم في UAC
  • المحاكاة Virtualization
  • File Virtualization
  • Registry Virtualization
  • التعامل مع UAC برمجيا
  • خاتمة

نظرة خاطفة

درسنا اليوم بإذن الله تعالى يتكلم عن تأمين UAC في ويندوز Vista (والإصدارات الأعلى.) سنبدأ بإذن الله بشرح هذه الخدمة، ثم سوف نتعرف على كيفية التحكم الأمثل في هذه الخدمة من خلال الويندوز، وما هي تأثيرها على برنامجك وكيفية التعامل معها برمجيا.

تأمين UAC

بداية يجب علينا أن نعرف، ما هو تأمين UAC؟ تأمين UAC أو كما هو اختصار لـ تحكم وصول المستخدم User Access Control هي خدمة من الخدمات التي قدمت حديثا في ويندوز فيستا -والتي سوف تستمر في الإصدارات القادمة- تساعد على منع المستخدم أو البرامج من القيام بأعمال قد تخرب الجهاز أو قد تؤثر على المستخدمين الآخرين عن طريق سؤالك عن موافقتك عن هذا العمل أم لا.

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

تعتمد هذه الخدمة على المستخدمين الذين يملكون صلاحيات المدير Administrator وتقوم هذه الخدمة عن طريق منع جميع المستخدمين بما فيهم المديرين Admins من القيام بأعمال معينة (مثل تنصيب البرامج وتغيير إعدادات النظام) حتى تتم الموافقة عن طريق عرض رسالة صغيرة تفيد بأن هذا العمل قد يخرب الجهاز أو قد يؤثر على المستخدمين الآخرين. فإذا كان هذا المستخدم مدير Admin فإن الرسالة تسأله فقط عن الموافقة. أما إذا كان هذا المستخدم غير مدير فإن الرسالة تسأله عن اسم مستخدم وكلمة مرور لأحد المستخدمين المديرين أو سوف يتم إلغاء العملية. وتسمى هذا الرسالة أو هذه العملية رفع Elevation لأنها تقوم بإعطاء المستخدم الصلاحيات الكافية التي ربما تكون أعلى من صلاحياته إذا كان غير مدير للقيام بالمهمة المطلوبة. وهذه الرسالة تكون مشابهة للشكل التالي:

شكل 1 - رسالة الموافقة Prompt for Consent

شكل 1 - رسالة الموافقة Prompt for Consent

التعامل مع UAC من خلال الويندوز

في الأغلب، تقوم البرامج ونظام التشغيل تلقائيا بسؤالك عن Elevation للقيام بالمهمة المطلوبة، ولكن ربما لا يكون هذا البرنامج قد تم تطويره للعمل بهذه الخدمة فحينئذ عند محاولة البرنامج القيام بمهمة معينة يفشل بدون أن يسألك عن Elevation فإنه لا يملك الصلاحيات الكافية. فإذا واجهت مشكلة مثل هذه فيمكنك حلها عن طريق الضغط بز الفأرة الأيمن على ملف البرنامج واختيار Run as Administrator فتظهر لك شاشة Elevation.

طريقة أخرى تجعل هذا البرنامج يسألك تلقائيا عن Elevation عند محاولة فتحه هي أن تظهر خصائص ملف تشغيل البرنامج وتختار منها التوافقية Compatibility وتضع علامة على الخيار Run this program as an administrator كما يظهر في الشكل التالي:

شكل 2 - إعدادات التوافقية Compatibility Options

شكل 2 - إعدادات التوافقية Compatibility Options

وهذا الاختيار يجعل هذا البرنامج يقوم بسؤالك عن عملية Elevation كل مرة تقوم فيها بمحاولة تشغيله من خلال هذا المستخدم. أما إن كنت تريد أن تطبق هذا الاختيار على جميع المستخدمين فقط بالوصول إلى Show settings for all users وقم بتحديد خياراتك من هناك.

يقوم نظام التشغيل بتسجيل بيانات الـ Compatibility في الـ Registry في HKCU\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers.

نلاحظ أن الويندوز يختار شكل درع علامة على أن هذا البرنامج أو هذا الأمر يحتاج إلى Elevation وهذا الشكل هو كالتالي (تختلف ألوانه قليلا في Windows 7):

شكل 3 - شكل UAC لـ Windows Vista

شكل 3 - شكل UAC لـ Windows Vista

تشغيل وإيقاف تشغيل UAC

يوفر لك الويندوز طريقة لإلغاء وتشغيل هذه الخدمة من على جهازك وحينئذ تتم عملية Elevation تلقائيا بدون أن تظهر لك أي رسائل فيكون الويندوز مشابها كثير لـ Windows XP (من حيث الرسائل فقط،) عن طريق الذهاب إلى لوحة التحكم Control Panel واختيار حسابات المستخدمين User Accounts لتظهر لك شاشة مشابهة للشاشة الآتية:

شكل 4 - إعدادات UAC

شكل 4 - إعدادات UAC

فيمكنك عن طريق الاختيار Turn User Account Control on or off أن تقوم بإلغاء أو تشغيل هذه الخدمة وهذا في Windows Vista. أما Windows 7 فيوفر لك خيارات أكثر مرونة عن طريق اختيار يوضح مدى ظهور هذه الرسائل ومتى تظهر. فمثلا يمكنك اختيار ظهور هذه الرسائل فقط عند تنصيب البرامج وتغيير الإعدادات أو عند تنصيب البرامج فقط مثلا، أو حتى لا تظهر أبدا.

التحكم المتقدم في UAC

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

أولا سوف ننتقل إلى شاشة التحكم في UAC وهي عن طريق Control Panel -> Administrative Tools -> Local Security Policies أو عن طريق Start -> Run -> secpol.msc.

بعد ظهور شاشة التحكم في سياسات التأمين الخاصة بالنظام Local Security Policies، من اليسار قم بالذهاب إلى السياسات المحلية Local Policies ثم إلى خيارات التأمين Security Options لتظهر لك على اليمين قائمة بخيارات التأمين الخاصة بهذه المجموعة. لاحظ الشكل التالي.

شكل 5 - سياسات التأمين Security Policies

شكل 5 - سياسات التأمين Security Policies

والآن سوف نتعرض لكل اختيار على حدة من خيارات UAC أو User Access Control على حدة.

Admin Approval Mode for Built-in Administrator account

هذا الاختيار يحدد هل تطبق خدمة UAC أو بالأصح عملية Elevation أو كما تسمى نظام موافقة المدير Admin Approval Mode على المستخدم المسمى Administrator الخاص بالويندوز أم لا. ومعنى هذا هو إظهار رسائل الـ Elevation أو لا.

لاحظ الفرق بين صلاحيات المدير Administrator Privileges وبين المستخدم المسمى Administrator والذي يملك أيضا نفس الصلاحيات.

القيمة الطبيعية لهذه الخاصية هي: غير متاح Disabled

Behavior of the elevation prompt for administrators in Admin Approval Mode

هذا الاختيار يحدد السلوك الذي تتخذه خدمة UAC إذا كانت في وضع الاستخدام بالنسبة للمستخدمين ذوي صلاحيات المدير Administrator. ونقصد بالسلوك هو نوع الرسالة التي ستظهر أو هل سيتم إظهار رسالة أم لا.

وهذا الاختيار له ثلاثة أوضاع:

  • السؤال عن الموافقة Prompt for consent (الطبيعي):
    رسالة صغيرة تسأل المستخدم عن موافقته Consent أو لا.
  • السؤال عن الاعتمادات Prompt for credentials:
    رسالة تسأل المستخدم عن كلمة مروره.
  • الرفع من غير السؤال Elevate without prompting:
    يتم تطبيق عملية الرفع Elevation بدون إظهار أي رسائل.

الأشكال التالية توضح نوعي الرسالة رسالة الموافقة Consent ورسالة بيانات الدخول Credentials.

شكل 1 - رسالة الموافقة Prompt for Consent

شكل 1 - رسالة الموافقة Prompt for Consent

شكل 6 - رسالة الاعتمادات Prompt for Credentials

شكل 6 - رسالة الاعتمادات Prompt for Credentials

Behavior of the elevation prompt for standard users

هذا الاختيار يحدد السلوك الذي تتخذه خدمة UAC إذا كانت في وضع الاستخدام بالنسبة للمستخدمين الذين لا يملكون صلاحيات المدير Administrator.

وهذا الاختيار له وضعين:

  • السؤال عن الاعتمادات Prompt for credentials (الطبيعي):
    تظهر رسالة تسأل المستخدم عن اسم المستخدم وكلمة المرور لأي مستخدم آخر له صلاحيات المدير Administrator.
  • رفض العملية بدون إظهار رسائل Automatically deny elevation requests (الطبيعي للإصدارا من نوع Enterprise):
    لن يتم إظهار رسائل وسوف يتم رفض العملية وإلغاؤها.

Detect application installations and prompt for elevation

يحدد هذا الاختيار ما إذا كانت خدمة UAC تقوم بالكشف عن ما إذا كان هذا الملف يقوم بتنصيب برنامج أم لا. وحينئذ إذا كان الملف هو ملف تنصيب تقوم بإظهار رسالة Elevation أو حتى الموافقة تلقائيا حسب الاختيارات الأخرى.

في حالة إلغاء هذه الخدمة فإن ملفات التنصيب هذه سوف تعمل كأي ملفات أخرى، بمعنى أنها سوف تحاول تنصيب البرنامج بدون عملية Elevation وحينئذ سوف تفشل تلقائيا مالم تقوم أنت بعمل عملية Elevation عن طريق مثلا الضغط بزر الفأرة الأيمن على الملف واختيار Run as Administrator.

القيمة الطبيعية لهذه الخاصية هي: متاح Enabled، أو غير متاح Disabled للإصدارات Enterprise.

Only elevate executables that are signed and validated

إذا قمت بتحديد هذا الاختيار لن يتم السؤال عن الموافقة إلا مع البرامج التي لها شهادات موثوقة مثل برامج Microsoft و Adobe والشركات المعروفة. أما ما عدا هذا فسوف يتم الرفض تلقائيا.

القيمة الطبيعية لهذه الخاصية هي: غير متاح Disabled.

Only elevate UIAccess applications that are installed in secure locations

اختيار متقدم. يحدد ما إذا كانت البرامج التي تطلب صلاحيات الوصول إلى واجهة النظام UIAccess سوف يتم الموافقة عليها تلقائيا إذا كانت في مكان آمن مثلا Program Files أو لا.

سوف نعرف ما هي صلاحيات UIAccess أثناء تعاملنا مع الكود.

القيمة الطبيعية لهذه الخاصية هي: متاح Enabled.

Run all administrators in Admin Approval Mode

يحدد هذا الاختيار ما إذا كانت عملية Elevation سوف تتم تلقائيا مع جميع المستخدمين ذوي صلاحيات المدير Administrator أم لا.

في حالة تحديد هذا الاختيار لن يتم سؤال المستخدمين ذوي صلاحيات المدير Administrator على Elevation وسوف تتم هذه العملية والسماح لهم تلقائيا. أما في حالة إلغاء هذا الاختيار فسوف يتم عمل عملية Elevation تلقائيا. أما المستخدمين الذين لا يملكون صلاحيات المدير Administrator لن يتم سؤالهم وسوف يتم الرفض تلقائيا.

هذا الاختيار هو بمثابة إلغاء هذه الخدمة تماما أو تشغليها.

القيمة الطبيعية لهذه الخاصية هي: غير متاح Disabled.

Switch to the secure desktop when prompting for elevation

كما تلاحظ عند ظهور رسالة Elevation يتم إيقاف جميع البرامج في الخلفية ولا يمكنك التعامل معها حتى تنفذ الرسالة أولا. فهذا الاختيار يحدد هل يتم إيقاف الاستخدام لجميع البرامج أثناء ظهور الرسالة أو بمعنى آخر هل يتم الانتقال إلى سطح المكتب الآمن Secure Desktop أو لا.

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

القيمة الطبيعية لهذه الخاصية هي: متاح Enabled.

Virtualizes file and registry write failures to per-user locations

عمل عملية محاكاة Virtualization عند محاولة البرامج -بدون عملية Elevation- الوصول إلى أماكن غير مسموح بيها مثلا الـ Registry فيقوم النظام تلقائيا بتحويل البرنامج إلى مكان يمكنه الكتابة فيه.

جميع ما في القرص Drive المنصب عليه نظام التشغيل هو من الأماكن الغير مسموح بالكتابة فيها بدون عملية الـ Elevation باستثناء المستندات My Documents وسطح المكتب Desktop والمجلد الذي يحوي البرنامج.

سوف نعرف أكثر عن تأثير خدمة UAC وعملية المحاكاة Virtualization في القسم القادم.

القيمة الطبيعية لهذه الخاصية هي: متاح Enabled.

المحاكاة Virtualization

هذا الجزء يتكلم عن تأثير خدمة الـ UAC على البرامج. بالطبع نعرف أنه بدون عملية Elevation لن يستطيع البرنامج أو الكود الوصول إلى أجزاء معينة من النظام مثل مجلد نظام التشغيل Windows ومثل الـ Registry في القيم الخاصة بالجهاز بأكمله Machine (HKLM) وغيرها من الأماكن.

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

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

وتنقسم هذه العملية إلى نوعين:

  • محاكاة الملفات File Virtualization:
    وتكون عند محاولة البرامج بدون Elevation الوصول إلى ملفات ممنوعة.
  • محاكاة مكتب التسجيل Registry Virtualization:
    وتكون عند محاولة البرامج بدون Elevation الوصول إلى أماكن ممنوعة في الـ Registry.

عملية المحاكاة Virtualization في نظام تشغيل Vista خاص بالنسخ 32-bit فقط وليس الـ 64-bit.

File Virtualization

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

// C# Code
string programFiles =
    Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
string file =
    System.IO.Path.Combine(programFiles, "SampleFile.txt");
System.IO.File.WriteAllText(file, "Hello, World!");
' VB.NET Code
Dim programFiles As String = _
    Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles)
Dim file As String = _
    System.IO.Path.Combine(programFiles, "SampleFile.txt")
System.IO.File.WriteAllText(file, "Hello, World!")

قم بمراعاة أنه إذا كنت قد أعطيت الـ Visual Studio صلاحيات المدير عن طريق الـ Elevation سوف يأخذ برنامجك نفس الصلاحيات. لهذا قم بتشغيل البرنامج من خلال متصفح الويندوز Windows Explorer وليس من خلال الـ Visual Studio.

بعد تنفيذ الكود السابق والذهاب إلى مجلد Program Files لن تجد الملف المطلوب! لماذا؟ لأن برنامجك ليس له الصلاحيات للكتابة فيه بدون عملية Elevation. ولكن أين ذهب هذا الملف؟

قام الويندوز بعمل عملية محاكاة Virtualization وقام بتحويل برنامجك إلى المجلد الآمن وهو :\Users\\AppData\Local\VirtualStore\Program Files بدلا من مجلد Program Files الأصلي. نلاحظ أن المكان الآمن يسمى Virtual Store.

لاحظ أنه للبرنامج التحكم الكامل في المجلد الذي يكمن بداخله وجميع المجلدات الفرعية. لاحظ أيضا أن هذه العملية خاصة بمجلد Program Files فقط وليس بمجلد Windows. مجلد Windows لا تحدث فيه هذه العملية، يتم رفض الكود تلقائيا بدون محاكاة.

قم الآن بتغيير الكود الخاص بك ليقوم بحذف أي مجلد أو أي ملف من الـ Program Files. سوف يقوم الويندوز أيضا بتحويلك إلى المجلد الآن وسوف تتم عملية الحذف إن وجد الملف أو المجلد المراد حذفه في هذا المجلد.

الآن قم بالضغط بزر الفأرة الأيمن على ملف البرنامج واختار Run as administrator كي تتم عملية الرفع Elevation، الآن يعمل البرنامج كالمطلوب!

ملاحظة: عند رفض عملية Elevation للبرنامج يحدث الخطأ System.UnauthorizedAccessException.

Registry Virtualization

لا يقتصر الأمر على نظام الملفات فقط بل يمتد إلى الـ Registry أيضا. فعند محاولتك لتغيير أيا من القيم العامة الخاصة بالجهاز الموجودة في HKEY_LOCAL_MACHINE مثلا فإن نظام التشغيل يقوم بتحويلك إلى مكان آمن Virtual Store وهو HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE\.

وأخيرا نذكر أنك يجب أن لا تعتمد على عملية الـ Virtualization هذه أي أنك يجب أن لا تفترض دائما أن أي تعامل مع مجلد Program Files سوف يذهب إلى :\Users\\AppData\Local\VirtualStore\Program Files وهذا لأن عملية المحاكاة Virtualization هي فقط لتصحيح الأخطاء التي يمكن حدوثها للبرامج الموجودة مسبقا التي تضع ملفاتها في أماكن مختلفة وكثيرة، وربما تتم إزالة عملية المحاكاة Virtualization في إصدارات قادمة من الويندوز. فيجب على كل برنامج أن يتعامل فقط مع المجلد الخاص به والأماكن الأخرى المسموح بها مثل Desktop و Documents.

يجب أيضا أن لا تقوم بعمل Elevation لكل وجميع البرامج فربما يسبب أحدها خطأ أو مشكلة في الجهاز.

التعامل مع UAC برمجيا

كيف يمكننا طلب عملية الرفع Elevation برمجيا عند تشغيل البرنامج؟ هل نطلب من المستخدم أن يقوم بتغيير إعدادات Compabitility أو نطلب منه أن يستخدم الأمر Run as administrator؟

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

وثيقة Manifest هي عبارة عن ملف بسيط بنفس الاسم الكامل لملف برنامجك ويضاف إليه الامتداد manifest. فمثلا إن كان اسم ملف البرنامج app.exe فإن ملف الوثيقة يجب أن يمسى app.exe.manifest وهكذا.

وكيف نقوم بإنشاء وثيقة Manifest؟ يمكننا إنشاءها يدويا، ويمكننا أيضا إنشاءها باستخدام الـ Visual Studio. فإذا كان مشروعك VB.NET فيمكنك الذهاب إلى خصائص المشروع واختيار View UAC Settings من التبويب Application.

أما إذا كان مشروعك C# فيمكنك إضافة ملف Manifest إلى المشروع عن طريق الخطوات التالية:

  1. اذهب إلى Project -> Add New Item واختار Application Manifest File لإضافة الملف إلى المشروع (لا يهم الاسم الآن.)
  2. قم بالذهاب إلى خصائص المشروع وتحديدا التبويب Application.
  3. من مجموعة خصائص Resources قم باختيار الملف من قائمة Manifest. انظر الشكل التالي.

شكل 7 - ربط وثيقة Manifest بالمشروع

شكل 7 - ربط وثيقة Manifest بالمشروع

والآن لننتقل إلى وثيقة Manifest. في الغالب يكون هذا الملف له التكوين التالي:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0"
    xmlns="urn:schemas-microsoft-com:asm.v1"
    xmlns:asmv1="urn:schemas-microsoft-com:asm.v1"
    xmlns:asmv2="urn:schemas-microsoft-com:asm.v2"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel
                level="requireAdministrator" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
</asmv1:assembly>

ما يهمنا في هذا الملف هو العنصر requestedExecutionLevel والذي يحدد نوع الصلاحيات التي يريدها البرنامج. وهذا العنصر له الخاصية level والتي يمكن أن تأخذ أي من القيم التالية:

  • requireAdministrator:
    معنى هذا أن البرنامج يطلب صلاحيات المدير Administrator وهذا يجعل رسالة Elevation تظهر. فإن كان هذا المستخدم له صلاحيات المدير ظهرت الرسالة وفيها خيارات الموافقة وعدمها Consent Message أما إن كان هذا المستخدم ليس له صلاحيات المدير ظهرت رسالة Credential Message وفيها يطلب من المستخدم إدخال اسم مستخدم وكلمة مرور لأي من المستخدمين ذوي صلاحيات المدير Administrator.
  • highestAvailable:
    معنى هذا أن البرنامج يحصل على صلاحيات هذا المستخدم فقط. فإن كان المستخدم له صلاحيات المدير ظهرت رسالة بالموافقة وأعطي البرنامج صلاحيات المدير. وإن كان المستخدم لا يملك صلاحيات المدير، ظهرت رسالة بالموافقة أيضا وأعطي البرنامج صلاحيات هذا المستخدم فقط وليست صلاحيات المدير.
  • asInvoker:
    البرنامج لا يسأل عن أي Elevation ولا عن صلاحيات المدير فيعمل بدون Elevation فلا يملك صلاحيات الوصول إلى مجلدات مثل مجلد Windows.

في الغالب سوف يحتاج برنامجك إلى اختيار requireAdministrator.

لاحظ أن جميع الخيارات في XML هي حساسة للحالة Case-Sensitive فلا يمكنك تبديل حرف كبير بصغير أو العكس.

لاحظ أيضا أن جميع هذه الاختيارات خاضعة للاختيارات العامة التي شاهدناها سابقا. فإن كانت خدمة UAC مثلا غير فعالة، يحصل البرنامج دائما على صلاحيات المدير وبدون أي سؤال للمستخدم.

أما اختيار uiAccess فهو خاص بالبرامج التي لها تحكم أكبر في واجهة نظام التشغيل OS UI مثل برامج لوحة المفاتيح المرئية Onscreen Keyboard. يجب عليك ألا تختار هذا الاختيار أبدا إلا لو كان برنامجك يريد هذه الصلاحيات.

خاتمة

وأخيرا، أرجوا أن أكون قد وفقت في هذا الموضوع.

وإلى درس آخر وموضوع آخر بإذن الله تعالى.

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

اخترنا لك:

أحدث المواضيع:

هل أعجبتك؟ شارك بها...
  • عنييد

    مبدع
    الى الامام

  • عنييد

    مبدع
    الى الامام

  • ودي

  • ودي

  • تسلم ياباش مهندس أنا كتير دورت على حل للمشكلة دى .. تسلم وننتظر المزيد منك إن شائ الله

  • تسلم ياباش مهندس أنا كتير دورت على حل للمشكلة دى .. تسلم وننتظر المزيد منك إن شائ الله