- Konu sahibi
- #1
İ birden fazla Windows sunucusuna aynı PowerShell komutunu göndermek için
Çıktıda
PowerShell uzaktan çalıştırma, yerel bilgisayarın ve hedef Windows sunucularının uzaktan yönetim için yapılandırılmış olmasını gerektirir. Etki alanına bağlı ortamlarda bilgisayar adlarıyla bağlantı genellikle daha sorunsuz olur. Hedef sunucuda yönetici PowerShell'i açıp gerekirse şu komutu çalıştırın:
Bu işlem WinRM hizmetini, uzak PowerShell uç noktasını ve gerekli güvenlik duvarı kurallarını yapılandırır. Komutun çalıştırılabilmesi için hesabınızın hedefte gerekli yetkilere sahip olması ve ağ üzerinde ilgili WinRM bağlantısının engellenmemesi gerekir. Üretim ortamında bu yapılandırmayı tek tek sunucularda elle yapmak yerine Grup İlkesi veya kurumun merkezi yönetim yöntemiyle uygulamak daha uygun olabilir.
Önce tek bir sunucuyla bağlantıyı doğrulayın:
Başarılı bir sonuç, WinRM uç noktasına erişilebildiğini gösterir; ancak komutu çalıştıracağınız hesabın gerekli yetkilere sahip olduğunu tek başına kanıtlamaz.
Sunucu sayısı arttığında adları komut satırına yazmak yerine her satırda bir sunucu adı bulunan bir metin dosyası kullanabilirsiniz. Örneğin
Ardından listedeki tüm sunucularda aynı komutu çalıştırın:
Bu örnekte komut her sunucuda çalışır, sonuçlar
Kalıcı oturum örneği:
Sorgu komutlarıyla başlamak daha güvenlidir. Örneğin
Komut uzak sunucuda çalışır. Bu nedenle kod bloğu içindeki
IP adresiyle bağlantı kurarken bilgisayar adı kullanımından farklı kimlik doğrulama ve WinRM güven ayarları gerekebilir. Bu nedenle mümkünse etki alanındaki sunucu adlarını veya tam etki alanı adlarını kullanın. HTTPS, TrustedHosts ve kimlik doğrulama ayarlarını kurumunuzun güvenlik politikasına göre yapılandırmadan kimlik bilgilerini güvensiz bir biçimde komuta yazmayın.
Invoke-Command kullanılır. Sunucu adlarını -ComputerName parametresine virgülle verin; gerekiyorsa -Credential ile yetkili hesabı belirtin. Örneğin aşağıdaki komut, üç sunucuda Windows Time hizmetinin durumunu çalıştırır ve her sunucunun sonucunu yerel PowerShell oturumuna döndürür:
Kod:
$credential = Get-Credential
Invoke-Command `
-ComputerName 'SRV01', 'SRV02', 'SRV03' `
-Credential $credential `
-ScriptBlock {
Get-Service -Name W32Time
}
Çıktıda
Status, Name ve PSComputerName gibi alanlar görünür. PSComputerName, satırın hangi sunucudan geldiğini gösterir; böylece aynı komutun her hedefteki sonucunu birbirinden ayırabilirsiniz. Running hizmetin çalıştığını, Stopped ise hizmetin kurulu olduğu hâlde çalışmadığını gösterir. Bir sunucu için bağlantı veya yetki hatası almanız, diğer sunuculardaki komutun mutlaka başarısız olduğu anlamına gelmez; sonuçları sunucu adına göre ayrı değerlendirin.Çalıştırmadan önce uzak yönetimi hazırlayın
PowerShell uzaktan çalıştırma, yerel bilgisayarın ve hedef Windows sunucularının uzaktan yönetim için yapılandırılmış olmasını gerektirir. Etki alanına bağlı ortamlarda bilgisayar adlarıyla bağlantı genellikle daha sorunsuz olur. Hedef sunucuda yönetici PowerShell'i açıp gerekirse şu komutu çalıştırın:
Kod:
Enable-PSRemoting -Force
Bu işlem WinRM hizmetini, uzak PowerShell uç noktasını ve gerekli güvenlik duvarı kurallarını yapılandırır. Komutun çalıştırılabilmesi için hesabınızın hedefte gerekli yetkilere sahip olması ve ağ üzerinde ilgili WinRM bağlantısının engellenmemesi gerekir. Üretim ortamında bu yapılandırmayı tek tek sunucularda elle yapmak yerine Grup İlkesi veya kurumun merkezi yönetim yöntemiyle uygulamak daha uygun olabilir.
Önce tek bir sunucuyla bağlantıyı doğrulayın:
Kod:
Test-WSMan -ComputerName SRV01
Başarılı bir sonuç, WinRM uç noktasına erişilebildiğini gösterir; ancak komutu çalıştıracağınız hesabın gerekli yetkilere sahip olduğunu tek başına kanıtlamaz.
Access is denied alırsanız hesabı, kimlik bilgilerini ve hedefteki yetkilendirmeyi kontrol edin. Bağlantı kurulamazsa sunucu adının DNS ile çözümlendiğini, güvenlik duvarını ve WinRM yapılandırmasını inceleyin.Sunucu listesini dosyadan okuyarak komut çalıştırma
Sunucu sayısı arttığında adları komut satırına yazmak yerine her satırda bir sunucu adı bulunan bir metin dosyası kullanabilirsiniz. Örneğin
C:\Yonetim\sunucular.txt dosyası şu şekilde olabilir:
Kod:
SRV01
SRV02
SRV03
Ardından listedeki tüm sunucularda aynı komutu çalıştırın:
Kod:
$servers = Get-Content -Path 'C:\Yonetim\sunucular.txt'
$credential = Get-Credential
$results = Invoke-Command `
-ComputerName $servers `
-Credential $credential `
-ScriptBlock {
[PSCustomObject]@{
Sunucu = $env:COMPUTERNAME
PowerShell = $PSVersionTable.PSVersion.ToString()
SonKontrol = Get-Date
}
}
$results | Format-Table -AutoSize
$results | Export-Csv -Path 'C:\Yonetim\sonuclar.csv' -NoTypeInformation -Encoding UTF8
Bu örnekte komut her sunucuda çalışır, sonuçlar
$results değişkeninde toplanır ve ayrıca CSV dosyasına kaydedilir. CSV içindeki her satır bir sunucunun döndürdüğü sonucu temsil eder. Bir sunucu listede olduğu hâlde çıktı üretmiyorsa yalnızca tabloya bakmak yerine komutun hata çıktısını da inceleyin; isim çözümleme, bağlantı, kimlik doğrulama veya uzak uç nokta sorunu olabilir.Tek seferlik komut ile kalıcı oturum arasındaki fark
-ComputerName kullandığınızda PowerShell komut için geçici bir bağlantı açar ve işlem tamamlanınca kapatır. Tek bir sorgu veya birbirinden bağımsız birkaç işlem için bu yöntem yeterlidir. Aynı sunucuda birden fazla komut çalıştıracak ve komutlar arasında değişken, fonksiyon ya da işlem sonucu paylaşacaksanız New-PSSession ile kalıcı oturum oluşturun.| Yöntem | Ne zaman kullanılır? | Bağlantının davranışı |
|---|---|---|
| Invoke-Command -ComputerName | Tek seferlik veya bağımsız komutlar | Komut için geçici oturum açılır ve işlem sonunda kapanır |
| New-PSSession ve -Session | Birbirini izleyen komutlar ve paylaşılan değişkenler | Oturum açık tutulur; sonraki komutlar aynı uzak bağlamda çalışır |
| Invoke-Command -AsJob | Uzun süren işlemleri yerel oturumdan ayrı başlatma | İş yerelde tutulur; sonuçlar daha sonra alınır |
Kod:
$credential = Get-Credential
$sessions = New-PSSession `
-ComputerName 'SRV01', 'SRV02', 'SRV03' `
-Credential $credential
Invoke-Command -Session $sessions -ScriptBlock {
$service = Get-Service -Name W32Time
[PSCustomObject]@{
Sunucu = $env:COMPUTERNAME
Durum = $service.Status.ToString()
HizmetAdi = $service.Name
}
}
Remove-PSSession -Session $sessions
New-PSSession komutunda bazı sunucular oluşturulamazsa $sessions içinde yalnızca başarılı oturumlar bulunabilir. Hangi hedeflerin bağlanamadığını görmek için oturumların ComputerName ve State özelliklerini kontrol edin. İşiniz bittiğinde Remove-PSSession kullanmak açık bağlantıların gereksiz yere tutulmasını önler.Uzak sunucuda değişiklik yapan komutlarda dikkat edilecekler
Sorgu komutlarıyla başlamak daha güvenlidir. Örneğin
Get-Service, Get-Process veya Get-WinEvent ile hedef durumu gözlemleyebilirsiniz. Hizmet başlatma, dosya silme, kayıt defteri değiştirme veya yeniden başlatma gibi komutlar ise doğrudan değişiklik yapar; önce tek bir test sunucusunda çalıştırın, ardından listeyi genişletin.Komut uzak sunucuda çalışır. Bu nedenle kod bloğu içindeki
Get-Service, Restart-Service veya Set-ItemProperty gibi komutlar yerel bilgisayarı değil, her hedef sunucuyu etkiler. Yerel makinede önceden oluşturduğunuz değişkeni uzak komutta kullanacaksanız değeri açıkça parametre olarak gönderin; uzak oturum yerel oturumun değişkenlerini kendiliğinden paylaşmaz.IP adresiyle bağlantı kurarken bilgisayar adı kullanımından farklı kimlik doğrulama ve WinRM güven ayarları gerekebilir. Bu nedenle mümkünse etki alanındaki sunucu adlarını veya tam etki alanı adlarını kullanın. HTTPS, TrustedHosts ve kimlik doğrulama ayarlarını kurumunuzun güvenlik politikasına göre yapılandırmadan kimlik bilgilerini güvensiz bir biçimde komuta yazmayın.