Computer >> Máy Tính >  >> Hệ thống >> máy chủ Windows

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Lệnh gọi lệnh ghép ngắn để chạy các lệnh hoặc tập lệnh PowerShell từ xa. Bạn có thể sử dụng PowerShell để chạy lệnh từ xa trên một hoặc nhiều máy tính trong mạng của mình. Lệnh ghép ngắn Invoke-Command đang sử dụng các tính năng quản lý từ xa từ PowerShell Remoting . PowerShell Remoting cho phép bạn kết nối từ xa với các phiên PowerShell trên máy tính thông qua WinRM Dịch vụ (Quản lý từ xa của Windows) và Dịch vụ web để quản lý (WS-Management) giao thức. Dịch vụ này cung cấp khả năng thiết lập các phiên PowerShell từ xa và chạy mã của bạn.

Định cấu hình WinRM cho PowerShell Remoting

PowerShell Remoting sử dụng HTTP (Cổng TCP / 5985) hoặc HTTPS (Cổng TCP / 5986) để giao tiếp giữa các máy tính. Theo mặc định, giao thức HTTP được sử dụng, nhưng ngay cả lưu lượng truy cập này cũng được mã hóa bằng AES-56 (tuy nhiên, có mối đe dọa từ các kiểu tấn công trung gian). Xác thực Kerberos hoặc NTLM cũng có thể được sử dụng.

WinRM phải đang chạy trên các máy tính từ xa mà bạn định kết nối. Kiểm tra trạng thái dịch vụ WinRM:

Get-Service -Name "*WinRM*" | fl

Nếu dịch vụ không chạy, hãy khởi động nó:

Enable-PSRemoting

WinRM has been updated to receive requests.
WinRM service started.
WinRM is already set up for remote management on this computer.

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Lệnh này sẽ khởi động dịch vụ WinRM (và đặt nó tự động khởi động), đặt cài đặt winrm mặc định và thêm các quy tắc ngoại lệ vào Tường lửa của Windows. Enable-PSRemoting –Force lệnh bật WinRM mà không cần nhắc người dùng.

Sau đó, bạn có thể kết nối với máy tính từ xa bằng PowerShell Remoting.

Lưu ý rằng PowerShell Remoting sẽ không hoạt động theo mặc định nếu loại mạng của bạn được đặt thành Công khai . Sau đó, lệnh trả về lỗi sau:

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.

Bạn phải thay đổi vị trí mạng thành Riêng tư hoặc sử dụng lệnh này:

Enable-PSRemoting –SkipNetworkProfileCheck.

Đồng thời kích hoạt quy tắc Tường lửa của Bộ bảo vệ Windows cho phép truy cập WinRM trong các mạng công cộng. Bạn có thể bật quy tắc tường lửa bằng GPO hoặc PowerShell:

Set-NetFirewallRule -Name 'WINRM-HTTP-In-TCP' -RemoteAddress Any

Để kiểm tra kết nối với máy tính từ xa qua PowerShell Remoting, hãy chạy lệnh sau:

Test-WsMan compname1

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Nếu bạn không có miền Active Directory hoặc bạn truy cập máy tính qua PowerShell Remoting bằng địa chỉ IP, trong trường hợp này, giao thức NTLM được sử dụng để xác thực. Khi sử dụng NTLM, lỗi sau sẽ xuất hiện nếu bạn cố gắng chạy Lệnh gọi:

[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

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Để xác thực NTLM hoạt động chính xác trên máy tính bạn đang sử dụng để kết nối, hãy thực hiện thêm một số việc:cấp chứng chỉ SSL cho WinRM hoặc thêm tên máy chủ / địa chỉ IP vào danh sách máy chủ đáng tin cậy:

Set-Item wsman:\localhost\Client\TrustedHosts -value 192.168.1.201

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Hoặc bạn có thể cho phép kết nối với tất cả các máy tính (không nên vì đây là một trong những nhược điểm của NTLM - nó không hỗ trợ xác thực lẫn nhau).

Set-Item wsman:\localhost\Client\TrustedHosts -value *

Các cài đặt tương tự phải được áp dụng trên máy chủ từ xa.

Để hiển thị danh sách các máy chủ đáng tin cậy, hãy chạy lệnh:

Get-Item WSMan:\localhost\Client\TrustedHosts

Để áp dụng các thay đổi, hãy khởi động lại WinRM:

Restart-Service WinRM

Bạn cũng có thể bật và định cấu hình WinRM bằng Chính sách Nhóm.

Cách chạy lệnh PowerShell từ xa bằng lệnh gọi?

Lệnh ghép ngắn Invoke-Command cho phép chạy một lệnh trên một hoặc nhiều máy tính từ xa.

Ví dụ:để chạy một lệnh trên máy tính từ xa, hãy sử dụng như sau:

Invoke-Command -ComputerName dc01 -ScriptBlock {$PSVersionTable.PSVersion}

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Lệnh này sẽ hiển thị phiên bản PowerShell được cài đặt trên máy tính từ xa, tên được chỉ định trong -ComputerName tham số. Nhập lệnh để chạy trên máy tính từ xa trong -ScriptBlock {[cmdlet]} khối.

Theo mặc định, một lệnh được gửi qua Invoke-Command được thực thi với tư cách là người dùng hiện tại trên máy tính từ xa. Nếu bạn muốn chạy nó với tư cách người dùng khác, hãy yêu cầu thông tin đăng nhập của người dùng và lưu chúng vào một biến:

$cred = Get-Credential
Invoke-Command -ComputerName dc01 -Credential $cred -ScriptBlock {Get-NetAdapter}

Lệnh PowerShell này hiển thị danh sách các giao diện mạng trên máy tính từ xa:

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Bạn có thể nhập nhiều lệnh trong ScriptBlock, được phân tách bằng dấu chấm phẩy. Ví dụ:lệnh sau sẽ hiển thị múi giờ hiện tại và thay đổi nó thành múi giờ khác:

Invoke-Command -Computername dc01 -ScriptBlock {Get-TimeZone| select DisplayName;Set-TimeZone -Name "Central Europe Standard Time”}

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Invoke-Command cho phép bạn chạy không chỉ các lệnh riêng lẻ mà còn chạy các tập lệnh PowerShell. Để làm điều đó, đối số -FilePath (thay vì –ScriptBlock) được sử dụng. Trong trường hợp này, bạn chỉ định đường dẫn đến tệp tập lệnh PS1 cục bộ trên máy tính của mình (bạn không cần sao chép tệp tập lệnh vào máy tính từ xa đích):

Invoke-Command -ComputerName DC01 -FilePath C:\PS\Scripts\CheckSMBversion.ps1

Cách sử dụng lệnh gọi để chạy lệnh trên nhiều máy tính cùng lúc?

Bạn có thể sử dụng Lệnh gọi để chạy các lệnh trên nhiều máy tính từ xa song song (đồng thời).

Trong trường hợp đơn giản nhất, tên của máy tính chạy lệnh PowerShell được phân tách bằng dấu phẩy:

Invoke-Command server1, server2, server3 -ScriptBlock {get-date}

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Bạn có thể đặt danh sách máy tính vào một biến (mảng):

$servers = @("server1","server2","server3")
Invoke-Command -ScriptBlock { get-date} -ComputerName $servers

Hoặc lấy từ tệp văn bản:

Invoke-Command -ScriptBlock {Restart-Service spooler} -ComputerName(Get-Content c:\ps\servers.txt)

Bạn cũng có thể lấy danh sách các máy tính trong AD bằng lệnh ghép ngắn Get-ADComputer từ AD cho mô-đun PowerShell:

Để chạy lệnh trong tất cả các máy chủ Windows Server trong miền, hãy sử dụng mã PowerShell sau:

$computers = (Get-ADComputer -Filter 'OperatingSystem -like "*Windows server*" -and Enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -ScriptBlock {Get-Date} -ErrorAction SilentlyContinue

Nếu một máy tính bị tắt hoặc không khả dụng, tập lệnh sẽ không dừng do tham số SilentlyContinue và sẽ tiếp tục chạy trên các máy tính khác.

Để hiểu kết quả đến từ máy tính nào, hãy sử dụng biến môi trường PSComputerNamee.

$results = Invoke-Command server1, server2, server3 -ScriptBlock {get-date}
$results | Select-Object PSComputerName, DateTime

Sử dụng PowerShell Invoke-Command để chạy tập lệnh trên máy tính từ xa

Khi chạy một lệnh bằng Invoke-Command trên nhiều máy tính, nó sẽ được chạy đồng thời. Invoke-Command có giới hạn về số lượng máy tính tối đa được quản lý cùng một lúc (một số lượng giới hạn của PSSessions đồng thời). Hạn chế này được đặt trong ThrottleLimit tham số (giá trị mặc định là 32). Nếu bạn muốn chạy một lệnh trên hơn 32 máy tính (ví dụ:128), hãy sử dụng –ThrottleLimit 128 (tuy nhiên, máy tính của bạn sẽ có tải cao hơn để thiết lập một số lượng lớn PSSessions).

Để chạy lệnh trên máy tính từ xa thông qua Invoke-Command trong nền, một thuộc tính đặc biệt –AsJob Được sử dụng. Sau đó, kết quả của lệnh không được trả về bàn điều khiển. Để nhận được kết quả, hãy sử dụng Nhận công việc lệnh ghép ngắn.