Enable Remoting on Windows 7

2009/11/28 بواسطة Sherif Talaat

PowerShell Remoting خاصية من أهم الخواص اللي تميز بيها PowerShell عن غيره من الـ Shells التقليدية. زي ما قولت قبل كده ان خاصية الـ Remoting بتوفر إمكانية تشغيل وتنفيذ أوامر PowerShell او ما يعرف بـ cmdlets على أي جهاز كمبيوتر داخل الـ network بشرط ان يكون PowerShell موجود (Installed) على الكمبيوتر ده.

على الرغم من أن PowerShell Remoting خاصية أكتر من ممتازة، لا يمكن إستخدامها في أي Workgroup environment أو peer-to-peer (P2P) network. يمكن إستخدامها فقط في Domain-Environment أو AD-Environment لأسباب أمنية (Security).

دلوقتي في Windows 7 بقي ممكن إستخدام خاصية الـ Remoting في أي workgroup أو Peer-to-Peer.

ملحوظة: قبل ما أبدء في الشرح يفترض ان يكون عندك 2 كمبيوتر (A,B) عليهم Windows 7  و Windows PowerShell v2 و التأكد من الـ 2 كمبيوتر في نفس الـ IP Add. range، على سبيل المثال الـ IP Address لكمبيوتر A هيكون 192.168.1.10 والـ IP Address لكمبيوتر B هيكون 192.168.1.20.

دلوقتي هنحاول أن احنا نفتح Remote Session من كمبيوتر A إلي كمبيوتر B عن طريق إستخدام أمر Enter-PSSession:

Enter-PSSession 192.168.1.20

هنلاقي أن PowerShell Console طلع Error بيقول ان في مشكلة في الـ WinRM. الموضوع ببساطة ان الـ Remoting بيعتمد على حاجة اسمها Windows Remote Management المسئولة عن إستقبال اي Remote Connection، سبب الـ Error هو ان الـ WinRM Service مقفولة على الـ Windows عشان هي Secure by default لأسباب أمنية.

الخطوة الأولي: تشغيل WinRM على كمبيوتر A و B

لتشغيل WinRM هنستخدم أمر  Set-WSManQuickConfig ، قبل متستخدم الأمر تأكد من:

  •  ان ليك Administrative Privileges.
  •  أنك عايز تشغل WinRM وقادر علي تأمين جهازك وشبكتك وده عشان الأمر ده بيعمل الآتي:
  •  بيتأكد أن WinRM شغالة ولا مش شغالة بيشغلها.
  •  بيغير الـ Start mode للـ WinRM Service ويبقي Automatic.
  •  بيقوم بإنشاء Listner لإستقبال أي request من أي IP Address. دائما اي request بيتم عن طريق HTTP Protocol.
  •  بيعمل Firewall Exception rule للـ WinRM Service عشان يتأكد ان الـFirewall مش هيقفل اي traffic يخص الـ WS-Management.

بمجرد كتابة الأمر Set-WSManQuickConfig و الضغط على Enter لتنفيذه، هتظهرلك رسالة توضح الـ 4 نقاط اللي اتكلمنا عليها

Set-WSManQuickConfig

بعد التأكد من تنفيذ الأمر على كمبيوتر A و كمبيوتر B. هنحاول مرة تانية ان نفتح Remote Session من A إلي B عن طريق أمر Enter-PSSession. لكن هيظهر Error تاني بس السبب مختلف المرة دي. أول مرة كان سبب الـError هو ان الـWinRM Service مش شغالة. المرة سبب الـError هو ان الWinRM بترفض (Reject) أي request غير مُأمن بالـ Kerberos او على الأقل يكون بيستخدم نفس الـ Security mechanism أو ان الكمبيوتر اللي بيرسل الـrequest مش موجود في الـtrusted list في الكمبيوتر اللي بيستقبل، و بما أننا  بنستخدم Windows 7 على كمبيوتر A و B يبقي بنستخدم نفس الـ Security mechanism ،يبقي لنا ان الكمبيوتر مش موجود في الـ trusted list. والهدف منها هو التأكد من أن الكمبيوتر المحددة فقط هي المسموح لها بإستخدام خاصية الـ Remoting وليس أي كمبيوتر أخر.

