2017-03-27

如何使用 PowerShell PsExec ProcDump 來建立 dump file

因為安全性 policy,Production Server 環境管控權限非常嚴格,只有極少數的人可以直接存取,而這極少數的人也都不是負責開發的人員甚至都是 MIS ,因此如果有 production issue 需要 debug 時常會浪費很多時間來確認相關資訊,像是 dump process 資料或是 reset iis ,大家都擔心出錯,而需要經過再三確認跟多方同意造成原本可以三分鐘解決的問題再後用了三個小時處理,效果可能還不如預期,所以打算利用 PowerShell 來 dump iis 資料


必備工具

  1. PowerShell 3+

    使用 $PSVersionTable.PSVersion 可以確認 PowerShell 版本

  2. PsExec
  3. ProcDump

設計概念

Jenkins server 有 access 所有 production server 的權限,所以打算讓 Jenkins 呼叫 PowerShell 搭配 PsExec 及 ProcDump 來完成建立 dump 的工作,PowerShell 負責使用 credential 取得遠端 server 上的 application 的 process id(pid),接著使用 PsExec 遠端執行 ProcDump 來建立 process dump 檔。

其中 PowerShell 也可以用來執行 ProcDump,採用 PsExec 是因為它內建有可以將 local 檔案複製至遠端執行的功能; PsExec 也可以使用 command 來取得 pid,只是 用 command 取出的 pid 不像 PowerShell 可以物件化處理,相對程式碼就複雜得多; PowerShell 也可以用來建立 dump,但需要引用其他外部 function ,為了避免跟 Windows 內建 dump 邏輯不一致所以採用 ProcDump 處理

程式流程

  1. 取得 process id(pid)
    • 記得使用 credential

      語法可以參考 powershell 基本語法筆記

    • 引用 WebAdministration 用來取得 iis 資訊
    • 使用 appPoll name 來取得 iis 的 pid
    • 程式碼範例
      $procId=Invoke-Command -ComputerName $serverIP -ScriptBlock {$appName=$args[0] ;import-module WebAdministration;dir IIS:\AppPools\$appName\WorkerProcesses\| Select-Object -expand processId|Write-Output  } -ArgumentList $appName -Credential $cred
      
      • $serverIP 代表目標 server 的 ip or name
      • $appName 代表 appPoll name
      • $cred 代表目標 server 的 credential
  2. 遠端建立 dump
    • 本地需下載 PsExecProcDump
    • PsExec 相關使用參數可以參考 PsExec - 對遠端執行指令工具的用法
    • ProcDump 相關使用參數可以參考 ProcDump - 用來建立執行程式的 dump
    • 範例程式碼
      # PsExec 路徑
      $exe="c:\PsExec.exe"
      # PsExec 執行參數
      # \\$serverIP 代表目標 server ip
      # $username 目標 server 的使用者帳號
      # $password 目標 server 的使用者密碼
      # $procId 代表要建立 dump 的 process id(pid)
      # 最後兩個參數是用來指定 dump 檔儲存位置
      $params=@("\\$serverIP", '-u', $username, '-p', $password ,'/c', '/f', 'C:\procdump64.exe', '-ma', $procId ,'-o', 'D:\dumps')
      #遠端執行
      & $exe $params
      
  3. PowerShell ISE 出現錯誤可忽略

    詳細內容可以參考 PowerShell ISE 執行外部執行檔(.exe) 時出現 RemoteException NativeCommandError

其他相關用法

參考資料

  1. powershell 基本語法筆記
  2. PsExec
  3. ProcDump
  4. PsExec - 對遠端執行指令工具的用法
  5. ProcDump - 用來建立執行程式的 dump
  6. PowerShell ISE 執行外部執行檔(.exe) 時出現 RemoteException NativeCommandError

沒有留言:

張貼留言