• ベストアンサー

VBScript(WHS)でWMIを使ってリモートでvbsファイルを実行したい

サーバAから、サーバBに置いてあるvbsファイル(Apache停止が書かれている)を実行して、サーバBのApacheを停止したいのですが、うまくいきません。 サーバBで単体でそのvbsファイルを実行すると、Apacheは正常に停止します。  戻り値は、0(プロセス完了)が帰ってきていて、接続はうまくいっているようなのですが、vbsファイルが実行されていないようです。  非常に困っておりまして、どなたか教えていただけないでしょうか? vbsファイルの実行のところが間違っているのかなと思うのですが・・・(今まだ会社にいないので、会社でのソースそのままではないですが、同じような感じです) -------------------------------------------- Option Explicit Dim strComputer Dim strUser Dim strPassword Dim strBAT ' ----------------------------------- ' 環境設定 ' ----------------------------------- strComputer = "サーバーB" strUser = "username" strPassword = "password" strBAT = "c:\hoge.bat" ' ----------------------------------- ' コマンド実行 ' ----------------------------------- Dim objWbemLocator Dim objWMIService Dim objWin32_Process Dim errReturn Dim intProcessID Const WbemAuthenticationLevelPktPrivacy = 6 ' リモートに接続 Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objwbemLocator.ConnectServer _ (strComputer, "root\cimv2", strUser, strPassword) objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy ' Win32_Process クラスを生成 Set objWin32_Process = objWMIService.Get("Win32_Process") errReturn = objWin32_Process.Create _ ("cmd.exe /cscript C:\tmp\ApacheStop.vbs", Null, Null, intProcessID) WScript.Quit(errReturn ) もともとの要件は、機能ごとに分けたvbsファイル(Apache停止、Windows再起動、ファイルバックアップなど)を、各サーバで実行するというものです。その制御は、ひとつのバックアップサーバーで行います。

質問者が選んだベストアンサー

  • ベストアンサー
  • junkUser
  • ベストアンサー率56% (218/384)
回答No.1

正式なコードではないということなので細かいミスは無視する方向で。 1.実行アカウントについて 実行するユーザーアカウントは、接続するユーザーアカウントと異なるのですか? 異なるのであれば問題ありません。 同じであれば、この記述は冗長です。 2.実行する実体について C:\tmp\ApacheStop.vbs はこのスクリプトを実行するサーバー側に保存されていますか? 3.cscript は cmd を使わなくても実行できますよ。 4.イベントログの失敗の監査を有効にしてみてください。  実行に失敗すると、セキュリティログかどこかに記録されるかもしれません。  objWin32_Process.Create 以外のところで問題があれば記録されます。

kaorin21
質問者

補足

junkUserさん  お早いご回答ありがとうございます!  初めてこのような質問の書き込みをしましたが、こんなにお早い ご回答をいただけるとは思っておりませんでした。  とても助かります。  cscript C:\tmp\~.vbsでやってみたら、ひとまずvbsファイルが動きました(Apacheの停止は確認できました)。 ありがとうございます。  ただ、依然としてしくみをほとんど分かっていない状態です。。  リモートで実行されたvbsファイルからの戻り値の取得について、知っていることがございましたら教えていただけないでしょうか? 1.実行アカウントについて 実行するユーザーアカウントは、接続するユーザーアカウントと同じで、また、パスワードも同じです。 2.実行する実体について C:\tmp\ApacheStop.vbs はこのスクリプトを実行するサーバー側に保存しています。 3.追加質問 intRet = objWin32_Process.Create(strVBS, Null, Null, intProcessID)のintRetの戻り値で、実行したvbsファイルのプログラミングで戻り値を指定して受け取ることはできないのでしょうか? もし、それを実現したいとしたら、batファイルを使ってvbsファイルからの戻り値を%errorlevel%で受け取るなどしなければならないのでしょうか? 以下がソースですが、細かいところのミスなども指摘いただけると助かります。 すみませんがよろしくお願いします。 ----------------------------------- strComputer = "リモートのPC名" strUser = "Administrator" strPassword = "パスワード" strVBS = "cscript C:\tmp\~.vbs" ' リモートに接続 Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objwbemLocator.ConnectServer _ (strComputer, "root\cimv2", strUser, strPassword) objWMIService.Security_.authenticationLevel = 6 objWMIService.Security_.impersonationLevel = 3 ' Win32_Process クラスを生成 Set objWin32_Process = objWMIService.Get("Win32_Process") intRet = objWin32_Process.Create(strVBS, Null, Null, intProcessID) Set objWbemLocator = Nothing Set objWMIService = Nothing