قبل إضافة كمبيوتر B إلي الـ trusted list في كمبيوتر A.

هنستخدم أمر Test-WSMan عشان نتأكد ان على الأقل كمبيوتر A وكمبيوتر B قادرين على فتح Remote Sessions بينهم بغض النظر عن قبول او رفض الـ requests.

Test-WSMan 192.168.1.20

 

الخطوة الثانية: إضافة كمبيوتر A و B إلي الـ TrustedHosts list

الخطوة رقم 2 هي ان احنا هنعرف الـ WinRM على كل كمبيوتر على الكمبيوتر التاني عشان يسمح بإستقبال أي request لفتح اي remote session عن طريق إضافة الكمبيوتر في الـ trustedhosts list. على سبيل المثال عشان نسمح لكمبيوتر B ان يبعت request إلي كمبيوتر A يبقي لازم نُضيف الـ IP Address لكمبيوتر B في الـtrustedhosts list لكمبيوتر A. ويمكن كتابة “ * ” بدلاً من الـIP Address وفي هذه الحالة سيقوم الـWinRM بإستقبال اي Request من اي كمبيوتر وده بيكون عن طريق الأمر ده:

Set-Item WSMan:\localhost\client\trustedhosts * –force

الخطوة الثالثة: جرب و إستمتع…!!! :) :)

بعد تنفيذ الخطوة رقم 2 أصبحت خاصية  الـ remoting جاهزة للإستخدام.

Enter-PSSession 192.168.1.20

بعد لحظات من الضغط على Enter لتنفيذ الأمر (الفترة اللي بيفتح فيها الـremote session) هيظهر الـ PS prompt لكمبيوتر B. دلوقتي تقدر تنفذ اي cmdlet على كمبيوتر B من خلال كمبيوتر A عن طريق PowerShell Remoting.

يمكن إستخدام أمر Exit-PSSession عشان تقفل الـRemote Session.

PowerShell Sessions in PDC2009

2009/11/26 بواسطة Sherif Talaat

CEC 2009 and windows PowerShell

2009/11/26 بواسطة Sherif Talaat

أعلن Jeffrey Snover ان Windows PowerShell دلوقتي بقي جزء من Microsoft Common Engineering Criteria 2009 وده معناه ان PowerShell  هيكون موجود built-in في أي إصدار جديد من أي سوفت وير هتقوم بإصداره شركة ميكروسوفت إبتداءً من عام 2009.

PowerShell in Windows 7

2009/03/07 بواسطة Sherif Talaat

ميكروسوفت أصدرت النسخة التجريبية (Beta) من Windows 7،و من أهم مميزات Windows 7 هو أن PowerShell v2 يتم تحميله تلقائياً بمجرد تحميل Windows 7. كده يبقي Windows PowerShell موجود على الجيل الجديد من Windows Platform اللي يشمل Windows 7 – Windows Server 2008 مع العلم أن PowerSehll لم يكن متاح في Windows Server 2008 ServerCore ولكن تم إضافته مؤخراً في Windows Server 2008 R2. وطبعا كده مشكلة ان PowerSehll موجود على Windows Server ومش موجود على Windows Client إتحلت وهيبقي الـPowerShell موجود زي الـcmd.exe على أي Windows Operating System، وطبعاً ده هيبقي فرصة لكل الناس انها تعرف وتستخدم Windows PowerShell.

WMI in PowerShell

2009/01/19 بواسطة Sherif Talaat

في موضوع WMI in brief اتكلمنا بإيجاز عن الـWMI وإستخداماته. وإتكلمنا عن حاجة إسمها WMI Consumer أو WMI Application وقولنا ان دي الـTool اللي من خلالها نقدر نستخدم الـWMI علشان نحصل على أي معلومات عن الـManaged Resource. وذكرنا أمثلة ليها وكان من ضمنها الـPowerShell Script. وفي الموضوع ده هنعرف إزاي نقدر نستخدم WMI من خلال Windows PowerShell.

في PowerShell طريقتين علشان تقدر تستخدم الـWMI.

الطريقة الأولي: هي إنك تستخدم أمر Get-WmiObject

