PowerShell Invoke Komutu nasıl kullanılır?
Uzak bir bilgisayarda veya sunucuda PowerShell komutunu çalıştırmak istiyor musunuz? O zaman uzak masaüstü bağlantısı açmanıza gerek kalmaz çünkü bunun için yalnızca PowerShell Invoke Komutunu kullanabilirsiniz.
Invoke-Command, PowerShell komutlarını ve komut dosyalarını bir veya daha fazla uzak bilgisayarda çalıştırmanıza olanak tanır. sonuçları kendi konsolunuza yönlendirirken. Bu, onu uzaktaki cihazları hızlı bir şekilde yönetmek için harika bir cmdlet haline getirir.
Bu yazımızda Invoke-Command'ı kullanmak için neler gerektiğine ve cmdlet'in nasıl kullanılacağına bir göz atacağız.
Önkoşullar Çağırma Komutu
Invoke-Command'ı uzak bir sunucuda veya bilgisayarda kullanabilmemiz için önce Windows Uzaktan Yönetim hizmetinin çalıştığından emin olmamız gerekecek. Ayrıca ağınızda Windows güvenlik duvarı etkinse, güvenlik duvarının bağlantıyı engellemediğini kontrol etmemiz gerekir.
Uzak bir bilgisayarın Uzaktan Yönetim'i kabul edip etmediğini kontrol etmek için basit bir PowerShell komutu olan Test-WSMan'i kullanabiliriz.
Test-WSMan -Computername la-srv-dc01
Hedefe bağlanamadığınızı belirten bir hata alırsanız Windows Uzaktan Yönetim hizmeti çalışmıyor demektir. Bunu etkinleştirmek için uzak bilgisayardaki PowerShell cmdlet'ini Enable-PSRemoting kullanabiliriz:
Enable-PSRemotingBu komutun avantajı, yalnızca Uzaktan Yönetim hizmetlerini başlatmakla kalmayıp, aynı zamanda otomatik olarak başlayacak şekilde ayarlaması ve güvenlik duvarında gerekli istisna kuralını oluşturmasıdır.
Ancak daha da iyi bir seçenek, yeni bir Grup İlkesi Nesnesi (GPO) oluşturmaktır. Bu şekilde Uzaktan Yönetim hizmetini birden fazla bilgisayar veya sunucuda kolayca etkinleştirebilirsiniz.
İlke ayarını Bilgisayar Yapılandırması > Windows Ayarları > Güvenlik Ayarları > Sistem Hizmetleri'nde bulabilirsiniz.
Güvenlik duvarı kuralı
Windows Güvenlik Duvarı, Windows Uzaktan Yönetim bağlantısı da dahil olmak üzere tüm gelen bağlantıları engelleyecektir. Bu nedenle Invoke-Command'ı kullanmadan önce gelen bağlantıya izin vermemiz gerekecek.
Aynı GPO'yu gelen kuralını oluşturmak için de kullanabiliriz.
- Bilgisayar Yapılandırması > Windows Ayarları > Güvenlik Ayarları > Gelişmiş Güvenlik Özellikli Windows Defender Güvenlik Duvarı'na gidin
- Gelen Kuralları'nı sağ tıklayın ve Yeni Kural'ı seçin
- Önceden Tanımlanmış'ı seçin ve Windows Uzaktan Yönetimi'ni seçin
- Alan Adı, Özel profiline sahip kuralı seçin
- Bağlantıya izin ver'i seçin ve bitir'i tıklayın
GPUpdate komutunu kullanarak yeni politikaların sunucu/istemcide güncellendiğinden emin olun.
Invoke-Komutunu Kullanma
PowerShell'deki Invoke-Command, uzak bir bilgisayarda bir komut veya komut dosyası çalıştırmanıza olanak tanır. Uzak bir bilgisayarda birden fazla komut çalıştırmanız gerektiğinde New-PSSession cmdlet'ini kullanmak daha iyidir.
Invoke-Command'ın yapısı oldukça basittir ancak yine de kullanabileceğimiz pek çok seçenek (parametre) vardır:
- ComputerName
Komutun çalıştırılacağı bilgisayar adı veya IP Adresi. Birden fazla bilgisayar için adları virgülle
,ile ayırın.- Credential
Uzak bilgisayara bağlanmak için kimlik bilgileri
- FilePath
Uzak bilgisayar(lar)da çalıştırılacak yerel komut dosyasının yolunu belirtir
- AsJob
Uzak komutu yerel bilgisayarda arka plan işi olarak çalıştırın
- InDisconnectedSession
Uzak bilgisayardaki bağlantısı kesilmiş bir oturumda komutu çalıştırmak için kullanılır
- ScriptBlock
Çalıştırılacak komut dosyası veya komut
- ArgumentList
Argümanları komut dosyası bloğundaki cmdlet'e iletmek için kullanılır
Yani uzaktaki bir bilgisayarda bir PowerShell komutunu çalıştırmak için yalnızca uzak bilgisayarın adını ve bir komut dosyası bloğu içinde çalıştırmak istediğimiz komutu belirtmemiz gerekir. Örneğin, bilgisayar bilgilerini etki alanı denetleyicisinden almak için şunları yapabiliriz:
Invoke-Command -ComputerName la-srv-dc01 {Get-ComputerInfo}
Bu, etki alanı denetleyicisinde (la-srv-dc01) Get-ComputerInfo komutunu çalıştıracak ve sonuçları konsola döndürecektir.
Bir Komut Dosyasını Çalıştırma
Yukarıdaki örnekte yalnızca basit bir PowerShell cmdlet'ini çalıştırıyoruz. Ancak komut dosyalarının tamamını uzaktaki bilgisayarda da çalıştırabiliriz. Betiği sadece scriptblock parametresinin içine yazabilirsiniz, ancak betiği bir değişkende saklamak veya bir dosya kullanmak daha kolaydır.
Aşağıdaki örnek gayet iyi çalışıyor ancak bu şekilde okunması biraz daha zor:
Invoke-Command -ComputerName la-srv-dc01 -ScriptBlock {Get-CimInstance Win32_LogicalDisk | Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}}Daha iyi bir seçenek önce betiği bir değişkenin içinde saklamak olacaktır. Daha sonra değişkeni basitçe scriptblock'a aktarabiliriz:
$script = {
Get-CimInstance Win32_LogicalDisk |
Select-Object DeviceID, MediaType, @{Name="FreeSpace (GB)"; Expression={"{0:N2}" -f ($_.FreeSpace / 1GB)}}
}
Invoke-Command -ComputerName la-srv-dc01 -ScriptBlock $scriptÜçüncü seçenek, betiği yerel bilgisayarınızda depolamak ve betiğe -FilePath parametresini kullanarak başvurmaktır:
Invoke-Command -ComputerName la-srv-dc01 -FilePath c:\test\diskInfo.ps1Birden Fazla Bilgisayarda Çalıştır
PowerShell'deki Invoke-Command cmdlet'inin en büyük avantajlarından biri de aynı anda birden fazla bilgisayarda çalıştırabilmenizdir. Bunu yapmak için birkaç seçenek vardır; bilgisayar adlarını virgülle ayırarak belirtmeniz yeterlidir:
Invoke-Command -ComputerName la-srv-dc01, la-srv-app01, la-srv-file01 -FilePath c:\test\diskInfo.ps1Bunu yazmanın başka bir seçeneği de hashtable ve splatting kullanmaktır. Parametreleri sıralamak, çok sayıda özellik eklemeniz gerektiğinde betiğinizin okunmasını kolaylaştıracaktır.
$parameters = @{
ComputerName = 'la-srv-dc01', 'la-srv-app01', 'la-srv-file01', 'la-win11-lab03'
ScriptBlock = { Get-ComputerInfo }
}
Invoke-Command @parameters
Bir komutu birçok bilgisayarda (örneğin yüz veya daha fazla) çalıştırmanız gerektiğinde, yerel bilgisayarınızdaki yükü en aza indirmek istersiniz. Bunun için InDisconnectedSession parametresini kullanabiliriz.
Invoke-Command cmdlet'ini normal şekilde çalıştırırsanız, yerel bilgisayarınız uzaktaki bilgisayara bağlanacak, betiği başlatacak, sonuçları bekleyecek ve bağlantıyı kesecektir. Bekleyen parçalar, özellikle 100 veya daha fazla bilgisayara bağlanırken, yerel bilgisayarınızdan en fazla zamanı ve kaynağı tüketir.
InDisconnectedSession parametresiyle cmdlet yalnızca uzaktaki bilgisayara bağlanacak, betiği başlatacak ve ardından bağlantıyı kesecektir. Bu, tüm işlem süresini önemli ölçüde azaltır.
$parameters = @{
ComputerName = (Get-Content -Path C:\Test\Servers.txt)
InDisconnectedSession = $true
FilePath = '\\lazyadmin\scripts\InstallWinUpdates.ps1'
}
Invoke-Command @parametersKimlik Bilgilerini Kullanma
PowerShell komutlarını çalıştırmak için uzak bilgisayarda izne sahip olmanız gerekir. Komutu bir sunucuda çalıştırdığınızda muhtemelen yerel iş istasyonunuzdan doğru izne sahip olmayacaksınız.
Bunu çözmek için -Credentials parametresini kullanabiliriz. Burada komutu çalıştırmak için kullanmak istediğiniz kullanıcı hesabını girebilirsiniz. Invoke-Command cmdlet'ini -Credential parametresiyle çalıştırdığınızda PowerShell sizden parolayı isteyecektir:
Invoke-Command -ComputerName la-srv-dc01 -Credential lazyadmin\administrator -Scriptblock {Get-ComputerInfo}Çoğu PowerShell cmdlet'inde olduğu gibi, -Credential cmdlet'ine de bir kimlik bilgisi nesnesi iletebilirsiniz. Bu yöntem özellikle birden fazla komut çalıştırmak istediğinizde veya farklı uzak bilgisayarlarda farklı komutlar çalıştırmanız gerektiğinde kullanışlıdır:
$cred = Get-Credential
Invoke-Command -ComputerName la-srv-dc01 -Credential $cred -Scriptblock {Get-ComputerInfo}Yerel Değişkenleri Dahil Et
Betik bloğunun içindeki değişkenleri kullanmak beklediğinizden biraz farklı olur. Aşağıdaki basitleştirilmiş örneği ele alalım; uzak bilgisayardaki belirli bir yoldan tüm dosyaları almak istiyoruz. Bu durumda yolu bir değişkenin içinde sakladık:
$path = "c:\test"
Invoke-Command -ComputerName la-srv-dc01 -Scriptblock {Get-Childitem -Path $path}Yukarıdaki örnek işe yaramayacak. Uzak bilgisayar (bu durumda la-srv-dc01), $path değişkeninin ne olduğunu bilmediğinden herhangi bir sonuç döndürmez.
Değişken yolunu komut dosyası bloğuna geçirmek için Kullanma kapsam değiştiricisini kullanmamız gerekecek. Kullanma kapsamı, değişkenin uzak oturumda değil yerel oturumda oluşturulduğunu belirtir. Yani $path değişkenini uzak oturuma aktarmak için yapmamız gereken:
$path = "c:\test"
Invoke-Command -ComputerName la-srv-dc01 -Scriptblock {Get-Chiditem -Path $Using:path}Kapanış
PowerShell Invoke-Command, uzak bilgisayarları yönetmek için harika bir araçtır. Uzak masaüstünü açmanıza gerek kalmadan bir komutu hızlı bir şekilde yürütmenize olanak tanır. Özellikle komutu aynı anda birden fazla bilgisayarda çalıştırmanız gerektiğinde.
New-PSSession cmdlet'ine de baktığınızdan emin olun; uzak bir bilgisayarda birden fazla komut çalıştırmanız gerektiğinde bu gerçekten daha iyi bir seçenektir.
Umarım bu makaleyi faydalı bulmuşsunuzdur, herhangi bir sorunuz varsa aşağıya yorum bırakmanız yeterli.


