• 締切済み

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 -----------------------------------------------------

みんなの回答

  • deadend
  • ベストアンサー率62% (23/37)
回答No.1

コマンドラインの指定で、バッチファイルを直接指定しているのがマズイのでは? "C:\test.bat"を"cmd.exe /c C:\test.bat"に変えてみては?

関連するQ&A

  • 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(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再起動、ファイルバックアップなど)を、各サーバで実行するというものです。その制御は、ひとつのバックアップサーバーで行います。

  • vbsからbatを動かしたいです♪

    vbsからbatを動かしたいです♪ リモートでマシンを動かしたいのですが・・・。 動きません!なぜでしょう? どなたか助けてください、お願いします。 =============== Set shell = CreateObject("Wscript.Shell") shell.Run "\\(マシン名)\C$test\test.bat" set shell = nothing =============

  • WMIスクリプトを使用してMACアドレスをASPで取得

    タイトルの通りですが、 WMIスクリプトを使用して、 ASPでMACアドレスの取得を行なっているのですが、 なかなか上手くいきません。 <%@ LANGUAGE="VBSCRIPT"%> <HTML> <HEAD> </HEAD> <BODY> <% Dim QfeSet Dim QfeSets Dim Qfe Dim Locator Dim Service Dim Ret on error resume next Set Locator = CreateObject("WbemScripting.SWbemLocator") Set Service = Locator.ConnectServer If Err = 0 then Set QfeSet = Service.Get("Win32_NetworkAdapterConfiguration") QfeSet.Security_.impersonationLevel = impersonate Set QfeSets = QfeSet.Instances_ End If For Each Qfe In QfeSet If Qfe.IPEnabled = True Then Ret = Qfe.MACAddress & vbCrLf Response.write("MACADDRESS:" & Ret & "<BR>") End If Next %> </BODY> </HTML> CreateObjectやService.Getのところが 原因ではないかと思うのですが・・・。 どなたか教えて戴けますでしょうか? 宜しくお願い致します。

  • vbsでループさせる

    vbsでループさせる http://nagabuchi.jugem.jp/?eid=237 で作ったバッチで常駐ソフト(自分はSkydriveとかのクラウドサービス)の起動を遅らせる事ができるようになり、めでたしめでたしなんですが、 セキュリティソフト(KasperskyInternetSecurity2013)より先に常駐ソフトが立がるのは問題だろうと思い、 上記URLで作成する.vbsを改良しようと思いました。 http://q.hatena.ne.jp/1203153427 を参考に以下に示すような感じに変更してみたものの、CreateObjectの行がうまくいきません。 KasperskyInternetSecurity2013 (実行ファイルはC:\Program Files (x86)\Kaspersky Lab\Kaspersky Internet Security 2013にあるavp.exe) が起動した後にstartup.batを起動するにはどうすればいいでしょうか? wait9s.batの中身 ping -n 9 127.0.0.1 > nul 問題の.vbsファイル Sub StartAfterKaspersky() Const program_name = "avp.exe" Dim x For x = 1 To 10 If processCheck(program_name) = Ture Then CreateObject("WScript.Shell")ws.run "cmd /c startup.bat",vbhide Else CreateObject("WScript.Shell")ws.run "cmd /c wait9s.bat",vbhide End If Next MsgBox "27秒も待ったのに、Kasperskyが起動しません。強制起動します。" CreateObject("WScript.Shell").Run program_name End Sub '//------------------------------------------------ ' プロセスが動いているかチェックする関数 '//------------------------------------------------ Function processCheck( pName ) '//------------------------------------------------ processCheck = False Dim objPWMI On Error Resume Next Set objPWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\localhost\root\cimv2") Err.Clear On Error GoTo 0 If Err.Number <> 0 Then Exit Function '接続できなかったら、終了 Dim colProc Set colProc = objPWMI.ExecQuery("Select * from Win32_Process WHERE Name='" & pName & "'") If colProc.Count > 0 Then processCheck = True End Function

  • VBSからのサーバサイドのEXEの実行

    こんにちはSHIRAOといいます。 WScript.Shellを使用してサーバにあるEXEファイルを 起動しようと思っているのですがどうもうまくいきません。WScript.Shellを使用する時に何か設定しなければならないことがあるのでしょうか? <script language="vbscript"> Function Window_OnLoad : Set objShell = WScript.CreateObject("WScript.Shell") objShell.Run "C:\WINDOWS\system32\notepad.exe" : End Function </script>

  • リモートデスクトップ接続がアクティブにならない

    職場でWindows Server 2019を利用しています。 メインとなるサーバAからサーバB、C、D…と複数台のサーバにリモートデスクトップする操作があり、バッチファイルで各サーバに接続させるような形で操作しています。 普通にアプリ一覧からリモートデスクトップ接続をするときはもちろん普通に接続できますが、バッチによる接続だとリモートデスクトップがアクティブとならずタスクバーのアイコンが点滅している状態となってしまい、手動でアクティブ表示にする必要がありました。 面倒だったのでスクリプトを作成してリモートデスクトップ接続を最小化→最大化→アクティブ化の順に操作することでアクティブになって表示されるようになりました。 ところが画面上にはアクティブとなったサーバBが表示されているのですが、サーバBでなにも操作しない状態でWindows+Eキーでエクスプローラを表示させると接続元のサーバAの内容が表示されてしまいます。 明確に接続先を操作してからでないと接続元の制御が残ってしまっているような状態です。 もちろんなにか操作をしてからにすればいいのでしょうが、気持ち悪い状態なので解決方法があればと思い、質問しました。 以下スクリプト部分です。バッチファイルはスクリプトファイルを呼び出すだけなので割愛します。なおActiveDirectoryは構成されておらずWorkgroup環境になります。 よろしくお願いします。 set ws = createobject("wscript.shell") set cs = createobject("wbemscripting.swbemlocator").connectserver '実行前MSTSCプロセスの取得(差分でpidを特定するため) set proclist = cs.execquery("select * from win32_process where caption = 'mstsc.exe'") old_cnt = proclist.count redim procid(old_cnt) i = 0 for each proc in proclist procid(i) = proc.processid next sv = "サーバA" ws.run "cmd /c start mstsc /v:" & sv, 1, false wscript.sleep 2000 '実行後MSTSCプロセスの取得 set proclist = cs.execquery("select * from win32_process where caption = 'mstsc.exe'") i = 0 for each proc in proclist old_id = 0 for i = 0 to old_cnt if proc.processid = procid(i) then old_id = 1 end if next if old_id = 0 then new_id = proc.processid end if next '最終的に確定したpidを操作 ws.appactivate new_id ws.sendkeys "%n" ws.sendkeys "%x" ws.appactivate new_id

  • BAT+VBSでのファイルZIP化処理が終わらない

    Win7・Win2008環境にて、Windowsバッチ(.bat)から、 引数に対象フォルダ・ZIPファイル作成場所を受け取って フォルダのZIP化を行うVBSスクリプトを作成しています。 下記のスクリプトをsample.vbsで作成しsample.batから実行すると ファイルがZIPファイル内に格納されておりません。(空のZIPファイル) そのため、「★★★」箇所の排他処理の関数を呼び出すようにすると ファイルがZIPファイル内に格納されるようになりましたが、 処理がいつまでも完了しません。 (コマンドプロンプトから直接コマンドライン実行すると正常終了します。) 何か間違ってますでしょうか?(そもそもフォルダのZIP化手順も含め) ご教授ほどよろしくお願い致します。 ■sample.vbs ※okwave用インデントのために全角スペース使用 ' ******************************************************* ' オブジェクト定義 ' ******************************************************* Dim fso Dim subf Dim FileName    ' ファイル名 Dim ArgDam     ' 遡り日数 Dim DifDam     ' 遡り日数との差 Dim FDate      ' ファイル作成日 Dim strTargetFolder ' ZIPファイル作成フォルダ Dim m_objShell Set m_objShell = CreateObject("Shell.Application") Set fso = CreateObject("Scripting.FileSystemObject") intOutRet = 0 ' 引数の取得********************************************* ' 引数/ZIP化対象フォルダ情報を取得 Set subf = fso.GetFolder(WScript.Arguments(0)) ' 引数/ZIPファイルの情報を取得 strTargetFolder = WScript.Arguments(1) ' ZIP化処理********************************************** If CreateZipfile(subf, strTargetFolder) = false Then   intOutRet = 1 End If ' オブジェクト開放 Set fso = Nothing WScript.Quit intOutRet ' ZIPファイルの作成************************************** Private Function CreateZipfile(subf, strTargetFolder)   Dim intFileCnt   Dim idx   On Error Resume Next   intFileCnt = 0   For Each FileName In subf.Files     intFileCnt = intFileCnt + 1   Next   'intFileCnt = intFileCnt - 1   idx = 0   Dim intNumbers() '動的配列を宣言   ReDim intNumbers(intFileCnt)   For Each FileName In subf.Files     intNumbers(idx) = FileName     idx = idx + 1   Next   '書庫ファイル作成   fso.CreateTextFile(strTargetFolder, False).Write "PK" & Chr(5) & Chr(6) & String(18, 0)   '書庫オブジェクト取得   Set l_objZIP = m_objShell.NameSpace(CStr(strTargetFolder))   '圧縮対象ファイルを取得   For Each l_strItem In intNumbers     '書庫に追加     l_objZIP.CopyHere l_strItem     '書庫が排他状態で開けるまで、処理継続・・・・・・・・★★★     Do Until IsNoOpen(l_strItem)     Loop   Next   ' 正常終了   CreateZipfile = True   exit function   On Error Goto 0   ' 異常終了   CreateZipfile = false End Function '排他チェック******************************************** Private Function IsNoOpen(p_strFileName)   'エラー無視   On Error Resume Next   WScript.Sleep 100   'ファイルを追加モードで開く/閉じる   Call fso.OpenTextFile(p_strFileName, 8, false).Close   IsNoOpen = CBool((Err.Number = 0)) End Function ■sample.bat F:\BAT\sample.vbs "F:\LOG" "F:\LOG\sample.zip" exit

  • VBSについて

    いつもありがとうございます。 現在、サーバ上の2つの共有フォルダへネットワークドライブを作成するVBSを作成しております。 動作と致しましては、VBS実行時に共有フォルダへアクセスするユーザ名とパスワードを入力するフォームを表示して、認証をパスするとネットワークドライブを作成します。 ※アカウント・パスワードは共通です。 ネット上からアドバイスをいただき、参考にして下記ソース(拙いコードで申し訳ありません)にて作成したのですが、接続に失敗した際のメッセージがうまくできません。 実現したいことは失敗した際の「ユーザ名、、またはパスワードが間違っています」を表示するようにしておりますが、ネットワークドライブ接続回分表示されます。(今回の場合は2回) 複数のネットワークに失敗した場合でも1回のみの表示にして処理を終了させたいのですが アドバイス頂けないでしょうか。(最終行付近) ----------------------------------------------------------------------------- Set objNetwork = WScript.CreateObject("WScript.Network") Set objWShell = CreateObject("wscript.shell") ' ホスト名 strComputerName = UCase(Left(objNetWork.ComputerName, 6)) ' 本スクリプト名 strScriptPath = WScript.ScriptName ' コンピュータ名から対象の学校を検索 Select Case strComputerName Case "CN3002" SchoolName = "会社A" ServerIP = "\\192.168.1.30" Drive_Letter1 = "S:" Drive_Letter2 = "T:" Drive_Letter3 = "U:" Drive_Letter4 = "V:" Drive_Letter5 = "W:" Drive_Letter6 = "X:" UNC_Path1 = ServerIP & "\共有A" UNC_Path2 = ServerIP & "\共有B" UNC_Path = Array(UNC_Path1, UNC_Path2) Drive_Letter = Array(Drive_Letter1, Drive_Letter2) Case Else Wscript.echo "対象のサーバが確認できません。" & chr(13) & "ホスト名を確認して再度実行してください。" WScript.Quit 10 End Select Set colDrives = objNetwork.EnumNetworkDrives Drive_Count = 0 ServerFlag = 0 Raku_ServerFlag = 0 For i = 0 to colDrives.Count - 1 Step 2 If Left(colDrives.Item(i + 1),15) = ServerIP Then ServerFlag = 1 End If If SchoolName = "会社B" AND Left(colDrives.Item(i + 1),15) = ServerIP2 Then Raku_ServerFlag = 1 End If Next If ServerFlag <> 1 Then call InputUser(strUser,strPassword) Raku_ServerFlag = 1 End If If SchoolName = "会社B" AND Raku_ServerFlag <> 1 Then call InputUser(strUser,strPassword) End If ' 認証のみで接続されているUNCパスへの対応 For i = 0 to colDrives.Count - 1 Step 2 Next colD_Count = i - 1 For j = 0 to UBound(Drive_Letter) Drive_Count = 0 For i = 0 to colD_Count Step 2 If Drive_Letter(j) = colDrives.Item(i) Then Drive_Count = Drive_Count +1 End If Next ' 洛陽2台目サーバ対策 If Drive_Count <> 1 AND SchoolName = "会社B" AND Drive_Letter(j) = Drive_Letter4 Then On Error Resume Next objNetwork.MapNetworkDrive Drive_Letter(j), UNC_Path(j), False, strUser, strPassword Call ErrorCheck(Err.Number) ElseIf Drive_Count <> 1 Then If ServerFlag <> 1 Then On Error Resume Next objNetwork.MapNetworkDrive Drive_Letter(j), UNC_Path(j), False, strUser, strPassword Call ErrorCheck(Err.Number) Else On Error Resume Next objNetwork.MapNetworkDrive Drive_Letter(j), UNC_Path(j), False Call ErrorCheck(Err.Number) End If End If Next ' ユーザ名とパスワードを入力 Sub InputUser(strUser,strPassword) On Error Resume Next Set objExplorer = WScript.CreateObject _ ("InternetExplorer.Application", "IE_") objExplorer.Navigate "file:///C:\WINDOWS\System32\Password.htm" objExplorer.Title = "学習系サーバ接続" objExplorer.ToolBar = 0 objExplorer.StatusBar = 0 objExplorer.Width = 400 objExplorer.Height = 200 objExplorer.Left = 300 objExplorer.Top = 200 objExplorer.Visible = 1 Do While (objExplorer.Document.Body.All.OKClicked.Value = "") Wscript.Sleep 250 Loop strUser = objExplorer.Document.Body.All.UserName.Value strPassword = objExplorer.Document.Body.All.UserPassword.Value strButton = objExplorer.Document.Body.All.OKClicked.Value objExplorer.Quit Wscript.Sleep 250 If strButton = "Cancelled" Then Wscript.Quit End If On Error Goto 0 End Sub Sub ErrorCheck(Err_Number) If Err_Number <> -2147024891 Then Select Case Err_Number Case -2147023570 Wscript.echo "ユーザー名かパスワードが間違っています。" Exit Sub Case 0 Exit sub Case Else Wscript.echo "ネットワーク状態を確認してください。" End Select End If End Sub ----------------------------------------------------------------------------- 以上、あまり良い質問ではありませんが、どうぞよろしくお願い致します。

  •  VBSの作り方がわかりません

    下記のようなVBSを使いたいのですが   テキストでなくエクセルをアクティブにしたいのですがうまくいきません   どのように直せばよいのかお教えください。  お願いいたします。 Dim excel With CreateObject("Wscript.Shell") .Run "D:\DATA\T.txt" End With On Error Resume Next Set excel = GetObject(, "Excel.Application") If Err.Number <> 0 Then Set excel = CreateObject("Excel.Application") End If excel.Visible = True excel.Workbooks.Open "D:\DATA\Sin1.xls"

専門家に質問してみよう