إستخدام الأمر: get-help get-wmiobject -full علشان تعرف كل المعلومات الخاصة بالأمر Get-Wmiobject زي الـsyntax والـparameters.

مثال 1: عرض معلومات عن الكمبيوتر بإستخدام WMI

{"Get-Wmiobject -class Win32_ComputerSystem | Where {$_.Name -eq "XYZ

في مثال 1، إستخدمت إسم الـWMI class الخاص بالـBIOS كـparameter للأمر Get-WmiObject

مثال 2: عرض كل الـWMI Classes الموجوده في CIMV2 namespace

Get-Wmiobject -namespace "Root\CIMV2" -list

في مثال 2، إستخدمت الـnamespace كـparameter للأمر Get-Wmiobject.

مثال 3: إستخدام WMI Query للحصول على معلومات عن الـService

"Get-Wmiobject -Query "Select * from Win32_Service

الطريقة الثانية: إستخدام  PowerShell WMI Type Accelerator

الـType Accelerator الخاصة بـWMI:

  •  [WMI]
  •  [WMIClass]
  • [WMISearcher]

 [WMI]: وظيفته أنه يساعدك في الحصول على معلومات عن WMI Object محدد عن طريق أنك تستخدم خاصية من خصائص الـObject ده في الحصول على كل معلوماته. أحياناً بيكون أسهل من الـGet-WMIobject في حالة توافر معلومات عن الـWMI Object. أو بمعني أخر الـ[WMI] يستخدم مع الـObjects.

مثال 4: عرض معلومات عن الكمبيوتر بإستخدام WMI] Type Accelerator]

' "WMI]'\\.\root\CIMv2:Win32_ComputerSystem.Name="COMPUTERNAME]

في مثال 4، إستخدمنا [WMI] بدلاً من Get-Wmiobject، وحددنا الـWMI Object path و إختارنا خاصية (Property) من خصائص الـ Object  المطلوب عرض معلوماته، في هذا المثال الخاصية هي (Name)

[WMIClass]: ده بيكون مخصص للإستخدام مع الـWMI Classes

مثال 5:

* WMIClass]'\\.\root\CIMv2:Win32_ComputerSystem' | format-list]

[WMISearcher]: هذا النوع يستخدم الـWMI Query في شكل String. ثم يقوم بإنشاء WMI Searcher Object تستخدم الـQuery. أخيراً يستخدم ()Get لتنفيذ الـQuery  وعرض الناتج.

مثال 6:

"ComputerInfo = [WMISearcher]"Select * From Win32_ComputerSystem$
()ComputerInfo.GET$

WMI in brief

2009/01/18 بواسطة Sherif Talaat

إيه هو الـWMI؟

WMI دي إختصار لـWindows Management Instrumentation وهو عبارة عن تكنولوجيا مختصة بالتحكم وإدارة نظام تشغيل ويندوز أو ما يسمي بـ Windows Management. يعتبر WMI واحد من مكونات نظام تشغيل ويندوز إبتداً من Windows 2000.

من أهم مميزات WMI و بردو من أهم أسباب تطويره، هو أنه يوفر طريقة سهلة و مباشرة للتعامل مع الـManaged Resources الخاصة بالكمبيوتر من خلال الويندوز. الكمبيوتر ده ممكن يكون Local Computer أو ممكن يكون Remote Computer.

يعني إيه Managed Resources؟

المقصود بالـManaged Resources هي أي مكونات جوا الكمبيوتر يمكن للـWMI انه يتعامل معاها سواء كانت Logical Components زي معلومات عن نظام التشغيل، معلومات عن الـUser Accounts. أو Physical Components زي الـBIOS أو الـProcessor. يعني نقدر نقول سواء كانت Software أو Hardware.

يعني إيه WMI namespace؟

