8. Bölüm - PowerShell uzaktan iletişim
PowerShell'in uzak bilgisayarlarda komut çalıştırmanın birçok farklı yolu vardır. Son bölümde CIM cmdlet'lerini kullanarak WMI'yi uzaktan sorgulamayı gördünüz. PowerShell ayrıca yerleşik ComputerName parametresine sahip çeşitli cmdlet'ler içerir.
Aşağıdaki örnekte gösterildiği gibi, Get-Command
ComputerName parametresi olan komutları belirlemek için ParameterName parametresiyle birlikte kullanılabilir.
Get-Command -ParameterName ComputerName
CommandType Name Version Source
----------- ---- ------- ------
Cmdlet Add-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Clear-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Connect-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Enter-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Get-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Get-HotFix 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Get-Process 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Get-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Get-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Get-WmiObject 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Invoke-Command 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Invoke-WmiMethod 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Limit-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet New-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet New-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Receive-Job 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Receive-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Register-WmiEvent 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Remove-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Remove-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Remove-PSSession 3.0.0.0 Microsoft.PowerShell.Core
Cmdlet Remove-WmiObject 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Rename-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Restart-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Send-MailMessage 3.1.0.0 Microsoft.PowerShell.Utility
Cmdlet Set-Service 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Set-WmiInstance 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Show-EventLog 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Stop-Computer 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Test-Connection 3.1.0.0 Microsoft.PowerShell.Management
Cmdlet Write-EventLog 3.1.0.0 Microsoft.PowerShell.Management
ve gibi Get-Process
Get-Hotfix
komutların ComputerName parametresi vardır. Bu, Microsoft'un uzak bilgisayarlarda komut çalıştırmaya yönelik uzun vadeli yönü değildir. ComputerName parametresine sahip bir komut bulsanız bile, alternatif kimlik bilgileri belirtmeniz gerekecektir ve bir Credential parametresi yoktur. PowerShell'i yükseltilmiş bir hesaptan çalıştırmaya karar verirseniz, uzak bilgisayarla aranızdaki bir güvenlik duvarı isteği engelleyebilir.
Bu bölümde gösterildiği gibi PowerShell uzaktan iletişim komutlarını kullanmak için uzak bilgisayarda PowerShell uzaktan iletişiminin etkinleştirilmesi gerekir. PowerShell uzaktan iletişimini Enable-PSRemoting
etkinleştirmek için cmdlet'ini kullanın.
Enable-PSRemoting
WinRM has been updated to receive requests.
WinRM service type changed successfully.
WinRM service started.
WinRM has been updated for remote management.
WinRM firewall exception enabled.
Bire Bir Uzaktan İletişim
Uzak oturumunuzun etkileşimli olmasını istiyorsanız, istediğiniz bire bir uzaktan iletişimdir.
Bu tür uzaktan iletişim cmdlet'i Enter-PSSession
aracılığıyla sağlanır.
Son bölümde etki alanı yöneticisi kimlik bilgilerimi adlı $Cred
bir değişkende depoladım. Henüz yapmadıysanız, devam edin ve etki alanı yöneticisi kimlik bilgilerinizi değişkende $Cred
depolayın.
Bu, geçerli PowerShell oturumunuz etkin olduğu sürece kimlik bilgilerini bir kez girmenize ve komut başına kullanmanıza olanak tanır.
$Cred = Get-Credential
dc01 adlı etki alanı denetleyicisine bire bir PowerShell uzaktan iletişim oturumu oluşturun.
Enter-PSSession -ComputerName dc01 -Credential $Cred
[dc01]: PS C:\Users\Administrator\Documents>
Önceki örnekte PowerShell isteminin önünde [dc01]
olduğuna dikkat edin. Bu, dc01 adlı uzak bilgisayarda etkileşimli bir PowerShell oturumunda olduğunuz anlamına gelir. Yürüttüğünüz tüm komutlar yerel bilgisayarınızda değil dc01 üzerinde çalışır. Ayrıca, yerel bilgisayarınızdaki komutlara değil, yalnızca uzak bilgisayarda bulunan PowerShell komutlarına erişiminizin olduğunu unutmayın. Başka bir deyişle, bilgisayarınıza ek modüller yüklediyseniz, uzak bilgisayarda bunlara erişilemez.
Bire bir etkileşimli PowerShell uzaktan iletişim oturumu aracılığıyla uzak bir bilgisayara bağlandığınızda, uzak bilgisayarda etkili bir şekilde oturuyor olursunuz. Nesneler, bu kitabın tamamında üzerinde çalıştığınız nesneler gibi normal nesnelerdir.
[dc01]: Get-Process | Get-Member
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
Handles AliasProperty Handles = Handlecount
Name AliasProperty Name = ProcessName
NPM AliasProperty NPM = NonpagedSystemMemorySize64
PM AliasProperty PM = PagedMemorySize64
SI AliasProperty SI = SessionId
VM AliasProperty VM = VirtualMemorySize64
WS AliasProperty WS = WorkingSet64
Disposed Event System.EventHandler Disposed(System.Object, ...
ErrorDataReceived Event System.Diagnostics.DataReceivedEventHandler ...
Exited Event System.EventHandler Exited(System.Object, Sy...
OutputDataReceived Event System.Diagnostics.DataReceivedEventHandler ...
BeginErrorReadLine Method void BeginErrorReadLine()
BeginOutputReadLine Method void BeginOutputReadLine()
CancelErrorRead Method void CancelErrorRead()
CancelOutputRead Method void CancelOutputRead()
Close Method void Close()
CloseMainWindow Method bool CloseMainWindow()
CreateObjRef Method System.Runtime.Remoting.ObjRef CreateObjRef(...
Dispose Method void Dispose(), void IDisposable.Dispose()
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetLifetimeService Method System.Object GetLifetimeService()
GetType Method type GetType()
InitializeLifetimeService Method System.Object InitializeLifetimeService()
Kill Method void Kill()
Refresh Method void Refresh()
Start Method bool Start()
ToString Method string ToString()
WaitForExit Method bool WaitForExit(int milliseconds), void Wai...
WaitForInputIdle Method bool WaitForInputIdle(int milliseconds), boo...
__NounName NoteProperty string __NounName=Process
BasePriority Property int BasePriority {get;}
Container Property System.ComponentModel.IContainer Container {...
EnableRaisingEvents Property bool EnableRaisingEvents {get;set;}
ExitCode Property int ExitCode {get;}
ExitTime Property datetime ExitTime {get;}
Handle Property System.IntPtr Handle {get;}
HandleCount Property int HandleCount {get;}
HasExited Property bool HasExited {get;}
Id Property int Id {get;}
MachineName Property string MachineName {get;}
MainModule Property System.Diagnostics.ProcessModule MainModule ...
MainWindowHandle Property System.IntPtr MainWindowHandle {get;}
MainWindowTitle Property string MainWindowTitle {get;}
MaxWorkingSet Property System.IntPtr MaxWorkingSet {get;set;}
MinWorkingSet Property System.IntPtr MinWorkingSet {get;set;}
Modules Property System.Diagnostics.ProcessModuleCollection M...
NonpagedSystemMemorySize Property int NonpagedSystemMemorySize {get;}
NonpagedSystemMemorySize64 Property long NonpagedSystemMemorySize64 {get;}
PagedMemorySize Property int PagedMemorySize {get;}
PagedMemorySize64 Property long PagedMemorySize64 {get;}
PagedSystemMemorySize Property int PagedSystemMemorySize {get;}
PagedSystemMemorySize64 Property long PagedSystemMemorySize64 {get;}
PeakPagedMemorySize Property int PeakPagedMemorySize {get;}
PeakPagedMemorySize64 Property long PeakPagedMemorySize64 {get;}
PeakVirtualMemorySize Property int PeakVirtualMemorySize {get;}
PeakVirtualMemorySize64 Property long PeakVirtualMemorySize64 {get;}
PeakWorkingSet Property int PeakWorkingSet {get;}
PeakWorkingSet64 Property long PeakWorkingSet64 {get;}
PriorityBoostEnabled Property bool PriorityBoostEnabled {get;set;}
PriorityClass Property System.Diagnostics.ProcessPriorityClass Prio...
PrivateMemorySize Property int PrivateMemorySize {get;}
PrivateMemorySize64 Property long PrivateMemorySize64 {get;}
PrivilegedProcessorTime Property timespan PrivilegedProcessorTime {get;}
ProcessName Property string ProcessName {get;}
ProcessorAffinity Property System.IntPtr ProcessorAffinity {get;set;}
Responding Property bool Responding {get;}
SafeHandle Property Microsoft.Win32.SafeHandles.SafeProcessHandl...
SessionId Property int SessionId {get;}
Site Property System.ComponentModel.ISite Site {get;set;}
StandardError Property System.IO.StreamReader StandardError {get;}
StandardInput Property System.IO.StreamWriter StandardInput {get;}
StandardOutput Property System.IO.StreamReader StandardOutput {get;}
StartInfo Property System.Diagnostics.ProcessStartInfo StartInf...
StartTime Property datetime StartTime {get;}
SynchronizingObject Property System.ComponentModel.ISynchronizeInvoke Syn...
Threads Property System.Diagnostics.ProcessThreadCollection T...
TotalProcessorTime Property timespan TotalProcessorTime {get;}
UserProcessorTime Property timespan UserProcessorTime {get;}
VirtualMemorySize Property int VirtualMemorySize {get;}
VirtualMemorySize64 Property long VirtualMemorySize64 {get;}
WorkingSet Property int WorkingSet {get;}
WorkingSet64 Property long WorkingSet64 {get;}
PSConfiguration PropertySet PSConfiguration {Name, Id, PriorityClass, Fi...
PSResources PropertySet PSResources {Name, Id, Handlecount, WorkingS...
Company ScriptProperty System.Object Company {get=$this.Mainmodule....
CPU ScriptProperty System.Object CPU {get=$this.TotalProcessorT...
Description ScriptProperty System.Object Description {get=$this.Mainmod...
FileVersion ScriptProperty System.Object FileVersion {get=$this.Mainmod...
Path ScriptProperty System.Object Path {get=$this.Mainmodule.Fil...
Product ScriptProperty System.Object Product {get=$this.Mainmodule....
ProductVersion ScriptProperty System.Object ProductVersion {get=$this.Main...
[dc01]:
Uzak bilgisayarla çalışmayı bitirdiğinizde, cmdlet'ini kullanarak bire bir uzaktan iletişim oturumundan Exit-PSSession
çıkın.
[dc01]: Exit-PSSession
Bire Çok Uzaktan İletişim
Bazen uzak bir bilgisayarda etkileşimli olarak bir görev gerçekleştirmeniz gerekebilir. Ancak uzaktan iletişim, birden çok uzak bilgisayarda aynı anda bir görev gerçekleştirirken çok daha güçlüdür. Cmdlet'ini Invoke-Command
kullanarak aynı anda bir veya daha fazla uzak bilgisayarda komut çalıştırın.
Invoke-Command -ComputerName dc01, sql02, web01 {Get-Service -Name W32time} -Credential $Cred
Status Name DisplayName PSComputerName
------ ---- ----------- --------------
Running W32time Windows Time web01
Start... W32time Windows Time dc01
Running W32time Windows Time sql02
Önceki örnekte, Windows Saat hizmetinin durumu için üç sunucu sorgulandı. cmdlet'i Get-Service
betik bloğunun Invoke-Command
içine yerleştirildi. Get-Service
aslında uzak bilgisayarda çalışır ve sonuçlar yerel bilgisayarınıza seri durumdan çıkarılmış nesneler olarak döndürülür.
Önceki komutu kullanarak Get-Member
sonuçların gerçekten seri durumdan çıkarılmış nesneler olduğunu gösterir.
Invoke-Command -ComputerName dc01, sql02, web01 {Get-Service -Name W32time} -Credential $Cred | Get-Member
TypeName: Deserialized.System.ServiceProcess.ServiceController
Name MemberType Definition
---- ---------- ----------
GetType Method type GetType()
ToString Method string ToString(), string ToString(string format, Sys...
Name NoteProperty string Name=W32time
PSComputerName NoteProperty string PSComputerName=sql02
PSShowComputerName NoteProperty bool PSShowComputerName=True
RequiredServices NoteProperty Deserialized.System.ServiceProcess.ServiceController[...
RunspaceId NoteProperty guid RunspaceId=570313c4-ac84-4109-bf67-c6b33236af0a
CanPauseAndContinue Property System.Boolean {get;set;}
CanShutdown Property System.Boolean {get;set;}
CanStop Property System.Boolean {get;set;}
Container Property {get;set;}
DependentServices Property Deserialized.System.ServiceProcess.ServiceController[...
DisplayName Property System.String {get;set;}
MachineName Property System.String {get;set;}
ServiceHandle Property System.String {get;set;}
ServiceName Property System.String {get;set;}
ServicesDependedOn Property Deserialized.System.ServiceProcess.ServiceController[...
ServiceType Property System.String {get;set;}
Site Property {get;set;}
StartType Property System.String {get;set;}
Status Property System.String {get;set;}
Seri durumdan çıkarılmış nesnelerde yöntemlerin çoğunluğunun eksik olduğuna dikkat edin. Bu, canlı nesneler olmadığı anlamına gelir; Onlar atıl durumda. Komutun uzak bilgisayarda çalıştırıldığı noktadaki nesnenin durumunun anlık görüntüsü olduğundan, seri durumdan çıkarılmış bir nesne kullanarak hizmeti başlatamaz veya durduramazsınız.
Bu, ile bir yöntemi Invoke-Command
kullanarak bir hizmeti başlatamayabileceğiniz veya durdurabileceğiniz anlamına gelmez. Yalnızca yöntemin uzak oturumda çağrılmak zorunda olduğu anlamına gelir.
Bu noktayı kanıtlamak için Stop() yöntemini kullanarak bu uzak sunucuların üçünde de Windows Saat hizmetini durduracağım.
Invoke-Command -ComputerName dc01, sql02, web01 {(Get-Service -Name W32time).Stop()} -Credential $Cred
Invoke-Command -ComputerName dc01, sql02, web01 {Get-Service -Name W32time} -Credential $Cred
Status Name DisplayName PSComputerName
------ ---- ----------- --------------
Stopped W32time Windows Time web01
Stopped W32time Windows Time dc01
Stopped W32time Windows Time sql02
Önceki bir bölümde belirtildiği gibi, bir görevi gerçekleştirmek için bir cmdlet varsa, bir yöntem kullanmak yerine bunu kullanmanızı öneririm. Önceki senaryoda, durdurma yöntemi yerine cmdlet'ini kullanmanızı Stop-Service
öneririz. Birçok kişi PowerShell uzaktan iletişimini kullanırken yöntemlerin çağrılamadığı yanlış algılandığından, bir noktayı kanıtlamak için Stop() yöntemini kullanmayı seçtim. Seri durumdan çıkarıldığı için döndürülen nesnede çağrılamıyorlar, ancak uzak oturumun kendisinde çağrılabilirler.
PowerShell Oturumları
Önceki bölümdeki son örnekte cmdlet'ini Invoke-Command
kullanarak iki komut çalıştırdım.
Bu, bu iki komutu çalıştırmak için iki ayrı oturumun ayarlanması ve yıkılması gerektiğini gösterir.
Bölüm 7'de açıklanan CIM oturumlarına benzer şekilde, uzak bilgisayara yönelik powershell oturumu, her bir komut için yeni bir oturum yükü olmadan uzak bilgisayarda birden çok komut çalıştırmak için kullanılabilir.
Bu bölümde üzerinde çalıştığımız dc01, SQL02 ve WEB01 adlı üç bilgisayarın her biri için bir PowerShell oturumu oluşturun.
$Session = New-PSSession -ComputerName dc01, sql02, web01 -Credential $Cred
Şimdi bir yöntem kullanarak Windows Saat hizmetini başlatmak ve hizmetin durumunu denetlemek için adlı $Session
değişkeni kullanın.
Invoke-Command -Session $Session {(Get-Service -Name W32time).Start()}
Invoke-Command -Session $Session {Get-Service -Name W32time}
Status Name DisplayName PSComputerName
------ ---- ----------- --------------
Running W32time Windows Time web01
Start... W32time Windows Time dc01
Running W32time Windows Time sql02
Oturum alternatif kimlik bilgileri kullanılarak oluşturulduktan sonra, bir komut her çalıştırıldığında kimlik bilgilerinin belirtilmesi artık gerekli değildir.
Oturumları kullanmayı bitirdiğinizde bunları kaldırdığınızdan emin olun.
Get-PSSession | Remove-PSSession
Özet
Bu bölümde PowerShell uzaktan iletişimini, komutları tek bir uzak bilgisayarla etkileşimli bir oturumda çalıştırmayı ve bire çok uzaktan iletişim kullanarak birden çok bilgisayarda komut çalıştırmayı öğrendiniz. Aynı uzak bilgisayarda birden çok komut çalıştırırken PowerShell oturumu kullanmanın avantajlarını da öğrendiniz.
İnceleyin
- PowerShell uzaktan iletişimini nasıl etkinleştirebilirsiniz?
- Uzak bir bilgisayarla etkileşimli oturum başlatmak için PowerShell komutu nedir?
- PowerShell uzaktan iletişim oturumu kullanmanın, yalnızca her komutla bilgisayar adını belirtmenin avantajı nedir?
- PowerShell uzaktan iletişim oturumu bire bir uzaktan iletişim oturumuyla kullanılabilir mi?
- Cmdlet'ler tarafından döndürülen nesnelerin türü ile
Invoke-Command
uzak bilgisayarlarda aynı cmdlet'leri çalıştırırken döndürülenlerle arasındaki fark nedir?
Okuma Önerileri
PowerShell