※ ChatGPTを利用し、要約された質問です(原文:VBプログラムから「管理者として実行」したい)
VBプログラムから「管理者として実行」する方法
このQ&Aのポイント
VBプログラムから「管理者として実行」する方法を学びましょう。VBプログラムでコマンドプロンプトを起動し、特定のコマンドを実行するためには、管理者権限が必要です。XPでは問題ありませんが、Vista以降では手作業ではなくVBのコードから実行するためには、特別な手順が必要です。
一般的な方法として、VBのコードから「管理者として実行」するためには、System.Diagnostics.ProcessStartInfoオブジェクトを使用します。VBコード内で、このオブジェクトを作成し、必要なプロパティを設定します。例えば、FileNameプロパティにコマンドプロンプトのパスを指定し、Argumentsプロパティに実行したいコマンドを指定します。さらに、UseShellExecuteプロパティをFalseに設定することで、シェルの実行を回避し、CreateNoWindowプロパティをTrueに設定することで、コマンドプロンプトのウィンドウを表示しないようにします。
VBのコードから「管理者として実行」する場合、XPでは問題ありませんが、Vista以降ではUAC(ユーザーアカウント制御)の制約により、VBのプロセス自体を管理者として実行する必要があります。そのため、VBのプロジェクトのマニフェストファイルに、<requestedExecutionLevel level="requireAdministrator"/>を追加する必要があります。これにより、VBのプログラムが必ず管理者権限で実行されるようになります。
コマンドプロンプトで実行したいコマンドが
「route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***」 (*は、任意のIP)
だとします。
XPでは問題ないですが、Vista以降だと、管理者権限が必要なコマンドのため、
そもそもコマンドプロンプト自体を「管理者として実行」モードで起動する必要があります。
上記を、手作業で行う場合は、それで解決しますが、
同じ事を、VBのコードから実行したい場合、
System.Diagnostics.Process.Start
を使い、(以下サンプルコード)
---------------------------
Dim psi As New System.Diagnostics.ProcessStartInfo()
psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")
psi.UseShellExecute = False
psi.CreateNoWindow = True
psi.Arguments = "/c route add ***.***.***.*** mask 255.255.255.255 ***.***.***.***"
Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)
p.WaitForExit()
-----------------------------------------------------------
とすると、XPでは、管理者権限を問われないので実行できますが、
Vista以降だと、コマンドが管理者権限で実行されていないためか実行が完了せず、コマンドの内容も行われていません。(route addコマンドの記述にミスは無いとします。)
Vista以降の場合、手作業で、コマンドプロンプトを右クリックして「管理者として実行」を選んで起動し、コマンドを実行するのと同じ事を、
VBのコードから行うには、どうしたらいいのでしょうか?
分かる方、教えてください。お願いします。
お礼
すみません。再度試した結果、 ユーザーの選択を要求されるダイアログはXPの環境だけで出て、 Vista以降の環境では、求めていた通りの「許可」を問うだけのダイアログになっていました。 私の勘違いでした。 OSを判断して、XPでは、RunAs を指定しないコードにすれば解決しそうです。 ありがとうございました。
補足
回答ありがとうございます。 「runas」は、既に試しています。 しかし、Vista以降の環境でこのオプションを使って実行すると 「他のユーザーとして実行する」という旨の ユーザー名とパスワードを入力させるダイアログが表示されてしまいます。 例えばVista以降のPCで、右クリックして「管理者として実行」を選んでも 管理者のユーザー名とパスワードを入力させるダイアログは表示されません。 「許可」か「拒否」かだけを問う画面が表示されるだけです。 その様にしたいのです。