ببساطة الـnamespace هو طريقة لتجميع الحاجات(objects) اللي شبه بعض او مرتبطه ببعض في مجموعة واحده (Scope). مفهوم الـnamespace ده ممكن نطبقه على أي حاجة في الدنيا. هناخد الكمبيوتر كمثال للتوضيح. مكونات الكمبيوتر زي الـMotherBoard,Processor,RAM,Hard Disk دي كلها مرتبطه ببعضها وليها علاقة ببعض، في الحالة دي ان احنا نعملها namespace اسمه ComputerHardware. وبكده أول متسمع كلمه Computer Hardware هتفهم ان المقصود بيها هي المكونات زي الـMotherBoard,Processor,RAM,Hard Disk. دلوقتي بعد ما عرفت يعني ايه namespace من السهل انك تعرف يعني إيه WMI namespace. الـWMI namespace هي الـnamespace الخاصة بكل حاجة يقدر الـWMI يتعامل معاها. يعني على سبيل المثال وليس لبحصر هتلاقي WMI namespace إسمه Hardware ده علشان الـhardware اللي يقدر الـWMI يتعامل معاه. كمان هتلاقي namespace اسمه SQL Server علشان الـWMI الخاص بالـSQL

يعني إيه WMI Class؟

الـWMI بيستخدم الـClasses علشان يوصف الخصائص (Properties) لكل object موجود جوا الـnamespace. يعني مثلاً الـWMI class اللي اسمه Win32_BIOS ده بيبقي جواه كل الملعومات اللي تخص الـBIOS زي نوعه، والسوفت وير اللي موجود عليه، والشركة المنتجة، وتاريخ إصداره.

http://msdn.microsoft.com/en-us/library/aa394554(VS.85).aspx

يعني إيه WMI Provide؟

الـProviders بيستخدمها الـWMI في إنه يطلب (Request) المعلومات عن Managed Resource من الويندوز. يعني مثلاً في DNS Provider علشان تقدر تتعامل مع الـDNS من خلال الـWMI.

http://msdn.microsoft.com/en-us/library/aa394570(VS.85).aspx

يعني إيه WMI Consumer أو WMI Application؟

الـProvider كان وظيفته أن يحصل على المعلومات من نظام التشغيل – الويندوز – و الـConsumer وظيفته أن يحصل على المعلومات من الـWMI أو بمعني تاني أنه يحصل على المعلومات اللي بيحصل عليها الـWMI من الـProviders. الـConsumer ده ممكن يكون برنامج بيستخدم الـWMI، على سبيل المثال برنامج Microsoft System Management Server المشهور بإسم SMS. أو ممكن يكون PowerShell Script – VBScript بيستخدم الـWMI Query.

يعني إيه WMI Query؟

الـWMI Query هو الأمر المستخدم بواسطه الـWMI للحصول على معلومات عن الـobjects.

يعني إيه WMI Query Language؟

WQL هي اللغة اللي بيتك كتابه الـWMI Queries بإستخدامها. وهي لغة فرعية من لغة SQL المستخدمه مع قواعد البيانات Database. مما يعني أن الـWQL تشبه في كتابتها لغة SQL.

يعني إيه WMI Repository أو WBEM؟

الـWMI Repository أو WBEM هو المكان الذي يحتوي على المعلومات الخاصة بالنظام والمستخدم بواسطة الـWMI. يمكننا تخيل الـWBEM أنه قاعدة البيانات DB الخاصة بمعلومات النظام.

الـWMI Repository موجود في:

 SystemRoot%\system32\wbem\Repository%

WMI Tools:

WMI Administrative Tools

WMI Code Creator V1.0

Scriptomatic v2.0

WMI Diagnosis Utility V2.0

PowerShell WorkShop Book – Arabic Edition

2009/01/16 بواسطة Sherif Talaat

النسخة المترجمة إلي اللغة العربية من كتاب Windows PowerShell WorkShop 1 لـ Frank Koch، دلوقتي بقت متاحة للتحميل

Download: الكتاب باللغة العربية

PowerGUI is now supporting Arabic UI

2009/01/13 بواسطة Sherif Talaat

أخيراً بعد شغل أكتر من شهرين مع فريق PowerGUI دلوقتي الإصدار 1.6.0 من برنامج PowerGUI بقي بيدعم Interface عربي. الإصدار 1.6.0 يعتبر لسه نسخة تجريبية (فيه لسه شوية مشاكل في الـlayout) بس إن شاء الله هتكون أتحلت في إصدار 1.7.0.