その他の回答 (2)

回答No.3

部下に WMI を研修するために、自身で勉強しながら資料を作ってる最中なもので、的外れかもしれません。 サービスを停止するだけなら、サーバーA にある VBS で、サーバーB の Win32_Service にアクセスして、StopService() メソッドで Apache のサービスを停止するってのはどうでしょうか? Apache のサービスが Windows のサービスなのかどうかよくわかりませんが。 または、現在のサーバーA 側のスクリプトは、サーバーB の Win32_Process にアクセスして CScript.exe を起動させてますが、 サーバーA 側のスクリプトで WScript の WshController オブジェクトを使って、サーバーA 側のスクリプトを直接サーバーB に実行してもらうって手もあるかもしれません。 http://www.atmarkit.co.jp/fwin2k/operation/wsh09/wsh09_01.html

kaorin21
質問者

お礼

回答ありがとうございます。 初めは、WshController オブジェクトを使ってリモート実行を考えていたのですが、WshController オブジェクトを使う前提としてレジストリを変更しなければならず、サーバ管理者からそれは絶対NGといわれたので、その方法はとれませんでした。  リモートvbsの実行を受け付けます、という設定に変えることになるので、セキュリティ的に問題があるからです。 上段のWin32_Service にアクセスでやってみたら、あっさりリモートでApacheの停止ができました。 時間のない中でじっくり勉強できずに次々作ってしまっている弊害なのか、気づきませんでした。ありがとうございます。 以下、スクリプトです。 -------------------------------------- Dim strQuery ' サービス取得SQL Dim strServiceName ' サービス名 Dim lngServiceCount ' サービス数 Dim objServiceList ' 対象の サービス一覧 Dim objServiceInfo ' サービスの情報 Dim lngRetCode ' 戻り値 Dim strComputer ' PC strServiceName = "Apache2.2" strComputer = "PC名" lngServiceCount = 0 strQuery = "SELECT * FROM Win32_Service WHERE Name = '" & strServiceName & "'" 'サービス取得SQL Set objServiceList = GetObject("winmgmts:\\" & strComputer & "\root\cimv2").ExecQuery(strQuery) For Each objServiceInfo In objServiceList lngRetCode = objServiceInfo.StopService() 'サービスの停止 lngServiceCount = lngServiceCount + 1 Next 'メモリ解放 Set objServiceList = Nothing Set objServiceInfo = Nothing 今は、リモートで共有フォルダを作ってデータコピーした後に共有を解除するという課題に取り組んでおります。 リモートで、コマンドプロンプトを実行する例の方法が使えそうです。 http://www.microsoft.com/japan/technet/scriptcenter/resources/qanda/sept04/hey0901.mspx

  • junkUser
  • ベストアンサー率56% (218/384)
回答No.2

> batファイルを使ってvbsファイルからの戻り値を%errorlevel%で受け取るなどしなければならないのでしょうか? 気になったので実験してみました。 1."cscript 存在しない.vbs" を実行する Win32_Process.Create のリターンコードは 9、bat で得たリターンコードは 1 でした。 2."cscript C:\tmp\test.vbs" を実行する test.vbs の中身は WScript.Quit(100) の1行のみです。 Win32_Process.Create のリターンコードは 0、bat で得たリターンコードは 100 でした。 つまり、Create メソッドが独自に生成したリターンコードを返すようです。 代替案1.サーバー側の実行スクリプトで実行結果をファイルに書き出す  共有フォルダなどに書き込んでそれを確認する。  ファイル名で実行結果が分かるようにしたらいかがでしょうか。 代替案2.WshRemote を使い、リモート用のスクリプトで Err.Raise を発生させてそれを受け取る  bat ファイルで %errorlevel% を受け取ってそれをさらに処理するのとあまり変わりませんね。 とりあえず、コードのダイエットを。 ユーザー名とパスワードは記述する必要が無くなります。 ---------------- strComputer = "リモートのPC名" strVBS = "cscript C:\tmp\~.vbs" ' リモートに接続 Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") ' Win32_Process クラスを生成 Set objWin32_Process = objWMIService.Get("Win32_Process") intRet = objWin32_Process.Create(strVBS, Null, Null, intProcessID) Set objWMIService = Nothing

kaorin21
質問者

お礼

忙しいところ、ありがとうございます。

kaorin21
質問者

補足

