الجلسات القابلة لإعادة الاستخدام في PowerShell: دليل للاتصالات عن بعد الثابتة

إدارة الأنظمة البعيدة يمكن أن تتحول بسرعة إلى صداع، خاصة عند تشغيل أوامر متعددة عبر آلات مختلفة. إن العودة المستمرة للاتصال بالأنظمة يمكن أن تضيع الوقت وتبطئ سير العمل لديك. يبدو مألوفًا؟ لا تقلق، هناك طريقة أفضل!

في هذا الدليل، ستتعلم كيفية استخدام جلسات PowerShell عن بعد القابلة لإعادة الاستخدام لجعل إدارة الأنظمة البعيدة أسرع وأسهل وأكثر كفاءة.

هل أنت مستعد لتطوير مهاراتك في PowerShell عن بعد؟ دعنا نبدأ!

إنشاء واستخدام جلسة

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

إنشاء جلسة مستمرة يحافظ على اتصال مستمر. Doing so eliminates the need to connect and disconnect as you execute multiple commands repeatedly.

للبدء، ستحتاج إلى إنشاء جلسة قابلة لإعادة الاستخدام.

يستخدم الأمر New-PSSession لإنشاء اتصال مستمر مع الكمبيوتر البعيد:

$session = New-PSSession -ComputerName SRV2

يمكن تمرير كائن الجلسة هذا إلى أوامر مثل Invoke-Command، مما يسمح لك بإعادة استخدام نفس الجلسة طوال البرنامج النصي الخاص بك.

على سبيل المثال، يمكنك اختبار الاتصال عن طريق تشغيل أمر أساسي:

Invoke-Command -Session $session -ScriptBlock { hostname }

تتيح لك الجلسة القابلة لإعادة الاستخدام أيضًا تخزين واسترجاع المتغيرات على النظام البعيد:

Invoke-Command -Session $session -ScriptBlock { $foo = 'Please be here next time' }
Invoke-Command -Session $session -ScriptBlock { $foo }

تعتبر هذه القدرة على التخزين المستمر ميزة كبيرة للجلسات القابلة لإعادة الاستخدام، مما يمكّنك من الحفاظ على الحالة عبر أوامر متعددة.

تكييف الوظيفة للاستخدام عن بعد

لنقم بتكييف وظيفة الجرد للعمل مع الجلسات القابلة لإعادة الاستخدام.

أولاً، نضيف معلمة Session لقبول كائن الجلسة، حيث يساعد الأمر Get-Member في تحديد نوع كائن الجلسة:

$session | Get-Member

بعد تحديد أن كائن الجلسة من نوع System.Management.Automation.Runspaces.PSSession، الخطوة التالية هي تعريف وظيفة Get-WmiObjectValue.

تستخدم هذه الوظيفة معلمة الجلسة لتمكين التنفيذ عن بُعد، مما يسمح لها بتشغيل كتلة سكربت على النظام البعيد واسترجاع خاصية WMI محددة.