http://dmitrysotnikov.wordpress.com/2009/01/13/powergui-in-arabic-japanese-and-turkish

PowerShell “Hello World” Examples

2008/12/30 بواسطة Sherif Talaat

موضوع النهارده هو مجموعة من أشهر أمثلة لـ PowerShell Scripts هنوضح بيها أهم مميزات PowerShell ممكن تكون الأمثلة مش كتير بس هتوضح كتير. الأمثلة هتركز أكتر على إزاي PowerShell مبني على net framework. وإزاي يقدر بسهوله انه يتعامل مع الـ Classes & DLLs اللي موجوده في net framework.

مثال1:

في الـ #C لو عندك String وعايز تعرف عدد حروفه هتكتب:

int Counter = ”The Arabian PowerShell”.Length 

في الـ PowerShell هتكتب:

The Arabian PowerShell”.Length”

مثال2:

لو عايز تعرف تاريخ النهارده بالـ#C:

;()DateTime.Now.ToShortDateString

بالـ PowerShell:

()Get-Date).ToShortDateString)

لحد دلوقتي ممكن يكون الموضوع مش باين أوي، حلينا نشوف مثال 3 ونشوف لسه مش واضح ولا لأ :)

مثال3:

في المثال ده مش هقارن بين الـ #C وبين الـ PowerShell، انت هتشوف بنفسك وتحكم. مثال 3 ده عبارة عن Windows Form فيها button لما تدوس عليها يقفل الـ Form

PowerShell Windows Form

