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のプログラムが必ず管理者権限で実行されるようになります。
回答を見る
  • ベストアンサー

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のコードから行うには、どうしたらいいのでしょうか? 分かる方、教えてください。お願いします。

  • mshs
  • お礼率76% (29/38)

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.1
mshs
質問者

お礼

すみません。再度試した結果、 ユーザーの選択を要求されるダイアログはXPの環境だけで出て、 Vista以降の環境では、求めていた通りの「許可」を問うだけのダイアログになっていました。 私の勘違いでした。 OSを判断して、XPでは、RunAs を指定しないコードにすれば解決しそうです。 ありがとうございました。

mshs
質問者

補足

回答ありがとうございます。 「runas」は、既に試しています。 しかし、Vista以降の環境でこのオプションを使って実行すると 「他のユーザーとして実行する」という旨の ユーザー名とパスワードを入力させるダイアログが表示されてしまいます。 例えばVista以降のPCで、右クリックして「管理者として実行」を選んでも 管理者のユーザー名とパスワードを入力させるダイアログは表示されません。 「許可」か「拒否」かだけを問う画面が表示されるだけです。 その様にしたいのです。

関連するQ&A

  • VB.NETでのDOSコマンドを実行について

    VB.NETでのDOSコマンドを実行について いつも大変お世話になっています。 VB.NET上でバイナリデータを DOSコマンド「copy」で結合させたいのですが うまくいきません。ご助言ください。 Dim results As String Dim psi As New System.Diagnostics.ProcessStartInfo() 'ComSpecのパスを取得する psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec") '出力を読み取れるようにする psi.RedirectStandardInput = False psi.RedirectStandardOutput = True psi.UseShellExecute = False 'ウィンドウを表示しないようにする psi.CreateNoWindow = True 'コマンドラインを指定("/c"は実行後閉じるために必要) psi.Arguments = _ "/c copy /b /y "C:\Program Files\test\Data\out0001.bin"+"C:\Program Files\test\Data\out0002.bin" "C:\Program Files\test\Data\TEST.jpg"" '※コマンドの前後のダブルクォーテーションを省き、コマンドプロンプトで ' 直接実行した場合は成功しました。 '起動 Dim p As System.Diagnostics.Process=_ System.Diagnostics.Process.Start(psi) '出力を読み取る results = p.StandardOutput.ReadToEnd '出力された結果を表示 Console.WriteLine(results) 'WaitForExitはReadToEndの後である必要がある '(親プロセス、子プロセスでブロック防止のため) p.WaitForExit()

  • 【VB2005】コンソールアプリ実行時のコマンドプロンプトの非表示方法

    22歳男性です。 vb2005で開発してます。 コンソールアプリケーション実行時に表示されるコマンドプロンプトを非表示(タスクバーにも表示されない)にしたいのですがやり方がわかりません。 私が調べたところ「System.Diagnostics.Process」クラスを使用すると外部アプリ(コマンドプロンプトなど)の操作はできるようです。ですが、私は外部アプリの操作ではなく、実行ファイル自身が実行時に表示するコマンドプロンプトを非表示にしたいので、「System.Diagnostics.Process」クラスでは実現不可と考えています。 それと、このことを実現するために、新たに実行ファイルを作るのではなく、あくまで既存の実行ファイルに「コマンドプロンプトを非表示にする」コードを埋め込むことを理想としています。そのため、実行ファイルが2つ以上になる(実際に実行するファイルと、その実行ファイルのコマンドプロンプトを操作する実行ファイル)ような考えは求めてません。 もし知っている方がいらっしゃいましたら、「使用するクラス」「具体的なコード」などを記述していただけたらありがたいです。 宜しくお願いします。

  • VB.NETでDOSコマンドの複数実行

    VB.NETでバッチファイルを使わずにDOSコマンドの複数実行をしたいのですが、 試しに Dim results As String 'ComSpecのパスを取得する psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec") '出力を読み取れるようにする psi.RedirectStandardInput = False psi.RedirectStandardOutput = True psi.UseShellExecute = False 'ウィンドウを表示しないようにする psi.CreateNoWindow = True 'コマンドラインを指定("/c"は実行後閉じるために必要) 'psi.Arguments = "/c " & asCmd & " /w" psi.Arguments = "/c " & "CD C:\" & " /w" '起動 p = System.Diagnostics.Process.Start(psi) '出力を読み取る results = p.StandardOutput.ReadToEnd '出力された結果を表示 Console.WriteLine(results) psi.Arguments = "/c " & "DIR" & " /w" '起動 p = System.Diagnostics.Process.Start(psi) '出力を読み取る results = p.StandardOutput.ReadToEnd '出力された結果を表示 Console.WriteLine(results) 'WaitForExitはReadToEndの後である必要がある '(親プロセス、子プロセスでブロック防止のため) p.WaitForExit() というプログラムを作成したのですが、DIRは実行されるのですが、 Cドライブに移動ができません。   何が悪いのでしょうか? 実現できる方法があればご教授ください。

  • 管理者として実行できません

    標準ユーザでログオンしています スタートアップのコマンドプロンプトを管理者として実行しましたが タイトルバーに管理者:コマンドプロンプトの表示がなくて管理者権限がありません ご教授おねがいします

  • コマンドプロンプトを管理者として実行する方法

    Windows Vistaです。コマンドプロンプトでsfc /scannowを実行しようとすると、「SFCユーティリティを使うには管理者でコンソールセッションを実行していなければなりません」となります。 コントロールパネルからアカウントの種類を確認すると、アドミニ(管理者)になっています。でも管理者権限になっていないのかな?と思い、プログラムの実行からコマンドプロンプトを右クリックでウィンドウを表示させても「管理者として実行」の項目も出ません。 またコマンドプロンプトのショートカットを作ってそのプロパティから「管理者として実行」にチェックを入れてショートカットを実行しても同じ結果になるのです。 またコマンドプロンプトの実行画面で、E:\Windows\System32> から、sfc /scannowを実行しようとしても、E:\Users\(ユーザー名)> から、sfc /scannowを実行しようとしても同じ結果になります。 これは管理者として実行できていないのでしょうが、一体どうしたら管理者として実行できるのかわからず困っています。

  • 【VB.NET】コマンドプロンプトの操作について

     今晩は、質問させていただきます。どうぞよろしくお願いいたします。  環境: VB2008 Express Edition + Win7(もしくはVistaもしくはXP)  でございます。  VBからコマンドプロンプト(あまり使い方を存じません)を操作できているかどうか テストする為に、下記のように操作させてみましたがうまくいきません。。   ・Debugフォルダにコマンドプロンプトを起動    →コマンドプロンプトの内容表示(←成功)   ・Debugフォルダにコマンドプロンプトを起動    →「cd ../ 」    →コマンドプロンプトの内容表示(←何故か何も表示されません。)  http://soudan1.biglobe.ne.jp/qa5873147.html を参考にさせていただいて、コーディングいたしました↓   Dim psi As New System.Diagnostics.ProcessStartInfo()   psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec")   psi.RedirectStandardInput = False '出力を読み取れるようにする   psi.RedirectStandardOutput = True   psi.UseShellExecute = False   psi.CreateNoWindow = True 'ウィンドウを表示しないようにする    'コマンドラインを指定   psi.Arguments = "/c cd ../"  '←ここです。   Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi) '起動   Threading.Thread.Sleep(1000)   Do     results = p.StandardOutput.ReadLine     temp = temp & results     Application.DoEvents()     cnt = cnt + 1   Loop Until cnt = 1000   p.WaitForExit()   MsgBox(temp)  最後のMsgBoxに何も文字が表示されません。。。  コード中の「ここです」の行をコメントアウトいたしますと、最後のMsgBoxに 「Microsoft Windows XP ~D:\~bin\Debug>」 とフォルダ名が表示できます。  psi.Arguments = "/c cd ../" がちゃんと送れていないのでございましょうか??  色々と試行錯誤しておりますが、うまくいきません。 試しにpsi.CreateNoWindow = False などとしてみても一瞬で画面が消えてしまうため うまくバグ取りの打開策が見いだせておりません。  もしお詳しい方がいらっしゃいましたら是非ともアドバイスいただけないでしょうか。 どうぞよろしくお願いいたします。

  • Vistaの「管理者として実行」について質問です。

    Vistaの「管理者として実行」について質問です。 VistaのUACを有効にしていて、アプリケーションを起動させるときに右クリックで「管理者として実行」を選んで実行しています。 これをマウス操作ではなく、例えばバッチファイルとして実行させることはできないでしょうか? RUNASを使って管理者として実行しても違った結果になってしまうんですよね。 例えばコマンドプロンプトを起動するときもウィンドウタイトルはRUNAS起動だと「cmd("管理者権限ユーザ"として実行中)」、右クリック→管理者として実行だと「管理者」となって微妙に違いますし。 右クリック~をやるのはいいのですが、手間なので簡単にできないものでしょうか?

  • VB.NETからPerlを呼び出す

    メール自動送信機能をPerlで作成しました。 (仮にhello.plとします)hello.plを「C:\」においています。 コマンドプロンプトから次のようにperlコマンドを実行してた場合、 メールが自動送信されたことは確認できています。 perl hello.pl 同じようにVB.NETから実行したいのですが、上手くいきません。 ソース記述は以下の通りです。 Dim p As System.Diagnostics.Process = _ System.Diagnostics.Process.Start("C:\hello.pl") p.WaitForExit() どなたか分かる方がいらしたら、教えてください。

  • コマンドプロンプトの出力をテキストボックスへ表示する方法について

    コマンドプロンプトの出力をテキストボックスへ表示する方法について 現在、VBを使ったプログラミングを行っています。 以下に質問内容を示しますので、回答を宜しくお願いします。 <環境> OS:Windows XP 開発ソフト:VB2008 express edition 質問:コマンドプロンプトの出力をテキストボックスへ表示する方法について リダイレクトを使って、コマンドプロンプトの出力結果をVBのフォーム上(テキストボックス) に表示したいのですが、常に出力が更新されるコマンドの場合、実行後にフリーズが起きてしまいます。 以下の例ではpingを送っていますが、テキストボックスには常にコマンドの出力結果が更新されません。(実行が終わるまで待つ必要がある) 理想としては、pingコマンドを実行したときの結果が、そのままテキストボックス上にリアルタイムに表示されることです。 リアルタイムにテキストボックスにコマンドプロンプトの結果を表示するには、 どのような設定が必要になるのでしょうか? ご教授願います。宜しくお願いします。 ----- 以下サンプルソース ----- Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim results As String Dim psi As New System.Diagnostics.ProcessStartInfo() 'ComSpecのパスを取得する psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec") '出力を読み取れるようにする psi.RedirectStandardInput = False psi.RedirectStandardOutput = True psi.UseShellExecute = False 'ウィンドウを表示しないようにする psi.CreateNoWindow = True 'コマンドラインを指定("/c"は実行後閉じるために必要) psi.Arguments = "/c ping 192.168.1.1" '起動 Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi) '出力を読み取る results = p.StandardOutput.ReadToEnd '出力された結果を表示 TextBox1.Text = results 'WaitForExitはReadToEndの後である必要がある '(親プロセス、子プロセスでブロック防止のため) p.WaitForExit() End Sub End Class

  • 管理者として実行できない

    現状 OS:WindowsVISTA HomePremium SP2 コマンドプロンプトをはじめとしたどのソフトにおいても”管理者として実行”ができません。 コマンドプロンプトにおいては、”管理者:コマンドプロンプト”になりません。 右クリックからの”管理者として実行”はもちろん、 プロパティ→ショートカット→詳細設定→管理者として実行にチェックを入れてもダメ プロパティ→互換性→特権レベルはグレーのまま です。 こうした状態になる前に、 ・ウイルスバスター2011をインストールした ・GlaryUtilitiesでメンテを行った  →その後Windows立ち上げ時に”GlaryUtilitiesInitializeは動作を停止しました”というメッセージが出るようになってしまいました。 ウイルスバスター2011→ツール→システムチューナーを行っていたので ある地点まで復元させましたがダメでした。 是非よろしくお願い致します。