التحكم عن بُعد باستخدام PowerShell: تنفيذ الأوامر عن بُعد كالمحترفين

افترض أنك تعلمت تنفيذ الأوامر محليًا؛ وهذا بالفعل خطوة نحو إتقان التنفيذ عن بُعد. يسمح PowerShell Remoting للمسؤولين بتنفيذ الأوامر والبرامج النصية على الأنظمة البعيدة.

توضح هذه الدليل كيفية إعداد واستخدام PowerShell Remoting في بيئة Active Directory (AD). تخيل إنشاء ملفات، وتشغيل برامج نصية، أو التحقق من التكوينات عن بُعد دون مغادرة مكتبك.

قم بإعداد واستخدام PowerShell Remoting لتتمكن من تنفيذ البرامج النصية بثقة على الأنظمة البعيدة!

إعداد PowerShell Remoting لمستخدم عادي

قبل الاستفادة الكاملة من PowerShell Remoting، يجب عليك التأكد من وجود الأذونات اللازمة. يعتمد تشغيل الأوامر أو البرامج النصية عن بُعد على التكوين الصحيح، خاصة في بيئات Active Directory حيث تكون الأمان أولوية.

ابدأ بمحاولة الاتصال بخادم بعيد (SRV2) باستخدام Invoke-Command. الأمر التالي يشغل كتلة برنامج نصي على الكمبيوتر البعيد:

Invoke-Command -ComputerName SRV2 -ScriptBlock {Write-Host "Hi, I'm running code on the $(hostname) remote computer!"}

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

بشكل افتراضي، يجب أن يكون المستخدمون غير الإداريين أعضاء في مجموعة Remote Management Users المحلية على الكمبيوتر البعيد.

تحقق من عضوية المجموعة:

Get-LocalGroupMember -Group 'Remote Management Users'

إذا لم يكن المستخدم مدرجًا، أضفه:

Add-LocalGroupMember -Group 'Remote Management Users' -Member user
Get-LocalGroupMember -Group 'Remote Management Users'

الآن، أعد محاولة أمر Invoke-Command لتأكيد الاتصال.

Invoke-Command -ComputerName SRV2 -ScriptBlock {Write-Host "Hi, I'm running code on the $(hostname) remote computer!"}

تشغيل برنامج نصي أساسي عن بُعد

بمجرد تكوين تشغيل PowerShell Remoting ، يمكنك تشغيل الأوامر على الكمبيوتر البعيد. تفتح هذه القدرة الإمكانات لتلقين المهام ، وجمع البيانات ، وحل المشاكل عن بُعد.

لرؤية كيفية عمل تشغيل PowerShell عن بُعد ، أنشئ ملف نصي على الجهاز البعيد ، ثم تحقق من نجاح الإجراء.

حدد ونفذ كتلة النص:

$scriptblock = { Set-Content -Path 'somefile.txt' -Value '' }
Invoke-Command -Scriptblock $scriptblock -ComputerName SRV2

تحقق من أن الملف قد تم إنشاؤه بالأمر التالي:

يتصل هذا الأمر بالكمبيوتر البعيد SRV2 ، ويسترد معلومات حول الملف somefile.txt ، ويخرج فقط اسمه ووقت إنشائه.

icm -ComputerName SRV2 -ScriptBlock {Get-Item somefile.txt} | Select-Object Name, CreationTime

تشغيل النصوص المحلية على أجهزة الكمبيوتر البعيدة

ربما لا يكون الأمر الفردي كافيًا ، وقد تحتاج إلى تشغيل سكريبت كامل يتم تخزينه محليًا على جهازك. إذا كان الأمر كذلك ، يتيح لك تشغيل PowerShell Remoting إرسال سريع لسكريبت محلي إلى جهاز كمبيوتر بعيد وتنفيذه كما لو كنت هناك في المكان.

لتوضيح تشغيل السكريبتات على جهاز كمبيوتر بعيد ، أنشئ سكريبتًا قصيرًا محليًا وقم بتشغيله على جهاز بعيد لتلقين الإجراءات أو تنظيف المهام.

أنشئ سكريبتًا محليًا باستخدام هذا الأمر حيث:

  • $scriptContents يخزن السكريبت في سلسلة متعددة الأسطر باستخدام سلسلة هنا (@' ... '@) ، والتي تكون مفيدة لجعل السكريبت قابل للقراءة ومنظم.
  • Set-Content يكتب محتويات $scriptContents في ملف يسمى *RunThisRemotely.ps1* في الدليل الحالي.
$scriptContents =
@'
Write-Host "Deleting the file just created..."
Remove-Item -Path somefile.txt
'@
Set-Content -Path 'RunThisRemotely.ps1' -Value $scriptContents

تأكيد محتوى السكريبت:

Get-Content RunThisRemotely.ps1

قم بتشغيل السكريبت عن بُعد:

Invoke-Command -ComputerName SRV2 -FilePath RunThisRemotely.ps1

الآن ، تحقق من حذف الملف الاختباري:

icm -ComputerName SRV2 -ScriptBlock {Test-Path somefile.txt}

التحقق من مفاتيح التسجيل المحلية باستخدام كتلة سكربت