PowerShell Windows Form

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
(“void][reflection.assembly]::LoadWithPartialName(“System.Windows.Forms]
form = new-object Windows.Forms.Form$
“form.Text= “My First PowerShell Form$
button = new-object Windows.Forms.Button$
“button.text=”Push Me$
“button.Dock=”Fill$
({()button.add_click({$form.close$
(form.control.add($button$
({()form.Add_Shown({$form.Activate$
()form.ShowDialog$
في المثال ده بإستخدام PowerShell عملنا استخدمنا NameSpace اللي اسمه System.Window.Forms زي بالظبط ما بنعمل في #C بس هناك بنكتب Using System.Window.Forms وبعدين عملنا Object من الـ Form وObject من الـ Button و كل Object حددنا الـ Properties. نفس الخطوات اللي بتتعمل بالـ #C. إعتقد كده بقي واضح إزاي PowerShell مبني على net framework.
 
 
المثال رقم 3 من كتاب PowerShell in Action لـ Bruce Payette

(PowerShell Commands (Cmdlet

2008/12/29 بواسطة Sherif Talaat

قبل منتكلم عن  PowerShell Commands خلينا ندردش زي كل مرة، المرة دي هنتكلم شوية يعني إيه Command. علشان نعرف يعني إيه Command لازم نعرف الأول يعني إيه (Command-Line Interface (CLI، الـ CLI دي الـ User Interface اللي الـ Users بيكتب الـ Commands اللي عايزها تتنفذ بدلاً من أنه يختارها من Menu أو Icon يدوس عليها زي ما بيحصل في الـ Graphical User Interface. معني كده ان الـ CMD ده CLI؟ ايوه … وكمان PowerShell ؟ ايوه وكمان PowerShell. نرجع بقي لـ يعني إيه Command. زي مإتفقنا ان CLI ده Console بتكتب في الـ Commands بتاعتك اللي عايزها تنفذ ، وطبعا الـCommands دي بيبقي ليها طريقة كتابة و تركيب معينه اللي بنقول عليه Syntax. والـSyntax بيختلف من CLI للتاني بس تكوين الـ Commands بيبقي ثابت. أي Command بيتكتب في CLI بيبقي ليه شكل معين:

 CommandName  -Parameter  -Argument

مثال: Ping -t 192.168.1.1.

Command Name: ده بيكون إسم الـ Command ، ليكن على سبيل المثال Ping.

Parameter: ودي بتكون بتعبر عن خاصية من خصائص الـ Command، ولتكن t-.

Argument: ودي بتكون قيمة بتستخدم بواسطة الـ Command عن طريق الـ Parameter ولتكن 192.168.1.1.

دلوقتي بقي ما عرفنا يعني إيه Command نرجع لموضوعنا الأساسي وهو PowerShell Commands. الأوامر في PowerShell بتنقسم لـ4 أنواع:

  • Cmdlets
  • Function Commands
  • Script Commands
  • Native Commands

الـ Cmdlets:

الأوامر في PowerShell بيطلق عليها cmdlets وتنطق (command-let)، الـ cmdlets دي بتتميز بإنها تتبع حاجة اسمها Verb-Noun Pattern أو تتكون من فعل-إسم.  وصلت ولا لسه ؟؟ طيب خلينا نقولها بشكل بعيد عن الكمبيوتر، فعل ألامر في أي لغة ولتكن العربية  مثلا بيتكون إزاي ؟؟ أكيد فعل أمر + مفعول به (إسم) يعني مثلا ”إحضر الملف” ده فعل امر يعني Command ، جرب نترجمه للأنجليزية هيبقي Get File،  هي دي نفس طريقة الأوامر في PowerShell بس الفرق الوحيد إنك بتكتب “-” بين الفعل و الإسم يعني تبقي Get-File وبالمناسبة في أمر اسمه Get-File في PowerShell :) ، يعني بإختصار شديد الفعل بيحدد الـ Action اللي هيتنفذ و الإسم بيحدد الـ Objects اللي هينفذ عليه الـAction. بداخل PowerShell v2 CTP3 في أكتر من 270 Cmdlets جاهزه علشان تساعد الـ Administrator انه ينفذ الـ Tasks بتاعته بإسنخدام PowerShell وفي نفس الوقت من غير ميتعلم إزاي يكتب PowerShell Script. الـ Cmdlets دي مبنيه على net framework. و موجوده في شكل ملفات DLLs بتتحمل مع PowerShell Process لما بتشتغل.

علشان تعرف كل الـ cmdlets المتاحة داخل PowerShell ممكن تفتح PowerShell console وتكتب الأمرGet-Command وهيجيلك قائمة بجميع الـ cmdlets.جرب وأنت بتكتب Get-Command انك تكتب بس get-com و دوس على TAB وشوف ايه اللي هيحصل ؟؟ هتلاقي PowerShell كمل باقي الأمر لوحده، دي خاصية اسمها TAB Completion ممكن تساعدك لو نسيت Syntax لأمر معين او نسيت بيتكتب إزاي :) .

الـ Functions:

الـ Functions في PowerShell هي عبارة عن PowerShell Script Code بيتحمل في الـ Memory أول ما مترجم الأوامر Complier – Interpreter يبدأ يشتغل، ودي تعتبر من أسرع أنواع  الأوامر لأنها بتكون مخزنه في الMemory. وظيفة الـ Functions عموماً هي انك يبقي عندك مجموعة من الأوامر بتتكرر كتير جوه نفس الـScript، توفيراً للوقت و المجهود وكمان أحسن وأسرع إداء للـScript يفضل إنك تعمل Function تكتب فيها جزء الـCode اللي بيتكرر و تنادي على الـ Functions دي او تعملها Calling في كل مرة تحتاج تستخدمها. خليك فاكر بتستخدن في إيه لحد منتكلم عنها في موضوع بالتفاصيل.

الـScript Commands:

دي نفس فكرة الـ Functions الفرق بينهم إن الـ Function بتتخزن في الـ Memory والـ Script Command بيتخزن في فايل ps1. وبيتعمله Load كله مرة تشغل فيها الفايل ده. الـScript بيكون أبطيء من الـ Function علشان بيأخد وقت لما يجي يشتغل ويتحمل في الـ Memory. بمجرد تحميله بيشتغل بنفس سرعة الـ Functions.

الـ Native Commands:

النوع ده من الأوامر بيخليك تشغل برامج بتتعامل مع الـ Operating System بس خارج الـ PowerShell، يعني مثلاً تكتب أمر علشان يفتح ملف txt. جوه الـnotepad او تفتح Excel Sheet جوه Microsoft Word. جرب تفتح اي فايل txt باستخدام الأمر ده notepad c:\temp.exe وشوف ايه اللي هيحصل.