এই নিবন্ধে আমরা শিখব কিভাবে ইনভোক-কমান্ড ব্যবহার করতে হয় cmdlet দূরবর্তীভাবে PowerShell কমান্ড বা স্ক্রিপ্ট চালানোর জন্য। আপনি আপনার নেটওয়ার্কের এক বা একাধিক কম্পিউটারে দূরবর্তীভাবে কমান্ড চালানোর জন্য PowerShell ব্যবহার করতে পারেন। Invoke-Command cmdlet PowerShell Remoting থেকে দূরবর্তী ব্যবস্থাপনা বৈশিষ্ট্য ব্যবহার করছে . PowerShell রিমোটিং আপনাকে WinRM এর মাধ্যমে কম্পিউটারে PowerShell সেশনের সাথে দূরবর্তীভাবে সংযোগ করতে দেয় (উইন্ডোজ রিমোট ম্যানেজমেন্ট) পরিষেবা এবং ব্যবস্থাপনার জন্য ওয়েব পরিষেবাগুলি (WS-ম্যানেজমেন্ট) প্রোটোকল। এই পরিষেবাটি দূরবর্তী PowerShell সেশন স্থাপন এবং আপনার কোড চালানোর ক্ষমতা প্রদান করে।
PowerShell রিমোটিং এর জন্য WinRM কনফিগার করা হচ্ছে
PowerShell রিমোটিং কম্পিউটারের মধ্যে যোগাযোগ করতে 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 সেটিংস সেট করবে এবং Windows Firewall-এ ব্যতিক্রম নিয়ম যোগ করবে। Enable-PSRemoting –Force
কমান্ড ব্যবহারকারীকে অনুরোধ না করে WinRM সক্ষম করে।
তারপর আপনি PowerShell রিমোটিং ব্যবহার করে কম্পিউটারে দূরবর্তীভাবে সংযোগ করতে পারেন।
মনে রাখবেন যে আপনার নেটওয়ার্কের ধরন পাবলিক এ সেট করা থাকলে PowerShell রিমোটিং ডিফল্টরূপে কাজ করবে না . তারপর কমান্ড নিম্নলিখিত ত্রুটি প্রদান করে: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.
আপনাকে অবশ্যই নেটওয়ার্ক অবস্থানকে ব্যক্তিগততে পরিবর্তন করতে হবে বা এই কমান্ডটি ব্যবহার করতে হবে:
Enable-PSRemoting –SkipNetworkProfileCheck.
এছাড়াও Windows ডিফেন্ডার ফায়ারওয়াল নিয়ম সক্রিয় করুন যা সর্বজনীন নেটওয়ার্কগুলিতে WinRM-এ অ্যাক্সেসের অনুমতি দেয়। আপনি GPO বা PowerShell ব্যবহার করে ফায়ারওয়াল নিয়ম সক্রিয় করতে পারেন:
Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any
PowerShell রিমোটিং এর মাধ্যমে দূরবর্তী কম্পিউটারে সংযোগ পরীক্ষা করার জন্য, নিম্নলিখিত কমান্ডটি চালান:
Test-WsMan compname1
আপনার যদি একটি অ্যাক্টিভ ডিরেক্টরি ডোমেন না থাকে বা আপনি IP ঠিকানার মাধ্যমে PowerShell রিমোটিং এর মাধ্যমে কম্পিউটার অ্যাক্সেস করেন, এই ক্ষেত্রে NTLM প্রোটোকল প্রমাণীকরণের জন্য ব্যবহার করা হয়। NTLM ব্যবহার করার সময়, আপনি ইনভোক-কমান্ড চালানোর চেষ্টা করলে নিম্নলিখিত ত্রুটি দেখা দেয়:
[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: thetransport 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 শংসাপত্র ইস্যু করুন বা বিশ্বস্ত হোস্ট তালিকায় হোস্টের নাম/আইপি ঠিকানা যোগ করুন:
Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201
অথবা আপনি সমস্ত কম্পিউটারে সংযোগের অনুমতি দিতে পারেন (এটি সুপারিশ করা হয় না, কারণ এটি NTLM-এর একটি অসুবিধা — এটি পারস্পরিক প্রমাণীকরণ সমর্থন করে না)।
Set-Item wsman:\localhost\Client\TrustedHosts -value *
একই সেটিংস রিমোট হোস্টে প্রয়োগ করতে হবে।
বিশ্বস্ত হোস্টের তালিকা প্রদর্শন করতে, কমান্ডটি চালান:
Get-Item WSMan:\localhost\Client\TrustedHosts
পরিবর্তনগুলি প্রয়োগ করতে, WinRM পুনরায় চালু করুন:
Restart-Service WinRM
আমন্ত্রণ-কমান্ড ব্যবহার করে দূরবর্তীভাবে PowerShell কমান্ড কীভাবে চালাবেন?
Invoke-Command cmdlet এক বা একাধিক দূরবর্তী কম্পিউটারে একটি কমান্ড চালানোর অনুমতি দেয়৷
উদাহরণস্বরূপ, দূরবর্তী কম্পিউটারে একটি একক কমান্ড চালানোর জন্য, নিম্নলিখিতটি ব্যবহার করুন:
Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}
এই কমান্ডটি দূরবর্তী কম্পিউটারে ইনস্টল করা PowerShell সংস্করণটি প্রদর্শন করবে, কোন নামটি -ComputerName
এ উল্লেখ করা আছে প্যারামিটার -ScriptBlock {[cmdlet]}
-এ দূরবর্তী কম্পিউটারে চালানোর জন্য কমান্ডটি লিখুন ব্লক।
ডিফল্টরূপে, ইনভোক-কমান্ডের মাধ্যমে প্রেরিত একটি কমান্ড দূরবর্তী কম্পিউটারে বর্তমান ব্যবহারকারী হিসাবে কার্যকর করা হয়। আপনি যদি এটিকে অন্য ব্যবহারকারী হিসাবে চালাতে চান, ব্যবহারকারীর শংসাপত্রের জন্য অনুরোধ করুন এবং একটি পরিবর্তনশীল এ সংরক্ষণ করুন:
$cred = Get-Credential
Invoke-Command -ComputerName dc01 -Credential $cred -ScriptBlock {Get-NetAdapter}
এই PowerShell কমান্ডটি দূরবর্তী কম্পিউটারে নেটওয়ার্ক ইন্টারফেসের তালিকা প্রদর্শন করে:
আপনি সেমিকোলন দ্বারা বিভক্ত, ScriptBlock-এ একাধিক কমান্ড লিখতে পারেন। উদাহরণস্বরূপ, নিম্নলিখিত কমান্ডটি বর্তমান সময় অঞ্চল প্রদর্শন করবে এবং এটিকে অন্য একটিতে পরিবর্তন করবে:
Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Central Europe Standard Time”}
নির্বাচন করুন
ইনভোক-কমান্ড আপনাকে শুধুমাত্র পৃথক কমান্ডই চালাতে দেয় না, পাওয়ারশেল স্ক্রিপ্টগুলিও চালাতে দেয়। এটি করতে, -FilePath আর্গুমেন্ট (-ScriptBlock এর পরিবর্তে) ব্যবহার করা হয়। এই ক্ষেত্রে, আপনি আপনার কম্পিউটারে স্থানীয় PS1 স্ক্রিপ্ট ফাইলের পথ নির্দিষ্ট করুন (আপনাকে লক্ষ্য দূরবর্তী কম্পিউটারে স্ক্রিপ্ট ফাইলটি অনুলিপি করতে হবে না):
Invoke-Command -ComputerName DC01 -FilePath C:\PS\Scripts\CheckSMBversion.ps1
এক সাথে একাধিক কম্পিউটারে কমান্ড চালানোর জন্য ইনভোক-কমান্ড কীভাবে ব্যবহার করবেন?
আপনি সমান্তরাল (একসাথে) একাধিক দূরবর্তী কম্পিউটারে কমান্ড চালানোর জন্য ইনভোক-কমান্ড ব্যবহার করতে পারেন।
সবচেয়ে সহজ ক্ষেত্রে, PowerShell কমান্ড চালানোর জন্য কম্পিউটারের নাম কমা দিয়ে আলাদা করা হয়:
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)
PowerShell মডিউলের জন্য AD থেকে Get-ADComputer cmdlet ব্যবহার করে আপনি AD-তে কম্পিউটারের একটি তালিকাও পেতে পারেন:
ডোমেনের সমস্ত Windows সার্ভার হোস্টে একটি কমান্ড চালানোর জন্য, নিম্নলিখিত PowerShell কোডটি ব্যবহার করুন:
$computers = (Get-ADComputer -Filter 'OperatingSystem -like "*Windows server*" -and Enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -ScriptBlock {Get-Date} -ErrorAction SilentlyContinue
যদি একটি কম্পিউটার বন্ধ থাকে বা অনুপলব্ধ থাকে, তাহলে সাইলেন্টলি কন্টিনিউ প্যারামিটারের কারণে স্ক্রিপ্টটি বন্ধ হবে না এবং অন্যান্য কম্পিউটারে চলতে থাকবে৷
কোন কম্পিউটার থেকে ফলাফল এসেছে তা বোঝার জন্য, PScomputerNamee এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করুন।
$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTime
একাধিক কম্পিউটারে ইনভোক-কমান্ড ব্যবহার করে একটি কমান্ড চালানোর সময়, এটি একই সাথে চালানো হয়। ইনভোক-কমান্ডের সর্বাধিক সংখ্যক কম্পিউটার একই সময়ে পরিচালনা করার জন্য একটি সীমাবদ্ধতা রয়েছে (একটি সীমিত সংখ্যক একযোগে PSSsessions)। এই সীমাবদ্ধতা থ্রটল লিমিটে সেট করা আছে প্যারামিটার (ডিফল্ট মান হল 32)। আপনি যদি 32টির বেশি কম্পিউটারে একটি কমান্ড চালাতে চান (উদাহরণস্বরূপ 128), –ThrottleLimit 128
ব্যবহার করুন (তবে, প্রচুর সংখ্যক PSS অধিবেশন স্থাপনের জন্য আপনার কম্পিউটারের লোড বেশি হবে)।
পটভূমিতে ইনভোক-কমান্ডের মাধ্যমে দূরবর্তী কম্পিউটারে কমান্ড চালানোর জন্য, একটি বিশেষ বৈশিষ্ট্য –AsJob
ব্যবহৃত হয়. তারপর কমান্ডের ফলাফল কনসোলে ফিরে আসে না। ফলাফল পেতে, একটি পান-চাকরি ব্যবহার করুন cmdlet।