おかげでコードのダイエットができました。 ありがとうございます。 代替案1.を検討したのですが、 結果のファイルが残っていくため削除処理をしなければならないのが面倒なので他を検討するよう言われたので、リモートでイベントログを取得して、管理側サーバで各サーバのVBScriptの実行を管理することにしました。 前提としてVBScriptの中で、イベントログの特定のエントリに結果などを出力しておくことが必要ですが。 リモートでイベントログを取得、はWMIにもともと備わってるので 簡単にできました。

関連するQ&A

  • VBSからリモートでbat実行(WMI)

    VBS初心者です。 別端末上のbatファイルを別ユーザでリモート実行したいのですが、 以下のソースでエラーが起きてしまいます。(result が2で返ってきてしまう) どなたか原因がお解りになりましたらご教授宜しくお願い致します。 ----------------------------------------------------- RemoteExecute "リモート先","ドメイン\User","pass","C:\test.bat" Function RemoteExecute(strServer, strUser, strPassword, CmdLine) Const Impersonate = 3 RemoteExecute = -1 Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer(strServer, "root\cimv2", strUser, strPassword) Service.Security_.ImpersonationLevel = Impersonate Set Process = Service.Get("Win32_Process") result = Process.Create(CmdLine, , , ProcessId) If (result <> 0) Then WScript.Echo "Creating Remote Process Failed: " & result Wscript.Quit End If RemoteExecute = ProcessId End Function -----------------------------------------------------

  • VBSからbat実行(WMI)して戻り値を取得する

    WSH初心者です。 WSH(remote.vbs)からWMI使用で別サーバのA.batを実行しているのですが、 A.batの戻り値はどのように取得すれば良いのでしょうか? -■remote.vbs(一部抜粋)------------------------------------------ ' #WMI に接続 Wim32_Process クラスを取り出す Set clsProcess = GetObject("winmgmts:{impersonationLevel=impersonate}" & "!" & リモート先PC & "Win32_Process") ' #プロセスの作成 lngResult = clsProcess.Create(A.bat, null, null, processId) -------------------------------------------------------------- -■A.bat------------------------------------------ exit /B %RetCode% ------------------------------------------------- A.batで返している%RetCode%の値をremote.vbs側で取得したいのです。 どなたかご存じでしたらご教授の程よろしくお願い致します。

  • vbscriptを用いて他のVBSファイルを実行

    プログラム ---------------------------------------------------------------- option explicit dim objwshell set objwshell = createobject("wscript.shell") objwshell.run "ファイルのフルパス", 1, false set objwshell = nothing --------------------------------------------------------------- その「ファイルのフルパス」上に「notepad.exe」と入力するとメモ帳が起動するんですけど、他のファイル(vbs、jsなど)を指定するとエラーが出ます。 もしかしてこれは拡張子が「.exe」のファイルだけしか起動できないのでしょうか? ちなみに上のファイルを保存するときの拡張子は「.vbs」です。

  • シャットダウンスクリプトの記述

    ドメインに参加している WinXP クライアントから、ワークグループ環境の複数台の Windows Server 2003 (主に) に対して ping を実行し、ping に対して応答があった場合はシャットダウンするスクリプトを記述したいと考えています。 # ワークグループ環境の Windows Server 2003 は検証環境で、社内セキュリティポリシーの運用上ドメインに参加できません。 この場合、 1. 複数のマシンに ping を打つ 2. 1 で応答がかえってくれば管理者の資格情報を使用してログイン 3. シャットダウンを実行 という流れになると思います。 そして、最終的には 1 が成功した場合に If 構文で 2、および、3 を実行する、という ように書けば一連の処理は成功すると考えています。 現在上記 1~3 の処理で細分化し、それぞれについて動作確認をとっています。 しかし、2、および、3 を実行してもうまくいかないため、これらについて伺いたく 質問させていただきます。 2 について 以下の構文を組んでいますが、vbs を実行すると、後述のエラーダイアログが表示されます (対象 PC やアカウント名などはダミーとご認識ください)。 別の資格情報 (接続先マシンの管理者アカウント) を指定して接続できるコードをご教授ください。 ----- Const WbemAuthenticationLevelPktPrivacy = 6 strComputer = "atl-ws-01" strNamespace = "root\cimv2" strUser = "Administrator" strPassword = "4rTGh2#1" Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator") Set objWMIService = objwbemLocator.ConnectServer (strComputer, strNamespace, strUser, strPassword) objWMIService.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy Set colItems = objWMIService.ExecQuery ("Select * From Win32_OperatingSystem") For Each objItem in ColItems Wscript.Echo strComputer & ": " & objItem.Caption Next ----- エラー : RPC サーバーを利用できません。 コード : 800706BA ソース : SWbemLocator 3 について 以下の構文を組んでいますが、エラーは表示されないものの、シャットダウンが開始されません。 ----- On error resume Next Const LogOff = 0 'ログオフ Const REBOOT = 2 '再起動 Const SHUTDOWN = 8 'シャットダウン Dim objWMIService Dim colOperatingSystems Dim objOperatingSystem Set objWMIService = GetObject("winmgmts:{impersonationLevel= impersonate,(Shutdown)}\\" & strComputer & "\root\cimv2") Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem") For Each objOperatingSystem in colOperatingSystems objOperatingSystem.Win32Shutdown(SHUTDOWN) Next Set objWMIService = Nothing Set colOperatingSystems = Nothing Call ErrorCheck End Function ----- また、試しに objNetwork.MapNetworkDrive を使用してサーバーの IPC$ に接続しログインした後に上記処理を試行しましたが、 シャットダウンが進みませんでした。 何卒よろしくお願いいたします。

  • SQLServer2005のストプロでxp_cmdshellを使いvbsファイルを実行できない

    ストプロ内でxp_cmdshellを使用し、vbsファイルを実行したいのですが実行できません。 vbsファイルはxp_cmdShellでキックされたらSQLサーバのデータをSELECTし、テキストファイルにSELECTで取得した行数だけ行を追加するという内容です。 vbsファイルはコマンドプロンプトから実行すると動くので正しいと思います。 ストプロにはvbsファイル実行の前後にtableのupdate作業があり、 その2つは行われます。しかし、書き出されるはずのデータがテキストファイルに書き出されません。 vbsファイルは実行されていないようですがエラーは出ず正常終了となり、 xp_cmdshell実行後の戻り値は0で成功となっています。 xp_cmdshellオプションは有効になっており、は混合モードでSysAdminの権限を持つユーザーで処理をしています。 また、ストプロではなく、SQLServerManagementStudioから下記のようにvbsファイル実行しようとした場合、エラーなく正常終了するのですがテキストファイルにデータは追加されていません。  EXEC @result = xp_cmdshell 'Cscript c:\AddRow.vbs' しかし、EXEC xp_cmdshell 'dir *.exe'は実行できます。 vbsファイルをxp_cmdshell で実行するときは何か特殊な記述が必要なのでしょうか。何がいけないのかわからず困っております。お気づきのことがありましたらご指摘いただけますようお願い致します。 以下にストプロの中身をを記述します。 BEGIN   SET NOCOUNT ON; -- テーブルのアップデート処理   UPDATE table1 SET Status = 1   WHERE Status = 0 --ファイル書き出しvbsの実行   DECLARE @result int   SET @result = 1   EXEC @result = xp_cmdshell 'Cscript c:\AddRow.vbs' --ここは下記のようにCscriptを抜いても試しましたがだめでした。 --EXEC @result = exec master..xp_cmdshell 'c:\AddRow.vbs'   IF (@result = 0)   BEGIN --xp_cmdshellの実行が成功したときのみこの処理に入る予定。 --実際は実行されていないようだが@result が0なのでこの処理を行っている。     UPDATE table1 SET Status = 2     WHERE Status = 1   END END

  • VBSファイルを定期的に自動実行する方法

    毎日同時刻に下記のVBSファイルを自動実行したいと思います。 タスクスケジューラで実行すると download.exe は起動しますが 表示されたダイアログがアクティブ状態にならないため (タイトルバーが灰色のまま、タスクバーのボタンが点滅)、 文字入力ができないまま、処理が終了してしまいます。 1.ダイアログをアクティブにし、正常に処理を実行させるには   どのように記述すれば良いですか? 2.このVBSファイルをユーザーがログオフされている状態で   実行することは可能ですか? 恐れ入りますが、ご存じの方がおられましたら、ご教示願います。 <環境> Windows 2008 Server R2 standard (64ビット) <D:\aaa.vbs> Set objShell = WScript.CreateObject("WScript.Shell") 'ダウンロードEXEを実行 Set objExec = objShell.Exec("D:\download.exe") WScript.Sleep 1000 objShell.AppActivate(objExec.ProcessID) 'ファイルのダウンロード先を指定し、実行(ENTER) WScript.Sleep 1000 objShell.SendKeys "D:\data.txt~"

  • リモートでファイルを実行する方法について

    仕事の関係でクライアント(WindowsXP)端末からリモートで サーバー(Windows Server 2003)にあるCドライブの直下にある BATファイルを実行したいのですがそれを実現するには どうすればよいのかお教えください。 UNIXではrshでいうのがありますがWindowsのコマンドでそれに 見合うのはないと聞きました。VBSでもいいので実現する方法に ついてご教授ください。 よろしくお願いします。

  • ASPからサーバー上のVBSファイルを引数付で実行したい

    お世話になっております。 ASPで指定名称のフォルダを作成しアクセス権を割り当てる サイトを作成しております。 フォルダの作成は問題なく作成できましたが、アクセス権の指定がうまくいかず困っております。 アドバイスいただければ幸いです。 前提として作成したフォルダへのアクセス権割り当ては、MSで公開しているxcacls.vbsファイルを利用してます。 http://support.microsoft.com/kb/825751/ja このVBSファイルに先に作成したフォルダのネットワークパス・アクセス権を与えるユーザー名・与える権限レベルを引数として与えASPのサーバー上で実行し処理を完結しようと考えております。 ------------------スクリプト抜粋---------------------- Set WSHShell = CreateObject("WScript.Shell") 'xcacls.vbsを実行 'strPathNm = "xcacls.vbs \\fileServer\testfol /G Domain\User:M /f /t /e /q" Call WSHShell.Run(strPathNm, 0, false) -------------------------------------------------------- サーバー上でコマンドプロンプトから実行する限りは問題なく 処理されてます。 ASPサイトから実行した場合は特にエラーなど表示されず処理終了しますが、アクセス権の割り当てはされません。 また実行時にサーバー上で実行されたかタスクマネージャーにて確認してますが、起動された形跡がありません。 ちなみにスクリプトの問題かと思い、「strPathNm」の編集への代入を、メモ帳や電卓に変更したところ正常に起動しております。 ※xcacls.vbsはサーバー上でパス通してあります。 以上よろしくお願いいたします。

  • ASPからVBS実行時の権限

    ASPからWscript.Shellを使ってVBSを実行しているのですが、 ASP中のDBオープンには問題はないのですが、test.vbs中でオープンできません LOGファイルは"dbConnection-OK"までになっています。 権限の問題かどうかはわからないのですが、原因は何でしょうか? DBはODBC経由のSQLServerです。 ---------ASP-------------------------------------- <% Dim dbConnection Set dbConnection = CreateObject("ADODB.Connection") dbConnection.Open "testdb" dbConnection.Close Set dbConnection = Nothing '上記OPENに関して問題なし Dim WshShell Set WshShell = CreateObject("Wscript.Shell") WshShell.Run "cscript.exe e:\test.vbs 123", 0, True Set WshShell = Nothing %> <html> <head> <meta http-equiv="Cache-Control" content="no-cache" /> <title>Pipot.to</title> </head> <body> OK </body> </html> ---------test.vbs-------------------------------------- Dim ObjFSO Dim ObjTS Set ObjFSO = CreateObject("Scripting.FileSystemObject") Set ObjTS = ObjFSO.CreateTextFile("e:\log.txt") ObjTS.Write "LOG開始" Dim dbConnection Set dbConnection = CreateObject("ADODB.Connection") ObjTS.Write "dbConnection-OK" dbConnection.Open "testdb" ObjTS.Write "OPEN-OK" dbConnection.Close Set dbConnection = Nothing ObjTS.Close Set ObjTS = Nothing Set ObjFSO = Nothing

  • “.vbs”のファイルが実行できない

    まったく初歩的な質問で申し訳ないのですが、拡張子がvbsのファイルが実行できません。 あるソフトをアンインストールするために実行したいんですが、ダブルクリックするとアプリケーションを選べみたいなのが出てきて、よく分かりません。 一応、そのvbsファイルをNotepadで開いてみたものを載せときます。 ---------------------------------------- On Error Resume Next set shell = CreateObject("WScript.Shell") set fso = CreateObject("Scripting.FileSystemObject") bcp="C:\Program Files\BCP" msg = msgbox("ブラクラでヤバイVer4をアンインストールしますか?",vbYesNo) if msg=vbNo then WScript.Quit if fso.FolderExists("C:\Program Files\BCP\")then fso.DeleteFolder bcp msgbox "フォルダの削除完了" end if shell.RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\ブラクラでヤバいでチェック\") shell.RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\ブラクラでヤバいを起動\") msgbox("アンインストールが完了しました。"&Chr(13)&Chr(13)&"By 禿親父") ---------------------------------------- どなたか分かる方いましたら教えてください。 よろしくお願いします。

専門家に質問してみよう