- PR -

Win2003Server同士でネットワーク越しにコマンドを実行する方法

1
投稿者投稿内容
やま
常連さん
会議室デビュー日: 2004/07/07
投稿数: 26
投稿日時: 2005-01-17 14:53
やま と申します。
いつも参考にさせていただいております。

さっそくですが、Win2003Server間でネットワーク越しに相手のサーバで
バッチファイルとshutdownコマンドを実行したいと考えております。
バッチファイルでは、rshやatコマンドを試してみたのですが、
すべて「アクセスを拒否されました」となって接続ができません。
セキュリティの設定として、2つのサーバのAdministratorのパスワードを一緒にしたり、
ワークグループを一緒にしたりしてみたのですが、うまくいきませんでした。
shutdownコマンドについても、同じように試してみたのですが
すべて駄目でした。

どなたか、設定方法などをお知りの方がいらっしゃいましたら
ご教授のほどよろしくお願い致します。
_________________
kaz
ぬし
会議室デビュー日: 2003/11/06
投稿数: 5403
投稿日時: 2005-01-17 17:55
こんばんわ.
引用:

やまさんの書き込み (2005-01-17 14:53) より:

さっそくですが、Win2003Server間でネットワーク越しに相手のサーバで
バッチファイルとshutdownコマンドを実行したいと考えております。
バッチファイルでは、rshやatコマンドを試してみたのですが、
すべて「アクセスを拒否されました」となって接続ができません。
セキュリティの設定として、2つのサーバのAdministratorのパスワードを一緒にしたり、
ワークグループを一緒にしたりしてみたのですが、うまくいきませんでした。
shutdownコマンドについても、同じように試してみたのですが
すべて駄目でした。


rsh や at はどのような内容でそうなったか,
具体的に書かれるとレスがつきやすいかもしれません.

どちらも Domain に参加していない standalone な環境なら
> rsh "remotehost" -l "username" "command"
で良いと思うのですが...

或いは IIS の管理 tool を導入して
iisreset でも shutdown や reboot ができましたね.

以上,ご参考までに.
金蛇精
ベテラン
会議室デビュー日: 2004/06/30
投稿数: 52
投稿日時: 2005-01-18 08:28
TerminalServiceなんてどうでしょう?
まるちねす
ぬし
会議室デビュー日: 2004/04/28
投稿数: 302
投稿日時: 2005-01-18 10:07
telnetという手もあるなぁ・・・・・・
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2005-01-19 02:11
WMI で CreateProcessするって手もありますね。

コード:
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



もっとも、RPCが有効でなければ無駄でしょうけど・・・
やま
常連さん
会議室デビュー日: 2004/07/07
投稿数: 26
投稿日時: 2005-01-20 17:32
やまです。
返事が遅くなって申し訳ありません。
レスをつけていただいた皆様、ありがとうございます。

kaz様

引用
>rsh や at はどのような内容でそうなったか,

サーバ同士の接続環境は、同一セグメント内にはいますが
どちらもドメインには参加させていません。
コマンドは、kaz様が書かれたのと同じように
rsh 接続先サーバ名 -l ユーザ名 コマンド(フルパス)
で実行しております。
結果は

接続先サーバ名:接続が拒否されました
rsh: can't establish connection

と、レスポンスが返ってきました。


金蛇精様
まるちねす様

引用
>TerminalServiceなんてどうでしょう?
>telnetという手もあるなぁ・・・・・・

申し訳ありません。説明が足りなかったようです。
システムの定期バックアップ時のコマンド実行のため、
ユーザが介入してコマンドを実行するといった仕様ではないのです。
なので、TerminalServiceやTelnetなのど対話的な実行方法ではいけないのです。
せっかくお返事をいただいたのに、申し訳ありませんでした。


ちゃっぴ様

引用
>WMI で CreateProcessするって手もありますね。

私のほうで、WMIでの開発を行ったことがないので
教えていただいた方法が流用できるかがわかりません。
これから参考、検討させていただきます。

以上、ありがとうございました。
今後もよろしくお願い致します。

[ メッセージ編集済み 編集者: やま 編集日時 2005-01-20 17:33 ]
1

スキルアップ/キャリアアップ(JOB@IT)