Option Explicit
Dim strCommand, strCurrentDir, strTargetHost, strUsername, strPassword
Dim strErrDescription, objNamedArgs, lngReturn
'On Error Resume Next
Set objNamedArgs = WScript.Arguments.Named
strCommand = objNamedArgs.Item("cmd")
If IsEmpty(strCommand) Then
Call DisplayUsage
WScript.Quit
End If
strCurrentDir = objNamedArgs.Item("cd")
strTargetHost = objNamedArgs.Item("host")
strUsername = objNamedArgs.Item("user")
strPassword = objNamedArgs.Item("pass")
lngReturn = lngCreateRemoteProcessID(strCommand, strCurrentDir, _
strTargetHost, strUsername, strPassword, strErrDescription)
If lngReturn Then
WScript.Echo "正常に終了しました。"
Else
WScript.Echo strErrDescription
End If
'******************************************************************************
'【ヘルプを表示】
'******************************************************************************
Sub DisplayUsage()
Dim strUsage(16)
strUsage(0) = "cscript RemoteShell.vbs /cmd:<Command> /cd:<CurrentDir> /host:<HostName>"
strUsage(1) = " /user:<UserName> /pass:<Password>"
strUsage(3) = " <Command> 実行するCommand"
strUsage(4) = " Exmple: ""C:\hogehoge\hogehoge.exe"""
strUsage(6) = " <CurrentDir> 実行するときのカレントディレクトリ"
strUsage(7) = " Exmple: ""C:\hogehoge"""
strUsage(9) = " <HostName> 接続先ホスト名"
strUsage(10) = " Exmple: hogehoge"
strUsage(12) = " <HostName> 接続先ユーザー名"
strUsage(13) = " Exmple: hogehoge\hogehoge"
strUsage(15) = " <HostName> 接続先パスワード"
strUsage(16) = " Exmple: hogehoge"
WScript.Echo Join(strUsage, Chr(10))
End Sub
'******************************************************************************
'【Remote Shellを実行】
'
'Args strCommand (String) Exacute Command
' strCurrentDir (String) Current Directory
' strTargetHost (String) Remote Host Name
' strUsername (String) Logon User Account
' strPassword (String) Logon Password
' strErrDescription (String) Error Description
'
'Return Value (Long) Process ID
'******************************************************************************
Function lngCreateRemoteProcessID( _
ByRef strCommand, _
ByRef strCurrentDir, _
ByRef strTargetHost, _
ByRef strUsername, _
ByRef strPassword, _
ByRef strErrDescription)
Dim objWMILocator 'As WbemScripting.SWbemLocator
Dim objWMIService 'As WbemScripting.SWbemServices
Dim objW32Process 'As WbemScripting.SWbemObject
Dim lngProcessID 'As Long
Dim lngReturn 'As Long
Set objWMILocator = WScript.CreateObject("WbemScripting.SWbemLocator")
objWMILocator.Security_.ImpersonationLevel = 3
'wbemImpersonationLevelImpersonate
' 対象のComputerへ接続
On Error Resume Next
Set objWMIService = objWMILocator.ConnectServer( _
strTargetHost, "\root\cimv2", strUsername, strPassword)
On Error Goto 0
If Err.Number Then
Select Case Err.Number
Case &H80041003&
strErrDescription = "アクセスが拒否されました。"
Case &H80041001&
strErrDescription = "予期しないエラーです。"
Case &H8004100E&
strErrDescription = "接続先のComputer名が存在しません。"
Case &H80041008&
strErrDescription = "無効なパラメーターです。"
Case &H80041006&
strErrDescription = "メモリーが足りません。"
Case &H80041015&
strErrDescription = "ネットワークエラーです。"
End Select
Exit Function
End If
Set objW32Process = objWMIService.Get("Win32_Process")
' Remote Shellを実行
lngReturn = objW32Process.Create( _
strCommand, strCurrentDir, , lngProcessID)
If lngReturn Then
Select Case lngReturn
Case 2
strErrDescription = "アクセスが拒否されました。"
Case 3
strErrDescription = "権限が不足しています。"
Case 8
strErrDescription = "予期しないエラーです。"
Case 9
strErrDescription = "ファイルが見つかりません。"
Case 21
strErrDescription = "無効なパラメーターです。"
End Select
Else
lngCreateRemoteProcessID = lngProcessID
End If
Set objW32Process = Nothing
Set objWMIService = Nothing
Set objWMILocator = Nothing
End Function
|