بعد فترة إنقطاع طويلة عن الكتابة، قررت الرجوع بجاحة جديدة. وكما تعودنا ان الجديد في PowerShell يكون في شكل feature أو Cmdlet.
الجديد المرة دي هو Change-WindowsLogonBackground وهو عبارة عن cmdlet وظيفته تغيير الـ Logon Screen الأصليه لـ Windows7.

ملف Change-WindowsLogonBackground.zip مكون من ملفين PS1:
- الملف الأول: Change-WindowsLogonBackground وهو بيحتوي على كل الـ functions المسئولة عن تغيير الـ Logon Screen وإعادتها للوضع الإفتراضي. يمكن إستخدام الأمر التالي لتغير الـLogon Screen:
- Change-WidnowsLogonBackground -Defaultbackground ImageFilePath
- الملف الثاني: Change-WindowsLogonBackgroundGUI وهو عبارة عن WinForm تم إنشائها بإستخدام PowerShell بتقوم بنفس وظيفة الملف الأول.
ملحوظة:
- يجب ان لا يزيد حجم الصورة عن 256KB.
- يجب ان يكون إمتداد ملف الصورة jpg.
بالصدفة وانا بعمل سيرش على Twitter APIs لاقيت net twitter interface. اسمه Twitterizer. فكرت شوية ولاقيتها هتبقي فكرة كويسة لشرح و تطبيق إستخدام الـ net object. من خلال الـ PowerShell.
الفكرة ببساطه هي ان بإستخدام PowerShell هنكتب function هنتعامل مع الـ dll الخاص بالـ twitter interface ومنها هنخلٌق net object. من نوع twitter وبإستخدامه نقدر نستخدم الـ method المسئولة عن تحديث الـ Status.
Twitterizer.Framework-1.0.1.149.zip

Update-TwitterStatus
تحميل الـكود: Update-TwitterStatus
واحدة من أهم مميزات PowerShell التي تخص الـ Security هي ان الوضع الإفتراضي “default settings” لتنفيذ او تشغيل اي Script هو restricted وده معناه ان لا يمكن تشغيل او تنفيذ اي Script إلا الـ single commands حتي يتم تغيير قاعدة التنفيذ “Execution Policy” الخاصة بـPowerShell. بمعني أخر لا يمكن استخدام PowerShell كـ Script Language ويمكن إستخدامه فقط كـ Interactive Shell.

السبب الرئيسي في ان الوضع الإفتراضي “default settings” لتنفيذ او تشغيل اي Script هو restricted هو ان PowerShell تم تصميمه ليكون Secure by default. و Secure by default معناها ان الـ default settings لـ PowerShell يجب ان تحقق اقصي مستوي من الآمان.
Execution Policy:
وظيفة الـ Execution Policy هي ان تتحكم في طريقة تنفيذ و تشغيل PowerShell Scripts. في 4 أوضاع “modes” من الـ Execution Policy:
- Restricted: لا يمكن تشغيل او تنفيذ اي PowerShell Script حتي اذا كان digital signed
- RemoteSigned: يمكن فقط تشغيل الـ Local Scripts سواء كانت digital signed او لا ولكن الـ Remote Scripts زي Script موجود على الانترنت يجب ان يكون له digital signature من trusted publisher حتي يتم تشغيله (الأكثر إستخداماً)
- AllSigned: يجب ان يكون الـ Script له digital signature سواء كان Local أو Remote
- UnRestricted: يمكن تشغيل اي PowerShell Script سواء كان digital signed او لا
لمعرفة اي وضع من الـ 4 أوضاع هو الوضع الإفتراضي لـ PowerShell إستخدم: ExecutionPolicy

ExecutionPolicy
لتغيير الـ ExecutionPolicy إستخدم:
Set-ExecutionPolicy -ExecutionPolicy PolicyMode
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

كلمة Transcript معناها في اللغة العربية “نص أو نسخة طبق الاًصل” وهو ده موضوع النهارده، هنعرف ازاي نسجل كل امر بيتكتب وبيتنفذ و نتيجة تنفيذه في PowerShell Session او داخل الـ PowerShell Console في text file يمكن الرجوع له في اي وقت. هنعرف أزاي نستخدم Start-Transcript و Stop-Transcript. واضح من أسم كل أمر هو وظيفته ايه.
- Start-Transcript: بيبدأ عملية التسجيل و الكتابة في الـ text log file.
- Stop-Transcript: بيوقف عملية التسجيل والكتابة في الـ text log file.
خاصية الـ Transcript متوفرة بس في PowerShell Console وليست متوفرة في PowerShell ISE.
كيفية إستخدام Transcript لحفظ وتسجيل PS-Session:
1- نفذ الأمر Start-Transcript لبدء التسجيل.
2- اكتب الأوامر المراد تنفيذها
3- نفذ الأمر Stop-Transcript عند الإنتهاء لإيقاف التسجيل وإظهار مكان حفظ ملف التسجيل.