يدعم الاتصال عن بُعد في PowerShell تمرير المتغيرات بين الجلسات المحلية والبعيدة، مما يمكّن من استخدام سكربتات مرنة وقابلة لإعادة الاستخدام. لكن لنبدأ بالتركيز على التحقق من مفاتيح التسجيل محليًا.

تخزين مسارات تسجيل متعددة يمكن التحقق منها لاحقًا لمعرفة ما إذا كانت موجودة على النظام:

# Define an array of registry paths to check
$registryKeyPaths = @(
    'HKLM:\SOFTWARE\Microsoft\AppV\', 
    'HKLM:\SOFTWARE\Microsoft\AccountsControl\'
)

أضف هذا إلى السكربت لتعريف كتلة سكربت ****($localScriptBlock) التي يتم تنفيذها محليًا على الكمبيوتر. تتحقق كتلة السكربت مما إذا كانت مسارات التسجيل المحددة موجودة على الجهاز المحلي وتوفر ملاحظات لكل مسار.

# Define the script block that will run locally on the computer
$localScriptBlock = {
    ## Iterate through each registry path in the $registryKeyPaths array
    foreach ($path in $registryKeyPaths) {
        # Check if the current registry path exists on the local machine
        if (Test-Path -Path $path) {
            # If the path exists, output a message confirming its existence
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            # If the path does not exist, output a message stating its absence
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

نفّذ كتلة السكربت وانظر ماذا يحدث.

Invoke-Command -ScriptBlock $localScriptBlock

تمرير المتغيرات المحلية إلى الجلسات البعيدة

سواء كنت تعمل مع المصفوفات أو السلاسل أو الكائنات، يمكنك تمرير البيانات إلى الأوامر البعيدة بطريقتين:

  • $using – يدمج المتغيرات المحلية في كتلة السكربت مباشرة.
  • ArgumentList – يمرر المتغيرات صراحةً إلى الكتلة لاستخدامها.

تابع القراءة لاستكشاف الطريقتين ($using أو ArgumentList) لتحقيق هذا الهدف.

استخدام الكلمة الرئيسية $using (النهج المفضل)

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

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

مع هذه الطريقة، يمكنك ببساطة إضافة بادئة $using إلى متغير محلي. هذه الخطوة تخبر PowerShell بالإشارة إلى المتغير المحلي registryKeyPaths قبل تنفيذ الكود على الكمبيوتر البعيد.

$remoteScriptBlock = {
    ## Check to see if the registry keys exist on the computer
    foreach ($path in $using:registryKeyPaths) {
        if (Test-Path -Path $path) {
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

يمكنك بعد ذلك استدعاء الأمر البعيد لتنفيذ الكود على الجهاز البعيد:

Invoke-Command -ScriptBlock $remoteScriptBlock -ComputerName SRV2

يبدو أن مفاتيح التسجيل موجودة هناك أيضًا.

استخدام معلمة ArgumentList

بجانب الكلمة الرئيسية $user، خيار آخر هو معلمة ArgumentList لإرسال المتغيرات إلى الجلسة البعيدة.

قم بإنشاء سكربت (مشابه للذي يحتوي على الكلمة الرئيسية $using) يستخدم مصفوفة $args للوصول إلى القيم المرسلة عبر معلمة ArgumentList.

في هذه الطريقة، تحدد واحدًا أو أكثر من المتغيرات ليتم إرسالها إلى الجلسة البعيدة من خلال معلمة ArgumentList. داخل كتلة السكربت، استبدل المتغير المحلي بـ $args، التي ستقوم PowerShell بملئها تلقائيًا بالقيم المرسلة عبر ArgumentList.

$remoteScriptBlock = {
    ## Check to see if the registry keys exist on the computer
    foreach ($path in $args) {
        if (Test-Path -Path $path) {
            Write-Host -Object "The registry path [$path] exists on the computer $(hostname)."
        } else {
            Write-Host -Object "The registry path [$path] does not exist on the computer $(hostname)."
        }
    }
}

الآن، نفذ السكربت باستخدام الأمر التالي:

Invoke-Command -ScriptBlock $remoteScriptBlock -ComputerName SRV2 -ArgumentList $registryKeyPaths

ستنتج كلا الطريقتين نفس النتيجة، مما يؤكد وجود مفاتيح التسجيل على الكمبيوتر البعيد.

من خلال اتباع هذه الخطوات، يمكنك إعداد واستخدام PowerShell Remoting بفعالية لتشغيل الأوامر والبرمجيات النصية على الأنظمة البعيدة.

الخلاصة

في هذا الدليل، تعلمت كيفية إعداد PowerShell Remoting في بيئة Active Directory، وتشغيل الأوامر والبرمجيات النصية على الأنظمة البعيدة، وتمرير المتغيرات بفعالية. هذه المهارات الأساسية ضرورية لأتمتة المهام الإدارية وإدارة الأنظمة بكفاءة.

الآن بعد أن غطيت الأساسيات، فكر في استكشاف مواضيع أكثر تقدمًا. انظر إلى جلسات PowerShell المستمرة، ومعالجة الأخطاء عن بُعد، أو إنشاء برمجيات نصية قابلة لإعادة الاستخدام للتعامل مع العمليات الكبيرة.

الإمكانيات مع PowerShell Remoting لا حصر لها – لذا ابدأ بالتجربة واجعل سير العمل لديك أكثر كفاءة!

Source:
https://adamtheautomator.com/powershell-remoting-guide/