এই লেখায় আমরা শিখব কিভাবে Invoke-Command কmdলেট ব্যবহার করে পাওয়ারশেল কমান্ড বা স্ক্রিপ্ট রিমোটলি চালানো যায়। আপনি পাওয়ারশেল ব্যবহার করে আপনার নেটওয়ার্কে এক বা একাধিক কম্পিউটারে রিমোটলি কমান্ড চালাতে পারেন। Invoke-Command কmdলেট PowerShell Remoting-এর রিমোট ম্যানেজমেন্ট ফিচার ব্যবহার করে। PowerShell Remoting আপনাকে WinRM (Windows Remote Management) সার্ভিস এবং Web Services for Management (WS-Management) প্রোটোকল ব্যবহার করে কম্পিউটারগুলিতে রিমোট পাওয়ারশেল সেশনে কানেক্ট করতে এবং আপনার কোড চালাতে দেয়।
PowerShell Remoting-এর জন্য WinRM কনফিগার করা
PowerShell Remoting কম্পিউটারগুলোর মধ্যে যোগাযোগের জন্য HTTP (পোর্ট TCP/5985) বা HTTPS (পোর্ট TCP/5986) ব্যবহার করে। ডিফল্টভাবে, HTTP প্রোটোকল ব্যবহৃত হয়, কিন্তু এই ট্রাফিকও AES-56 ব্যবহার করে এনক্রিপ্টেড থাকে (যাচ্ছে, ম্যান-ইন-দ-মিডল টাইপের আক্রমণের হুমকি থাকে)। Kerberos বা NTLM অথেনটিকেশনও ব্যবহার করা যেতে পারে।
WinRM আপনি যেসব রিমোট কম্পিউটারে কানেক্ট করতে চান সেগুলোতে চলতে হবে। WinRM সার্ভিস স্ট্যাটাস চেক করুন:
Get-Service -Name "*WinRM*" | fl
সার্ভিস চলছে না হলে, শুরু করুন:
Enable-PSRemoting
WinRM has been updated to receive requests. WinRM service started. WinRM is already set up for remote management on this computer.
এই কমান্ড WinRM সার্ভিস শুরু করবে (এবং অটোমেটিক স্টার্ট সেট করবে), ডিফল্ট winrm সেটিংস সেট করবে, এবং উইন্ডোজ ফায়ারওয়ালে এক্সেপশন নিয়ম যোগ করবে। Enable-PSRemoting –Force কমান্ড ব্যবহারকারকে প্রম্পট ছাড়া WinRM ইনএবল করে।
তারপর আপনি রিমোটলি পাওয়ারশেল রিমোটিং ব্যবহার করে কম্পিউটারে কানেক্ট করতে পারেন।
দ্রষ্টব্য। ডিফল্টভাবে PowerShell Remoting কাজ করবে না আপনার নেটওয়ার্ক টাইপ Public সেট থাকলে। তখন কমান্ডটি নিচের এরর রিটার্ন করবে:
Set-WSManQuickConfig : ... WinRM firewall exception will not work since one of the network connection types on this machine is set to Public. Change the network connection type to either Domain or Private and try again.
আপনাকে নেটওয়ার্ক লোকেশন Private-এ পরিবর্তন করতে হবে বা এই কমান্ড ব্যবহার করতে হবে:
Enable-PSRemoting –SkipNetworkProfileCheck.
এছাড়া, পাবলিক নেটওয়ার্কে WinRM-এ অ্যাক্সেস অনুমোদনকারী উইন্ডোজ ডিফেন্ডার ফায়ারওয়াল নিয়ম সক্রিয় করুন। আপনি ফায়ারওয়াল নিয়ম GPO বা পাওয়ারশেল 통해서 সক্রিয় করতে পারেন:
Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any
রিমোট কম্পিউটারের সাথে পাওয়ারশেল রিমোটিং কানেকশন টেস্ট করতে, নিচের কমান্ড চালান:
Test-WsMan compname1
আপনার যদি এক্টিভ ডিরেক্টরি ডোমেন না থাকে বা আপনি IP ঠিকানা ব্যবহার করে পাওয়ারশেল রিমোটিং দিয়ে কম্পিউটার অ্যাক্সেস করেন, তবে এই কেসে NTLM প্রোটোকল অথেনটিকেশনের জন্য ব্যবহার হয়। NTLM ব্যবহার করার সময়, আপনি যদি Invoke-Command চালানোর চেষ্টা করেন, তবে নিচের এরর আসবে:
[192.168.1.201] Connecting to remote server 192.168.1.102 failed with the following error message: The WinRM client cannot process the request. Default authentication may be used with an IP address under the following conditions: the transport is HTTPS or the destination is in the TrustedHosts list, and explicit credentials are provided. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. + FullyQualifiedErrorId: CannotUseIPAddress,PSSessionStateBroken
NTLM অথেনটিকেশন সঠিকভাবে কাজ করার জন্য আপনি যে কম্পিউটার থেকে কানেক্ট করছেন সেটে আরও কিছু করতে হবে: WinRM-এর জন্য SSL সার্টিফিকেট ইস্যু করুন অথবা হোস্ট নাম/IP ঠিকানা TrustedHosts লিস্টে যোগ করুন:
Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201
অথবা আপনি সকল কম্পিউটারের সাথে কানেকশন অনুমোদন করতে পারেন (এটি প্রস্তাবিত নয়, কারণ এটি NTLM-এর একটি ডিসঅ্যাডভান্টেজ — এটি মিউচুয়াল অথেনটিকেশন সাপোর্ট করে না)।
Set-Item wsman:\localhost\Client\TrustedHosts -value *
এই সেটিংস রিমোট হোস্টগুলেও প্রযোজ্য করতে হবে।
Trusted hosts তালিকা দেখতে কমান্ড চালান:
Get-Item WSMan:\localhost\Client\TrustedHosts
পরিবর্তন প্রযোজ্য করতে WinRM রিস্টার্ট করুন:
Restart-Service WinRM
আপনি গ্রুপ পলিসি ব্যবহার করেও WinRM ইনএবল ও কনফিগার করতে পারেন।
Invoke-Command ব্যবহার করে রিমোটলি পাওয়ারশেল কমান্ড চালানো
Invoke-Command কmdলেট এক বা একাধিক রিমোট কম্পিউটারে কমান্ড চালাতে দেয়।
উদাহরণস্বরূপ, একটি রিমোট কম্পিউটারে একটি সিঙ্গেল কমান্ড চালাতে, নিচেরটি ব্যবহার করুন:
Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}
এই কমান্ড রিমোট কম্পিউটারে ইনস্টল করা পাওয়ারশেল ভার্সন দেখাবে, যার নাম -ComputerName প্যারামিটারে নির্দিষ্ট করা আছে। রিমোট কম্পিউটারে চালানোর কমান্ডটি -ScriptBlock {[cmdlet]} ব্লকে লিখুন।
ডিফল্টভাবে, Invoke-Command মাধ্যমে পাঠানো কমান্ড রিমোট কম্পিউটারে বর্তমান ব্যবহারকারী হিসেবে এক্সিকিউট হয়। আপনি যদি অন্য ব্যবহারকারী হিসেবে চালাতে চান, তবে ব্যবহারকারীর ক্রেডেনশিয়াল চেয়ে একটি ভেরিয়েবলে সংরক্ষণ করুন:
$cred = Get-Credential
Invoke-Command -ComputerName dc01 -Credential $cred -ScriptBlock {Get-NetAdapter}
এই পাওয়ারশেল কমান্ড রিমোট কম্পিউটারের নেটওয়ার্ক ইন্টারফেস তালিকা দেখাবে।
আপনি ScriptBlock-এ একাধিক কমান্ড সেমিকোলন দিয়ে লিখতে পারেন। উদাহরণস্বরূপ, নিচের কমান্ড বর্তমান টাইম জোন দেখাবে এবং অন্য একটি তে পরিবর্তন করবে:
Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Central Europe Standard Time"}
Invoke-Command আপনাকে শুধু individuelles কমান্ডই নয়, পাওয়ারশেল স্ক্রিপ্টও চালাতে দেয়। এর জন্য, -FilePath আর্গুমেন্ট ব্যবহার করা হয় (–ScriptBlock-এর বদলে)। এই কেসে, আপনি আপনার কম্পিউটারের লোকাল PS1 স্ক্রিপ্ট ফাইলের পাথ নির্দিষ্ট করবেন (আপনাকে স্ক্রিপ্ট ফাইল টার্গেট রিমোট কম্পিউটারে কপি করার দরকার নেই):
Invoke-Command -ComputerName DC01 -FilePath C:\PS\Scripts\CheckSMBversion.ps1
Invoke-Command ব্যবহার করে একাধিক কম্পিউটারে সিমাল্টেনিয়াসলি কমান্ড চালানো
আপনি Invoke-Command ব্যবহার করে একাধিক রিমোট কম্পিউটারে প্যারালেলি (সিমাল্টেনিয়াসলি) কমান্ড চালাতে পারেন।
সাবচেয়ে সহজ কেসে, কম্পিউটারদের নাম কমা দিয়ে আলাদা করা হয়:
Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
আপনি কম্পিউটারদের তালিকা একটি ভেরিয়েবলে (অ্যারে) রাখতে পারেন:
$servers = @("server1","server2","server3")
Invoke-Command -ScriptBlock { get-date} -ComputerName $servers
অথবা একটি টেক্সট ফাইল থেকে পান:
Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName(Get-Content c:\ps\servers.txt)
আপনি AD-এ Get-ADComputer কmdলেট ব্যবহার করে (AD জন্য পাওয়ারশেল মডিউল থেকে) কম্পিউটার তালিকা পেতে পারেন:
ডোমেনে সকল উইন্ডোজ সার্ভার হোস্টে একটি কমান্ড চালাতে, নিচের পাওয়ারশেল কোড ব্যবহার করুন:
$computers = (Get-ADComputer -Filter 'OperatingSystem -like "*Windows server*" -and Enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -ScriptBlock {Get-Date} -ErrorAction SilentlyContinue
যদি কোনো কম্পিউটার বন্ধ থাকে বা অনুপলব্ধ থাকে, SilentlyContinue প্যারামিটারের কারণে স্ক্রিপ্ট রুকবে না এবং অন্যান্য কম্পিউটারে চালিয়ে যাবে।
ফলাফল কোন কম্পিউটার থেকে আসছে তা বুঝতে PSComputerNamee এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করুন।
$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTime
Invoke-Command ব্যবহার করে একাধিক কম্পিউটারে কমান্ড চালালে, এটি সিমাল্টেনিয়াসলি চলে। Invoke-Command-এ একসাথে ম্যানেজ করা কম্পিউটারের সর্বোচ্চ সংখ্যার একটি রেস্ট্রিকশন আছে (সিমাল্টেনিয়াস PSSessions-এর সীমিত সংখ্যা)। এই রেস্ট্রিকশন ThrottleLimit প্যারামিটারে সেট থাকে (ডিফল্ট মান ৩২)। আপনি যদি ৩২টির বেশি কম্পিউটারে (১২৮, উদাহরণস্বরূপ) কমান্ড চালাতে চান, তবে –ThrottleLimit 128 ব্যবহার করুন (যাচ্ছে, আপনার কম্পিউটারে একটি বড় সংখ্যক PSSession স্থাপনের জন্য বেশি লোড হবে)।
রিমোট কম্পিউটারে Invoke-Command দিয়ে কমান্ড ব্যাকগ্রাউন্ডে চালাতে, একটি স্পেশাল অ্যাট্রিবিউট –AsJob ব্যবহার করা হয়। তখন কমান্ডের ফলাফল কনসোলে রিটার্ন হয় না। ফলাফল পেতে Receive-Job কmdলেট ব্যবহার করুন।