function Get-WmiObjectValue {
    [CmdletBinding()]
    param(
        # Specify the name of the WMI property to query
        [Parameter(Mandatory)]
        [string]$PropertyName,

        # Specify the name of the WMI class to query
        [Parameter(Mandatory)]
        [string]$WmiClassName,

        # Specify the remote session object to use for invoking the command
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    # Define the script block to execute on the remote machine
    $scriptBlock = {
        # Get the sum of the specified property from the WMI class
        $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum

        # Convert the sum to gigabytes
        $numberGb = $number / 1GB

        # Round the result to 2 decimal places
        [math]::Round($numberGb, 2)
    }

    # Execute the script block on the remote machine using the provided session
    Invoke-Command -Session $Session -Scriptblock $scriptBlock
}

دعونا نجرب هذه الوظيفة ونرى ماذا سيحدث.

Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session

سوف تواجه هذا الخطأ في مرحلة ما. لكن لا تقلق. تابع القراءة، وستتعلم كيفية معالجة هذا الخطأ.

معالجة مشكلات المصادقة

إذا واجهت أخطاء “تم رفض الوصول”، فمن المحتمل أن يكون ذلك بسبب عدم كفاية الأذونات. بشكل افتراضي، ترث الجلسات القابلة لإعادة الاستخدام أوراق الاعتماد المستخدمة لإنشائها.

تحقق من اسم مستخدم المستخدم الحالي المصرح به على النظام:

whoami

إذا كان المستخدم في النطاق، المسمى user، لا يملك الإذن لاستعلام WMI على الكمبيوتر البعيد، قم بترقية الأمر Invoke-Command لاستخدام حساب مسؤول.

أولاً، قم بإنشاء كائن أوراق اعتماد باستخدام الأمر Get-Credential لتحديد أوراق اعتماد بديلة عند إنشاء الجلسة:

$adminCred = Get-Credential -UserName adam

بمجرد المصادقة، اختبر الجلسة:

Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred

يضمن هذا الاختبار أن الجلسة تعمل كما هو متوقع قبل تشغيل وظيفة الجرد الخاصة بك.

لكن إذا لم تعمل الجلسة، فقد تم إنشاؤها بالفعل ببيانات اعتماد غير صحيحة. إذا كان الأمر كذلك، يجب عليك إزالة الجلسة الحالية:

Remove-PSSession -Session $session

تقوم الكوماندلت Remove-PSSession بإزالة الجلسة على كل من الكمبيوتر المحلي والكمبيوتر البعيد.

بعد إزالة الجلسة القديمة، قم بإنشاء جلسة جديدة أخرى. ولكن هذه المرة، قم بإنشاء الجلسة مصدقًا كمستخدم إداري:

$session = New-PSSession -ComputerName SRV2 -Credential $adminCred

حاول استخدام Invoke-Command مرة أخرى باستخدام الجلسة الجديدة وانظر ماذا يحدث.

Invoke-Command -Session $session -Scriptblock {hostname} -Credential $adminCred

الآن بعد أن أصبحت واثقًا من أن الجلسة الجديدة تعمل، دعنا نجرب الوظيفة مرة أخرى.

Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session

جمع كل شيء معًا

انتهى العمل الجاد، وحان الوقت لدمج كل شيء في نص برمجي واحد.

يقوم هذا النص البرمجي النهائي بجمع معلومات الجرد، وعرض النتائج، وتنظيف الجلسة:

function Get-WmiObjectValue {
    [CmdletBinding()]
    param(
        # Specify the name of the WMI property to query
        [Parameter(Mandatory)]
        [string]$PropertyName,

        # Specify the name of the WMI class to query
        [Parameter(Mandatory)]
        [string]$WmiClassName,

        # Specify the remote session object to use for invoking the command
        [Parameter(Mandatory)]
        [System.Management.Automation.Runspaces.PSSession]$Session
    )

    # Define the script block to execute on the remote machine
    $scriptBlock = {
        # Get the sum of the specified property from the WMI class
        $number = (Get-CimInstance -ClassName $using:WmiClassName | Measure-Object -Property $using:PropertyName -Sum).Sum

        # Convert the sum to gigabytes
        $numberGb = $number / 1GB

        # Round the result to 2 decimal places
        [math]::Round($numberGb, 2)
    }

    # Execute the script block on the remote machine using the provided session
    Invoke-Command -Session $Session -Scriptblock $scriptBlock
}

## Grab the alternate credential: Get-CimInstance will work on the remote computer
$adminCred = Get-Credential -UserName adam

## Create a session authenticating as the adam (admin) user
$session = New-PSSession -ComputerName SRV2 -Credential $adminCred

## Find the total memory and total volume storage space on the remote computer
$totalMemoryGb = Get-WmiObjectValue -PropertyName Capacity -WmiClassName Win32_PhysicalMemory -Session $session
$totalStorageGb = Get-WmiObjectValue -PropertyName FreeSpace -WmiClassName Win32_LogicalDisk -Session $session

Write-Host "The computer $($session.ComputerName) has $totalMemoryGb GB of memory and $totalStorageGb GB of free space across all volumes."

## Remove the shared session
Remove-PSSession -Session $session

احفظ وقم بتشغيل النص البرمجي (Get-InventoryInfo.ps1) للتحقق من أنه يعمل كما هو مقصود.

الخاتمة

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

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

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

Source:
https://adamtheautomator.com/powershell-reusable-sessions/