Görkem

WFN Üye
Konular
1,788
Mesajlar
1,824
Çözüm
1
Ticaret Puanı
0
Üyelik
1 Yıl 7 Ay 9 Gün
Konum
Adıyaman
Web Sitesi
Yok
Alanı
Reklam Al-Sat
1/1
Konu sahibi
İ birden fazla Windows sunucusuna aynı PowerShell komutunu göndermek için 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öntemNe zaman kullanılır?Bağlantının davranışı
Invoke-Command -ComputerNameTek seferlik veya bağımsız komutlarKomut için geçici oturum açılır ve işlem sonunda kapanır
New-PSSession ve -SessionBirbirini izleyen komutlar ve paylaşılan değişkenlerOturum açık tutulur; sonraki komutlar aynı uzak bağlamda çalışır
Invoke-Command -AsJobUzun süren işlemleri yerel oturumdan ayrı başlatmaİş yerelde tutulur; sonuçlar daha sonra alınır
Kalıcı oturum örneği:

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.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic