winrm.cmd


C:\Windows\system32>winrm.cmd
Windows 遠程管理命令行工具

Windows 遠程管理(WinRM)是 WS-Management 協議的 Microsoft 實現,
該協議為使用 Web 服務的本地計算機和遠程計算機
之間的通信提供了一種安全的方式。

使用情況:
winrm OPERATION RESOURCE_URI [-SWITCH:VALUE [-SWITCH:VALUE] ...]
[@{KEY=VALUE[;KEY=VALUE]...}]

有關特定操作的幫助:
winrm g[et] -? 檢索管理信息。
winrm s[et] -? 修改管理信息。
winrm c[reate] -? 創建管理資源的新實例。
winrm d[elete] -? 刪除管理資源的實例。
winrm e[numerate] -? 列出管理資源的所有實例。
winrm i[nvoke] -? 執行管理資源上的方法。
winrm id[entify] -? 確定 WS-Management 實現是否
正在遠程計算機上運行。
winrm quickconfig -? 對該計算機進行配置以接受其他計算機的
WS-Management 的請求。
winrm configSDDL -? 修改 URI 的現有安全描述符。
winrm helpmsg -? 顯示錯誤消息的錯誤代碼。

有關相關主題的幫助:
winrm help uris 創建資源 URI 的方式。
winrm help aliases URI 的縮寫。
winrm help config 配置 WinRM 客戶端和服務設置。
winrm help certmapping 配置客戶端證書訪問。
winrm help remoting 訪問遠程計算機的方式。
winrm help auth 提供遠程訪問的憑據。
winrm help input 提供輸入以進行創建、設置和調用。
winrm help switches 其他開關,例如格式化、選項等等。
winrm help proxy 提供代理信息。
C:\Windows\system32>winrm help config
Windows 遠程管理命令行工具

使用 winrm 命令行或通過 GPO 管理 WinRM 的配置。
配置同時包括客戶端和服務的全局配置。

WinRM 服務至少需要一個偵聽程序以表示 IP 地址,
以接受該地址上的 WS-Management 請求。
例如,如果計算機具備多個網卡,則可將 WinRM 配置為僅接受
這些網卡其中之一的請求。

全局配置
winrm get winrm/config
winrm get winrm/config/client
winrm get winrm/config/service
winrm enumerate winrm/config/resource
winrm enumerate winrm/config/listener
winrm enumerate winrm/config/plugin
winrm enumerate winrm/config/service/certmapping

網絡偵聽需要一個或多個偵聽程序。
偵聽程序由兩個選擇器識別: Address 和 Transport。

Address 必須是以下內容之一:
* - 偵聽計算機上的所有 IP
IP:1.2.3.4 - 僅偵聽指定的 IP 地址
MAC:... - 僅偵聽指定 MAC 的 IP 地址。