Transcript
الـ Providers هي عبارة عن الـ Interface بين الـ User و الـ Data. الـ Providers في PowerShell وظيفتها انها تسهل الوصول للمعلومات اللي من الصعب التعامل معاه بإستخدام Command-Line زي مثلاً الـ Windows Registry ، وده بيكون عن طريق تحويل الـ data stores إلي Mounted Drive يسهل التعامل معاه كأي Drive موجود على الكمبيوتر زي الـ :C او الـ : D، على سبيل المثال في PowerShell Provider اسمه Registry وده وظيفته تحويل الـ Windows Registry إلي PowerShell Drive اسمه Registry لتسهيل التعامل معاه الـ Registry من خلال الـ PowerShell.
علشان تعرف كل الـ Providers المتاحة في PowerShell إستخدم:
Get-PSProvider

Get-PSProvider Built-in Providers

Built-in Providers
زي ما قولت قبل كده الـ providers بتحول الـ data stores إلي mounted drives بس بتكون من نوع PowerShell او بنسميها PowerShell Drives.
علشان نعرف الـ PSDrives المتاحة في PowerShell إستخدم: Get-PSDrive

Get-PSDrive
لو شوفنا الـ Output لـ Get-PSProvider و Get-PSDrive هنلاقي ان الـ output تقريباً واحد بالاَضافه الي الـ Physical drives الخاصه بالكمبيوتر زي الـ hard disk والـ CD-Rom.
للوصول او الدخول إلي اي PS Drive إستخدم: Set-Location DriveName
مثال: هنستخدم Set-Location علشان ندخل إلي Alias Drive و نعرض كل الـ Aliases
في بعض الأوقات بنحتاج ان نغير الوان الـ output لأي command علشان نسهل قراءة الـ Output، على سبيل المثال لو عندنا Script بيبحث عن حالة الـServices على الكمبيوتر وبيعرض أسم كل Service و الـ Status. الـ Status ممكن تكون Running أو Stopped مع العلم ان عدد الـ Services يعتبر مش قليل في الحالة هحتاج اغير لون الـStatus لتسهيل متابعة حالة كل Service. هنستخدم اللون اللون الأخضر في حالة Running واللون الأحمر في حالة Stopped.
لتغير لون الـoutput هنستخدم الأمر: Write-Host
وهنستخدم معاه Parameters:
- ForegroundColor-
- BackgroundColor-
مثال: Write-Host “PowerShell Rocks ; )” -ForegroundColor “White” -BackgroundColor “Blue“

مثال: تغير لون الـ Serivce طبقاً لحالتها، أخضر في حالة Running و أحمر في حالة Stopped

Script File
في أخر إصدار لـWindows PowerShell ميكروسوفت غيرت الـ http/https ports اللي بتستخدمها الـ WinRM علشان الـ PowerShell Remoring من port 80 إلي port 5985 بالنسبة إلي protocol http. ومن port 443 إلي port 5986 بالنسبة إلي protocol https وده كان لتفادي اي conflict او collision بين الـ Services اللي بتستخدم نفس الـ ports.
علشان تعرف الـ ports الجديدة للـ WinRM، إستخدم:
Get-ChildItem WSMan:\localhost\Service\DefaultPorts

علشان تظهر MessageBox بإستخدام Windows PowerShell هنضيف الـ net reference. اللي يحتوي على الـMethod الخاصه بإظهار MessageBox
[System.Windows.Forms.MessageBox]::Show(“Message”)

PowerShell Profile هو عبارة عن PowerShell Script (.ps1) file بيتم تنفيذه (تشغيله) عند بداية تشغيل PowerShell console او PowerShell ISE. ممكن تستخدم PowerShell $profile عشان تعمل Customization للـ PowerShell environment، يعني على سبيل المثال وليس الحصر ممكن تكتب في الـprofile مجموعة من الأوامر تعمل import للمجموعة من الـ modules، او ممكن تغير الـexecution policy، او حتي تطلع Welcome message.
في 4 أنواع مختلفه من الـ Profiles في الـ PowerShell، كل نوع منهم ليه إستخدام معين، يعني مثلاً في Profile بيتنفذ على كل الـ users وفي profile تاني بينفذ على user واحد بس.

4 types of PowerShell Profiles
الـProfiles بيتم تنفيذها طبقاً لـ “most specific profiles precedence ” بمعني ان الـ profiles اللي بتتنفذ على كل الـ users ليها الاولوية في التنفيذ عن اللي بتتنفذ على user واحد، الـ profiles في الصورة مترتبين على حسب أولوية التنفيذ.
علشان تعرف الـ path الخاص بـ Windows PowerShell Profile إستخدم:
profile$
علشان تتأكد ان الـprofile تم إنشاءه على الـ Windows إستخدم:
test-path $profile
علشان تعمل Create لـ Profile جديد إستخدم:
new-item -path $profile -itemtype file -force
علشان تفتح الـ Profile في الـnotepad إستخدم:
notepad $profile
بعد متفتح الـprofile في برنامج الـnotepad هنكتب PowerShell Code علشان يظهر Welcome Message كل مرة نفتح فيها الـPowerShell
Welcome back, ” + $Env:Username”
أعمل save للـ profile بعد تعديله من الـnotepad، اقفل الـPowerShell وأفتحه تاني هتلاقي رسالة Welcome back, username
