Uzak Bilgisayarlarda Komut Dosyalarını Çalıştırmak için PowerShell Invoke-Command'ı Kullanma
Bu makalede, PowerShell komutlarını veya betiklerini uzaktan çalıştırmak için Invoke-Command cmdlet'inin nasıl kullanılacağını öğreneceğiz. Ağınızdaki bir veya daha fazla bilgisayarda uzaktan komut çalıştırmak için PowerShell'i kullanabilirsiniz. Invoke-Command cmdlet'i, PowerShell Remoting'in uzaktan yönetim özelliklerini kullanıyor. PowerShell Remoting, WinRM (Windows Uzaktan Yönetim) hizmeti ve Yönetim için Web Hizmetleri (WS-Management) protokolü aracılığıyla bilgisayarlardaki PowerShell oturumlarına uzaktan bağlanmanıza olanak tanır. Bu hizmet, uzak PowerShell oturumları oluşturma ve kodunuzu çalıştırma yeteneği sağlar.
PowerShell Uzaktan İletişim için WinRM'yi Yapılandırma
PowerShell Remoting, bilgisayarlar arasında iletişim kurmak için HTTP (Port TCP/5985) veya HTTPS (Port TCP/5986) kullanır. Varsayılan olarak, HTTP protokolü kullanılır, ancak bu trafik bile AES-56 kullanılarak şifrelenir (ancak, ortadaki adam saldırı türleri tehdidi vardır). Kerberos veya NTLM kimlik doğrulaması da kullanılabilir.
Bağlanacağınız uzak bilgisayarlarda WinRM çalışıyor olmalıdır. WinRM hizmet durumunu kontrol edin:
Get-Service -Name "*WinRM*" | flHizmet çalışmıyorsa, başlatın:
Enable-PSRemotingWinRM has been updated to receive requests.
WinRM service started.
WinRM is already set up for remote management on this computer.
Bu komut, WinRM hizmetini başlatacak (ve otomatik olarak başlayacak şekilde ayarlayacak), varsayılan winrm ayarlarını belirleyecek ve Windows Güvenlik Duvarı'na istisna kuralları ekleyecektir. bu
Enable-PSRemoting -Forcekomutu, bir kullanıcıya sormadan WinRM'yi etkinleştirir.
Ardından, PowerShell Remoting'i kullanarak bilgisayara uzaktan bağlanabilirsiniz.
Ağ türünüz Genel olarak ayarlanmışsa PowerShell Remoting'in varsayılan olarak çalışmayacağını unutmayın. Sonra komut aşağıdaki hatayı döndürür:
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.Ağ konumunu Özel olarak değiştirmeli veya şu komutu kullanmalısınız:
Enable-PSRemoting -SkipNetworkProfileCheck.Ayrıca, genel ağlarda WinRM'ye erişime izin veren Windows Defender Güvenlik Duvarı kuralını da etkinleştirin. Güvenlik duvarı kuralını GPO veya PowerShell kullanarak etkinleştirebilirsiniz:
Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress AnyPowerShell Remoting aracılığıyla uzak bir bilgisayara bağlantıyı test etmek için aşağıdaki komutu çalıştırın:
Test-WsMan compname1Bir Active Directory etki alanınız yoksa veya bilgisayarlara IP adresleriyle PowerShell Remoting üzerinden erişiyorsanız, bu durumda kimlik doğrulama için NTLM protokolü kullanılır. NTLM kullanırken, Invoke-Command'ı çalıştırmayı denerseniz aşağıdaki hata görünür:
[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 kimlik doğrulamasının bağlanmak için kullandığınız bir bilgisayarda düzgün çalışmasını sağlamak için birkaç şey daha yapın: WinRM için bir SSL sertifikası verin veya ana bilgisayar adını/IP adresini güvenilir ana bilgisayarlar listesine ekleyin:
Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201Veya tüm bilgisayarlara bağlantıya izin verebilirsiniz (NTLM'nin dezavantajlarından biri olduğu için önerilmez - karşılıklı kimlik doğrulamayı desteklemez).
Set-Item wsman:\localhost\Client\TrustedHosts -value *Uzak ana bilgisayarlarda da aynı ayarlar uygulanmalıdır.
Güvenilir ana bilgisayarların listesini görüntülemek için şu komutu çalıştırın:
Get-Item WSMan:\localhost\Client\TrustedHostsDeğişiklikleri uygulamak için WinRM'yi yeniden başlatın:
Restart-Service WinRMGrup İlkelerini kullanarak da WinRM'yi etkinleştirebilir ve yapılandırabilirsiniz.
Invoke-Command Kullanarak PowerShell Komutlarını Uzaktan Nasıl Çalıştırırım?
Invoke-Command cmdlet'i, bir veya daha fazla uzak bilgisayarda komut çalıştırmaya izin verir.
Örneğin, uzak bir bilgisayarda tek bir komut çalıştırmak için aşağıdakileri kullanın:
Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}
Bu komut, uzak bilgisayarda yüklü olan PowerShell sürümünü görüntüler.
-ComputerNameparametre. Uzak bir bilgisayarda çalıştırılacak komutu girin
-ScriptBlock {[cmdlet]}engellemek.
Varsayılan olarak, Invoke-Command aracılığıyla gönderilen bir komut, uzak bir bilgisayarda geçerli kullanıcı olarak yürütülür. Başka bir kullanıcı olarak çalıştırmak istiyorsanız, kullanıcı kimlik bilgilerini isteyin ve bunları bir değişkene kaydedin:
$cred = Get-Credential
Invoke-Command -ComputerName dc01 -Credential $cred -ScriptBlock {Get-NetAdapter}Bu PowerShell komutu, uzak bilgisayardaki ağ arabirimlerinin listesini görüntüler:
ScriptBlock'a noktalı virgülle ayırarak birden fazla komut girebilirsiniz. Örneğin, aşağıdaki komut geçerli saat dilimini gösterecek ve başka bir saat dilimine değiştirecektir:
Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Central Europe Standard Time”}Invoke-Command, yalnızca bireysel komutları çalıştırmanıza değil, aynı zamanda PowerShell betiklerini çalıştırmanıza da olanak tanır. Bunu yapmak için -FilePath argümanı (-ScriptBlock yerine) kullanılır. Bu durumda, bilgisayarınızdaki yerel PS1 betik dosyasının yolunu belirtirsiniz (komut dosyası dosyasını hedef uzak bilgisayara kopyalamanız gerekmez):
Invoke-Command -ComputerName DC01 -FilePath C:\PS\Scripts\CheckSMBversion.ps1Komutları Birden Çok Bilgisayarda Aynı Anda Çalıştırmak için Invoke-Command Nasıl Kullanılır?
Komutları birden çok uzak bilgisayarda paralel olarak (aynı anda) çalıştırmak için Invoke-Command'ı kullanabilirsiniz.
En basit durumda, PowerShell komutlarının çalıştırılacağı bilgisayarların adları virgülle ayrılır:
Invoke-Command server1, server2, server3 -ScriptBlock {get-date}Bilgisayarların listesini bir değişkene (dizi) yerleştirebilirsiniz:
$servers = @("server1","server2","server3")
Invoke-Command -ScriptBlock { get-date} -ComputerName $serversVeya bir metin dosyasından alın:
Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName(Get-Content c:\ps\servers.txt)AD for PowerShell modülünden Get-ADComputer cmdlet'ini kullanarak AD'deki bilgisayarların bir listesini de alabilirsiniz:
Etki alanındaki tüm Windows Server ana bilgisayarlarında bir komut çalıştırmak için aşağıdaki PowerShell kodunu kullanın:
$computers = (Get-ADComputer -Filter 'OperatingSystem -like "*Windows server*" -and Enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -ScriptBlock {Get-Date} -ErrorAction SilentlyContinueBir bilgisayar kapatılırsa veya kullanılamıyorsa komut dosyası SilentlyContinue parametresi nedeniyle durmaz ve diğer bilgisayarlarda çalışmaya devam eder.
Bir sonucun hangi bilgisayardan geldiğini anlamak için PSComputerNamee ortam değişkenini kullanın.
$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTimeBirden fazla bilgisayarda Invoke-Command kullanarak bir komut çalıştırırken, aynı anda çalıştırılır. Invoke-Command, aynı anda yönetilecek maksimum bilgisayar sayısı konusunda bir kısıtlamaya sahiptir (sınırlı sayıda eşzamanlı PSSessions). Bu kısıtlama ThrottleLimit parametresinde ayarlanır (varsayılan değer 32'dir). 32'den fazla bilgisayarda (örneğin 128) bir komut çalıştırmak istiyorsanız, şunu kullanın:
-ThrottleLimit 128(ancak, bilgisayarınızın çok sayıda PSSession oluşturmak için daha fazla yükü olacaktır).
Arka planda Invoke-Command aracılığıyla uzak bilgisayarlarda komut çalıştırmak için özel bir özellik
-AsJobkullanıldı. Ardından komutun sonucu konsola döndürülmez. Sonuçları almak için bir İş Al cmdlet'i kullanın.








