none
UAC表示後、MsgBoxの表示がうまくいかない RRS feed

  • 質問

  • 簡単な処理をするツールを、VBScriptで作成してWindows XPで利用していました。
    そして、Vistaでもツールを共用するために、ツールの冒頭でOSの種別をチェックし、Vistaの場合は管理者権限へ昇格させる処理を入れました。
    (ツールの途中でUACの警告が出ることを避けるためで、他の方が紹介されていたものを利用させてもらいました)
    しかし、Vistaでこのツールを実行すると、UACの警告で「続行」をクリックした後、MsgBoxで表示しているウィンドウが他ウィンドウに隠れてしまうという現象が発生し、困っています。
    回避方法をご存じの方がいらっしゃいましたら、ご教授のほどお願いいたします。

    以下、コードの抜粋です。

    ----------------------------------

    Dim objWMI, objShell, osInfo, os
     
    ' Vistaかどうかチェックし管理者権限に昇格させる
    do while WScript.Arguments.Count = 0 and WScript.Version >= 5.7
        Set objWMI = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
        Set osInfo = objWMI.ExecQuery("SELECT * FROM Win32_OperatingSystem")
     
        For Each os in osInfo
            If left(os.Version, 3) < 6.0 Then exit do
        Next
       
        ' 引数付きでwscriptを管理者権限で再実行
        Set objShell=CreateObject("Shell.Application") 
        objShell.ShellExecute "wscript.exe", Chr(34) & WScript.ScriptFullName & Chr(34) & " uac","","runas"
        WScript.Quit
    loop

    msgbox "ツールが処理を開始します"

    ----------------------------------

    • 移動 山本春海 2012年7月9日 4:14 より適切と思われるカテゴリに移動しました。 (移動元:Visual Basic)
    2012年7月7日 6:32

回答

  • Windows95 以降の Windows の仕様で、前面に出せるウィンドウはユーザの操作が起点になったウィンドウと、そのウィンドウから表示されるウィンドウだけになっています。

    上記のスクリプトが起動しているスクリプトの冒頭にある場合、Elevated なスクリプトの MsgBox にはその権限がないので、前面に表示されることはありません。(前面に出そうとしても、タスクバーでタイトルがフラッシュする状態までです)

    前面に表示されるシステム的な要件としては MSDN の SetForeground API http://msdn.microsoft.com/library/cc411039.aspx 等の解説や、各種検索エンジンなんかを利用して確認してもらえればと思いますが、今回の場合に該当することは

    • 1度も入力を受け取ったことのないアプリケーションから起動した別のアプリケーションは、前面に表示されない。

    という条件にひかっかったと思います。(未確認です)

    これがはずしていないなら、ShellExecute の前に MsgBox "このプログラムの実行には管理者権限が必要なため、昇格を実行します。" みたいなものを追加することができるなら、こんな対応で解決するのではないか?と思います。

    • 回答としてマーク nobhero 2012年7月9日 10:03
    2012年7月9日 5:04

すべての返信

  • Windows95 以降の Windows の仕様で、前面に出せるウィンドウはユーザの操作が起点になったウィンドウと、そのウィンドウから表示されるウィンドウだけになっています。

    上記のスクリプトが起動しているスクリプトの冒頭にある場合、Elevated なスクリプトの MsgBox にはその権限がないので、前面に表示されることはありません。(前面に出そうとしても、タスクバーでタイトルがフラッシュする状態までです)

    前面に表示されるシステム的な要件としては MSDN の SetForeground API http://msdn.microsoft.com/library/cc411039.aspx 等の解説や、各種検索エンジンなんかを利用して確認してもらえればと思いますが、今回の場合に該当することは

    • 1度も入力を受け取ったことのないアプリケーションから起動した別のアプリケーションは、前面に表示されない。

    という条件にひかっかったと思います。(未確認です)

    これがはずしていないなら、ShellExecute の前に MsgBox "このプログラムの実行には管理者権限が必要なため、昇格を実行します。" みたいなものを追加することができるなら、こんな対応で解決するのではないか?と思います。

    • 回答としてマーク nobhero 2012年7月9日 10:03
    2012年7月9日 5:04
  • K.Takaokaさん、回避策の情報ありがとうございました。

    ShellExecute の前に MsgBox "このプログラムの実行には・・・" の処理を追加することで問題を解決することができました。

    (提示したスクリプトはツールの起動直後に実施する部分なので、ご指摘のとおりの状態です)

    MsgBoxの追加ならば何の弊害も無いので本当に助かりました。ありがとうございました。

    また、山本晴海さんにカテゴリ移動していただいたおかげでもあります。ありがとうございました。

    2012年7月9日 10:00