注意: 所有偵聽受制於 IPv4Filter 和 IPv6Filter (在
config/service.
注意: IP 可能為 IPv4 地址或 IPv6 地址。


傳輸必須為以下內容之一:
HTTP - 偵聽 HTTP (默認端口為 5985)上的請求
HTTPS - 偵聽 HTTPS (默認端口為 5986)上的請求

注意: 默認情況下 HTTP 流量僅允許
用 Negotiate 或 Kerberos SSP 加密的消息。


配置 HTTPS 時,使用以下屬性:
Hostname - 該計算機的名稱;必須與證書中的 CN 匹配。
CertificateThumbprint - 適用於服務器身份驗證的證書
的十六進制指紋。
注意: 如果僅提供 Hostname,則 WinRM 將試圖找到對應的
證書。

示例: 偵聽計算機上所有 IP 的 HTTP 請求:
winrm create winrm/config/listener?Address=*+Transport=HTTP

示例: 禁用給定的偵聽程序
winrm set winrm/config/listener?Address=IP:1.2.3.4+Transport=HTTP @{Enabled="false"}

示例: 啟用客戶端而非服務上的基本身份驗證:
winrm set winrm/config/client/auth @{Basic="true"}

示例: 為所有工作組計算機啟用 Negotiate。
winrm set winrm/config/client @{TrustedHosts="<local>"}

另請參閱:
winrm help uris
winrm help aliases
winrm help certmapping
winrm help input
winrm help switches
C:\Windows\system32>

 

C:\Windows\system32>winrm help config
Windows 遠程管理命令行工具

使用 winrm 命令行或通過 GPO 管理 WinRM 的配置。
配置同時包括客戶端和服務的全局配置。

WinRM 服務至少需要一個偵聽程序以表示 IP 地址,
以接受該地址上的 WS-Management 請求。
例如,如果計算機具備多個網卡,則可將 WinRM 配置為僅接受
這些網卡其中之一的請求。

全局配置
winrm get winrm/config
winrm get winrm/config/client
winrm get winrm/config/service
winrm enumerate winrm/config/resource
winrm enumerate winrm/config/listener
winrm enumerate winrm/config/plugin
winrm enumerate winrm/config/service/certmapping

網絡偵聽需要一個或多個偵聽程序。
偵聽程序由兩個選擇器識別: Address 和 Transport。

Address 必須是以下內容之一:
* - 偵聽計算機上的所有 IP
IP:1.2.3.4 - 僅偵聽指定的 IP 地址
MAC:... - 僅偵聽指定 MAC 的 IP 地址。

注意: 所有偵聽受制於 IPv4Filter 和 IPv6Filter (在
config/service.
注意: IP 可能為 IPv4 地址或 IPv6 地址。


傳輸必須為以下內容之一:
HTTP - 偵聽 HTTP (默認端口為 5985)上的請求
HTTPS - 偵聽 HTTPS (默認端口為 5986)上的請求

注意: 默認情況下 HTTP 流量僅允許
用 Negotiate 或 Kerberos SSP 加密的消息。


配置 HTTPS 時,使用以下屬性:
Hostname - 該計算機的名稱;必須與證書中的 CN 匹配。
CertificateThumbprint - 適用於服務器身份驗證的證書
的十六進制指紋。
注意: 如果僅提供 Hostname,則 WinRM 將試圖找到對應的
證書。

示例: 偵聽計算機上所有 IP 的 HTTP 請求:
winrm create winrm/config/listener?Address=*+Transport=HTTP

 

示例: 禁用給定的偵聽程序
winrm set winrm/config/listener?Address=IP:1.2.3.4+Transport=HTTP @{Enabled="false"}

示例: 啟用客戶端而非服務上的基本身份驗證:
winrm set winrm/config/client/auth @{Basic="true"}

示例: 為所有工作組計算機啟用 Negotiate。
winrm set winrm/config/client @{TrustedHosts="<local>"}

另請參閱:
winrm help uris
winrm help aliases
winrm help certmapping
winrm help input
winrm help switches
C:\Windows\system32>winrm get winrm/config/service
Service
RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)
MaxConcurrentOperations = 4294967295
MaxConcurrentOperationsPerUser = 1500
EnumerationTimeoutms = 240000
MaxConnections = 300
MaxPacketRetrievalTimeSeconds = 120
AllowUnencrypted = true
Auth
Basic = true
Kerberos = true
Negotiate = true
Certificate = false
CredSSP = false
CbtHardeningLevel = Relaxed
DefaultPorts
HTTP = 5985
HTTPS = 5986
IPv4Filter = *
IPv6Filter = *
EnableCompatibilityHttpListener = false
EnableCompatibilityHttpsListener = false
CertificateThumbprint
AllowRemoteAccess = true

C:\Windows\system32>

 

Powershell 遠程管理 (一)
 忙里偷閑擠出點時間寫寫PS在Windows不錯的管理方式。Powershell 2.0以后可以說是有了質的變化,Modules的加入、ISE、WinRM遠程管理的支持,今天主要講一系列PowerShell在企業級應用的遠程管理,其實也是我這次在部署一個應急方案使用的一些腳本和方案的集合吧。(我這里是 域環境,讀者可以自己搭建測試)
 首先,我們需要安裝Powershell 2.0和WinRM 2.0 ,這個是作為WindowsUpdate附加補丁得,可以通過可選補丁進行安裝
 
選中,直接安裝就好了,如果要給所有的服務器安裝這個補丁,那么可以考慮用AD環境下的WSUS來安裝這個補丁(關於WSUS的配置我會在以后講述Win2k8 WSUS的文章下詳細說明)。
 Powershell好處之一就是文檔很詳細,我們不清楚要多使用Get-Help來查看幫助,可以先查閱一些關於遠程的相關資料:Get-Help about_remote*,我在使用Powershell 1.0的使用做遠程是相當的痛苦的,每次都要使用WMI的Win32_Process來創建遠程進程,2.0提供了交互式的Session 以及比較好用的Invoke-Command ,同時對其他的命令提供了-ComputerName的參數,管理起來更加方便。
 先說下使用WMI方式做遠程調用吧,首先確認目標機器(需要管理的機器)的遠程管理(Remote Administration)的防火牆是開啟Inbound 允許您的IP傳入的。
打開Windows高級防火牆 –> 傳入規則(InboundRules) ->遠程管理(Remote Administration)->雙擊打開對話框 
選中 Advanced 選擇自己的作用域 我這里選擇的All,以及在Scope下找到遠程IP地址(Remote IP) 加入 Localsubset 本地子網 然后保存 啟用規則 如圖:


  
這樣一下,我們就允許本地子網對 這台機器的 訪問遠程管理端口了(當然你可以根據自己,只給定一個IP訪問目標機器的遠程管理端口防火牆)。
如果是域環境,要開啟這個策略,我們可以建立一個GPO,在
編輯GPO對象的策略->計算機配置->管理模版->網絡->網絡連接->防火牆->域->Windows Firewall:Allow Inbound remote Administration exception的策略,
啟用並且選擇自己需要加入的IP:
 
然后應用到自己的OU 或者 整個站點(我建議您在部署入域的服務器先做好各種測試和策略,在入域以后 馬上就會立即生效,那么也會比較方便,做遠程管理呢。)
先講述三個命令:
Get-WmiObject (1.0+)
Invoke-WmiMethod (2.0)
Invoke-Command (2.0)
大家自行認真查看對應的幫助吧,Get-Help Get-WmiObject –Full
WMI調用的話,2.0直接使用Invoke-WmiMethod
比如,我們經常用到的,更新租策略,我記得有一次,我失誤導致大部分機器的3389端口全部關閉,遠程鏈接全部失敗。我更新組策略,但是沒有GPO生效都要超過90分鍾的,不得已 一些機器的admin$的共享也關閉,不能使用psexec 來遠程調用命令。於是我就用WMI的方式來主動更新組策略:

 

復制代碼
function GpupdateForce
{
param
(
[String][parameter(Mandatory=$True)]
[String]$RemoteComputer
)
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "GPUPDATE /FORCE" -EnableAllPrivileges -ComputerName $RemoteComputer
}
復制代碼

 

 

這個方法我沒有提供Credential ,就是默認當前登錄的域帳號,我們也可以使用
$creq = Get-Credential
然后在Invoke-WmiMethod –Credential $req的方式提供對應的憑據。例如:

 

復制代碼
function RemoteCall
{
param
(
##調用的命令
[String][parameter(Mandatory=$True)]$Cmd,
##遠程計算機
[String][parameter(Mandatory=$True)]$RemoteComputer
)
$credential = Get-Credential
##可以使用Invoke-Command
Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList $Cmd -EnableAllPrivileges -ComputerName $RemoteComputer -Credential $credential
}
復制代碼

 

 

如果你的帳號還不是管理員(這里比較麻煩了,使用WMI的 wmimgmt.msc來添加對應目標機器的權限,這里我不提供腳本了,因為相當的繁瑣,以后有機會和大家說說解決方案吧。二就是dcomcnfg.exe設置您的用戶允許遠程RPC調用的權限)
WMIMGMT.MSC:
 
配置WMI命名空間權限。
DCOMCNFG.EXE:
 
配置遠程DCOM權限
當然我們可以直接使用Invoke-Command和交互式Session來簡化WMI的方式,我會在下一篇文章詳細介紹

我就是用這種方式來主動更新的組策略,當時比較着急可能還有更多方案,我在這里拋磚引玉,畢竟咱不是Pro系統管理員,嘿嘿。
 當時的情況。。。當時公司某些情況發生,導致服務器壓力很大,需要立刻部署20台前端用來負載高負荷的請求,必須安裝IIS,必須同步所有的程序代碼,必須迅速建立站點。
首先是代碼同步,其實這種小工具是必須提前做好准備的,比如配置好rsync之類的。因為是突發事件我臨時寫了一個代碼同步的工具,和大家介紹一下強大的robocopy。

代碼同步:
Win2008 是自帶這個command 的,如果是2003 需要安裝Resouces Tools 才能使用robocopy
我使用了比較方便的Invoke-Command 。

 

復制代碼
function CodeSync
{
 param([String][parameter(Mandatory=$True)]$source,[String][parameter(Mandatory=$True)]$target,[bool]$mirror = $False,[int]$retryNum = 5,[int]$retrySec = 10)
 if($mirror)
 {
 Invoke-Command -ScriptBlock { robocopy.exe $source $target /E /ZB /COPYALL /MIR /R:$retryNum /W:$retrySec}
 }
 else
 {
 Invoke-Command -ScriptBlock { robocopy.exe $source $target /E /ZB /COPYALL /R:$retryNum /W:$retrySec}
 }
}
$line = [int]1
Get-Content -Path "E:\Desktop\Target.txt"|%{
 $arr = $_.Split(',')
 if($arr.Length -ne 3)
 {
 Write-Host "Line `"$_`" parameter error at line $line`nParameter Format:Source Target Mirror" -ForegroundColor Red
 }
 else
 {
 CodeSync $arr[0] $arr[1] ($arr[2] -eq "1")
 Write-Host "Task $line Sync Complete!" -ForegroundColor Green
 }
 $line++
}
Read-Host "Press any key exit..."
復制代碼

 

這個簡單的腳本提供了從某個配置文件讀取共享目錄來同步
file://machine1//C$/Test/1,//MACHINE2/c$/Test/2,0
參數1標識Source
參數2標識 Destination
參數3標識 是否完全覆蓋

就這樣,我先把代碼同步到了不同的20個前端。
安裝IIS:
ServerManagerCMD.exe
前面我們提供了RemoteCall的腳本,聯想到直接使用RemoteCall “ServerManagerCMD.exe –install 角色”,機器名,因此我很順利的安裝了IIS。
部署IIS:
這里我走了一些彎路,我試圖用 root/WebAdministration 來搞定這一切,但我發現關於IIS WMI的文檔太少了,以至於我基本上沒找到合適的調用方法。后來我嘗試使用了appcmd,也大獲成功了:
思路大致使用RemoteCall 調用 本地的appcmd 來 部署IIS
首先我調用
"C:\Windows\System32\inetsrv\appcmd.exe add site /name:`"test`" /bindings:http://*:80 /physicalpath:`"C:\test\ `""
添加了站點  test,而且綁定了 所有IP地址的80端口,路徑是:C:\test\
注意:在Powershell中的字符串出現了雙引號,要使用 “`”(1左邊的鍵)來轉義。
然后
"C:\Windows\System32\inetsrv\appcmd.exe start site `"f-sq`""
我打開了站點,默認是關閉的。
"C:\Windows\System32\inetsrv\appcmd.exe delete site `"Default Web Site`""
我刪除了所有機器的默認站點
"C:\Windows\System32\inetsrv\appcmd.exe set config  /section:httplogging /dontlog:True"
並且禁用了 本地的IIS 日志
"C:\Windows\System32\inetsrv\appcmd.exe add apppool /name:`"test`" /queueLength:50000 /processModel.userName:`"test\test`" /processModel.password:`"%^&*(234`" /processModel.loadUserProfile:`"True`" /processModel.maxProcesses:5 
/failure.loadBalancerCapabilities:`"TcpLevel`" /failure.rapidFailProtectionMaxCrashes:50 
/processModel.identityType:`"SpecificUser`""
創建了新的應用程序池 制定了工作線程,隊列長度,自定義域帳號等。
"C:\Windows\System32\inetsrv\appcmd.exe set site /site.name:`"f-sq`" /applicationDefaults.applicationPool:`"test`""
最后將站點綁定到test 應用程序池

•整個過程只話了一個多小時,試想如果以后再來100台前端機器,那么可能只要1分鍾時間就能搞定這個任務了。所以說積累也很重要!
 本文已實際的經歷描述,希望能幫助到大家,在一篇文章中我會說到PSSession 的實戰經驗。

  上文Powershell 遠程管理 (一)和大家大概的講述了一個我的遠程管理的過程,今天主要和大家說說ps 在交互式會話的管理方式也就是Pssession,Pssession是Windows Powershell會話的意思,一個會話,可以共享數據,提供交互式的對話,我們可以為某些命令例如Invoke-Command 制定會話來遠程作業。當然我們還能利用Enter-Pssession來直接和遠程計算機連接,直接建立一個持續安全的遠程對話,來執行我們的所有命令。
 我們分三個部分來講述Powershell Session,首先是域環境下的遠程連接,WAN/LAN的遠程連接(Trusthost方式),WAN/LAN的遠程連接(SSL加密方式),可以先大致的理解為,當我們操作的機器和遠程機器處於同一個AD下,那么是可以直接向Powershell使用Kerbors(基於FQDN),NTLM基於ip地址來進行身份標識的傳輸,一般是通過當前登錄到機器的用戶憑據。當我們處於另外的網絡環境,或者工作機沒有入域能夠提供域標識的情況下,可以使用信任主機和SSL加密方式來向遠程機器提供會話標識的方式。
 Powershell基於WinRM和WinRS來建立遠程會話的,以及和傳統的WMI DCOM的對比。WMI 依賴 DCOM 在遠程計算機上執行管理任務,而防火牆往往會阻止所有傳入的 DCOM 通信,這使 WMI 很難(如果並非完全不可能)通過 Internet 以編程方式管理計算機 Windows 遠程管理(WinRM)是“WS 管理協議的 Microsoft 實施,該協議是基於標准 SOAP、不受防火牆影響的協議,允許不同供應商的硬件和操作系統相互操作。也就是我們在Client使用本地的WinRS(Windows Remote Shell) 向遠程的WinRM(Windows Remote Service)基於SOAP 通過http或者https進行連接獲取管理數據(底層依舊使用WMI,但是已經被包裝了SOAP來通訊了)。必須注意的是:客戶端和服務端都必須安裝啟用WinRM
Solution One:
Client:非域環境 Domain:vm.terry-corp.com(也可以是工作組,我這里用的是域)
客戶端打開Powershell 執行 cd wsman::localhost\client 輸入ls
PS Microsoft.WSMan.Management\WSMan::localhost\Client> ls
(默認TrustedHosts 為空,當我們在非信任環境下(不能使用Kerbors認證) 的時候,必須使用TrustedHosts或者SSL方式)

##Set-Item TrustedHosts “你的入域機器的IP或者工作組機器”
我這里執行的是:
Set-Item TrustedHosts “192.168.133.67”
查看 ls

Name                      Value
----                      -----
NetworkDelayms            5000
URLPrefix                 wsman
AllowUnencrypted          false
Auth
DefaultPorts
TrustedHosts              192.168.133.67
修改成功!

服務端
首先啟用遠程訪問Enable-PSRemoting –Force
操作會打開WinRM服務,添加WinRM 的防火牆例外,可以在WF.MSC自己再次確認Windows Remote Management的防火牆是否對你的Client有了例外

客戶端打開Powershell

Enter-PSSession -ComputerName 192.168.133.67 –Credential vm.terry-corp.com\Administrator
(可以設置自己的憑據,我這里用的域帳號)
成功的話會顯示:
[192.168.133.67]: PS C:\Users\Administrator\Documents>
記得退出Exit-Pssession
Solution Two:
WS-Management 加密通過網絡傳輸的所有 Windows PowerShell 內容。UseSSL 是一種額外的保護措施,它通過 HTTPS 連接而不是 HTTP 連接來發送數據。
因此使用SSL方式是一種更加安全可靠的遠程管理方式.
SSL的工作原理也是確認客戶端和服務端的身份之后再進行握手的,還擔保了數據的來源,不被纂改和監聽.
首先要生成SSL證書
(題外話:我本來打算使用AD 證書服務來給自己頒發一個機器名的證書,但是我入域機器的機器名是帶上了dns后綴名的, 而我的客戶端連接使用的是IP地址,那么會被認為證書的CN名和機器名不一致.AD 機器很多時候都是內網環境,所以想直接通過AD證書,那么你的DNS必須在客戶端能夠被解析.所以我這里使用的是自簽名的證書)
可以使用sslself.exe或者makecert.exe
下載SelfSSL http://www.microsoft.com/downloads/...laylang=en
makecert.exe在.NET Framework 工具中有
服務端生成證書
SELFSSL:
C:\Program Files (x86)\IIS Resources\SelfSSL>selfssl.exe /N:CN=192.168.133.67 /V:3600 /T /Q
(ip就是服務端的ip)
MAKECERT:
MakeCert.exe -pe -n "CN=192.168.133.67" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange –r C:\1.CER
(在C盤根目錄下的1.cer)

打開inetmgr 移除默認站點對SSL 443的binding
打開MMC (文件->添加刪除 管理單元)找到 證書 選擇 本地計算機添加 找到根信任區域
導出剛才的證書
Copy 到客戶端,導入證書到根信任區域
再次返回到服務端
打開MMC 找到剛才的證書,復制證書 詳細信息里面的 指紋
eb 10 24 5d 89 11 4a 57 4c 0c ba ac 79 b7 3b 3a 05 aa 1b d7
執行CMD
C:\Users\Administrator> winrm create winrm/config/Listener?Address=*+Transport=HTTPS @{Hostname="192.168.133.67";CertificateThumbprint="‎ eb 10 24 5d 89 11 4a 57 4c 0c ba ac 79 b7 3b 3a 05 aa 1b d7"}
添加對https 的監聽,以及添加證書指紋.
成功顯示:
ResourceCreated
    Address = http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous
    ReferenceParameters
        ResourceURI = http://schemas.microsoft.com/wbem/wsman/1/config/listener
        SelectorSet
            Selector: Address = *, Transport = HTTPS
執行Winrm enumerate winrm/config/listener 也可以確認添加是否成功顯示:

Listener
    Address = *
    Transport = HTTPS
    Port = 5986
    Hostname = 192.168.133.67
    Enabled = true
    URLPrefix = wsman
    CertificateThumbprint = eb 10 24 5d 89 11 4a 57 4c 0c ba ac 79 b7 3b 3a 05 aa 1b d7
    ListeningOn = 127.0.0.1, 192.168.28.128, 192.168.133.67, ::1, fe80::5efe:192.168.28.128%13, fe80::5efe:192.168.133.6
7%12, fe80::856d:7551:c80d:b615%11, fe80::c576:2df6:6d25:6da6%10
說明已經正確添加了SSL證書.再次返回到客戶端進行連接:
Powershell
Enter-PSSession -ComputerName 192.168.133.67 –Credential vm.terry-corp.com\Administrator –UseSSL
成功顯示:
[192.168.133.67]: PS C:\Users\Administrator\Documents>

至此Windows Powershell 的兩種方式已經和大家說清楚了,大家不明白的地方可以直接cnblogs聯系我.下一篇文章詳細講述如何使用URI 連接遠程的WinRM服務進行管理,這主要涉及到IIS 和SSL的配置

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM