質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.37%

  • VB.NET

    1104questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

デスクトップアプリケーションから、外部アプリケーション(mstsc.exe)を起動して終了まで待機する

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,402

satou

score 12

前提・実現したいこと

フォーム上のボタンをクリックすると、『前処理、「リモートデスクトップ接続」の接続、接続終了後に、後処理』を実行する。前処理にて、既に他のPCから「リモートデスクトップ接続」がされていることが判断された場合は、接続回避をしたい。

デスクトップアプリケーション(test.exe)のフォームに「ボタンコントロール」を配置し、「ボタンコントロール」のクリックで、
(0)接続してもよいか確認する前処理を実行、
(1)外部アプリケーションとして、「リモートデスクトップ接続」(「mstsc.exe /f /V:SVname」)を実行、
(2)「リモートデスクトップ接続」のダイアログが表示される。
(3)ログインに必要な所定情報を入力し、リモートデスクトップで作業を行う。
(4)利用者が、「リモートデスクトップ接続」の接続を解く(接続終了)、
(5)所定のプログラム( MsgBox("ok")、後処理(他のPCに接続してもよい旨を知らせる))を実行
を行いたい。

なお、リモートデスクトップの取り合いを無くす方法として、
https://oshiete.goo.ne.jp/qa/1617523.html
がありますが、この方法は、利用者がバッチファイルを直接実行するもので、今回、こちらの諸事情で採用は難しい状況です。

本件は、フォーム上のボタンをクリックしたときに、外部アプリケーションとして、mstsc.exeを実行する、を前提で解決を模索しています。

発生している問題・エラーメッセージ

WaitForExit()が機能しない。
つまり、(1)の直後(5)が実行される。
(1)の実行後、数秒後に、(2)が表示される。この状態で、(3)を実行し、(4)を行っても、(5)は実行済されない(すでに実行済)。

該当のソースコード

https://dobon.net/vb/dotnet/process/openfile.html
を参考に以下のコードを作成

Private Sub btnConnect_Click(sender As Object, e As EventArgs)
        ’前処理---接続してよいか確認する----(0)

        Dim p As New Process
        p.StartInfo.FileName = "mstsc.exe" 
        p.StartInfo.Arguments = "/f /V:file_server"
        p.Start()
        p.WaitForExit()   '-------(1),(2)
        p.Close()
        MsgBox("ok") '後処理(ここでは、分かり易いようにMsgBoxとしています)------(5)
End Sub

試したこと

(1)command.com で実行
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
p.StartInfo.Arguments = " /C start /wait mstsc.exe /f /V:file_server"

(2)バッチファイル(cc.bat)を実行
Dim sw As New IO.StreamWriter("cc.bat", False, System.Text.Encoding.GetEncoding("shift_jis"))
Using sw
sw.Write(System.Environment.GetEnvironmentVariable("ComSpec") & " /C start /wait mstsc.exe /f /V:file_server")
sw.WriteLine()
sw.Close()
End Using
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
p.StartInfo.Arguments = " /C start /wait cc.bat"

いずれも、mstsc.exeの終了まで、待機しない。

補足情報(言語/FW/ツール等のバージョンなど)

windows7(64ビットOS)、Microsoft Visual Basic 2015でデスクトップアプリ(test.exe とします)を作成しています。

「mstsc.exe /f /V:SVname」の起動が遅すぎて、mstsc.exeの起動中にもかかわらず、WaitForExitが起動を検知できずに、終了と判断しているような挙動をします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

以下の MSDN Forums のスレッドによると、 mstsc.exe は自身がシステムのプラットフォームとは異なるバイナリであると認識した場合 (つまり、 64-bit 環境で 32-bit の mstsc.exe を起動した場合) 、適切な mstsc.exe を改めて起動し、自身は即座に終了してしまう動作をするようです。

Launching MSTSC using Process on 64-bit Windows in WPF application

もしもこの状況に該当している場合、プロジェクトを x64 か AnyCPU 向けに構成してビルドすると、直接 64-bit の mstsc.exe を起動し Process.WaitForExit() が動作するようになると思うので、御確認頂くと良いかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/08 00:38

    ご回答、ありがとうございます。プロジェクトのプロパティ、「コンパイル」を確認しましたところ、プラットフォーム、コンパイル オプション共に「AnyCPU」になっていましたが、その下の「32ビットを優先(P)」チェックボックスにチェックが入っていました。このチェックを外すと、Process.WaitForExit() が作動しました。このチェックボックスにチェックが入っていたため、開発環境のOSが64ビットにも関わらず、コンパイルは32となっていたようです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • VB.NET

    1104questions

    Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

  • トップ
  • VB.NETに関する質問
  • デスクトップアプリケーションから、外部アプリケーション(mstsc.exe)を起動して終了まで待機する