LoginSignup
9
10

More than 5 years have passed since last update.

VBから管理者としてプロセスを起動する

Last updated at Posted at 2014-05-29

前回の続き的に…。
これまた覚え書き程度のメモです。

概要

VisualBasicにて、別プログラムを起動するコードはよく知られていて簡単。
別のユーザーとして起動させる場合も、比較的簡単。こちら
管理者ユーザーで起動させるとなると、こちらのようなやり方が必要になります。

で、今回は、一般ユーザーからアプリケーションを起動させ、管理者ユーザー(Administratorとか)でプロセスを起動し、UAC昇格までさせてしまいます。

前回、フォントのインストールをVBScriptから行うスクリプトについて書きましたが、このサンプルコードと統合することで、一般ユーザーでもWindows7にフォントをインストールできるツールを作ることが出来ます。
(というか作りました…必要に迫られて…)

サンプルコード

以下のコードは、.NET Framework2.0以上のコードです。

Public Function RunAs(ByVal strExecName As String, ByVal strArguments As String, Optional ByVal strUserName As String = "", Optional ByVal strPassword As String = "") As Boolean

    Dim psi As New System.Diagnostics.ProcessStartInfo()
    Dim p As System.Diagnostics.Process

    psi.UseShellExecute = True
    psi.Verb = "runas"
    psi.FileName = strExecName
    psi.Arguments = strArguments

    If strUserName <> "" Then
        psi.UserName = strUserName

        Dim pw As New System.Security.SecureString
        Dim ch As String
        For Each ch In strPassword.ToCharArray()
            pw.AppendChar(ch)
        Next
        psi.Password = pw
        psi.UseShellExecute = False
    End If


    RunAs = True
    Try
        p = System.Diagnostics.Process.Start(psi)
        p.WaitForExit()

    Catch ex As System.ComponentModel.Win32Exception
        Debug.Print(ex.Message)
        RunAs = False

    End Try

End Function

お急ぎの方は、上記サンプルコードを適当なモジュールに貼り付けて、アプリケーションを起動したいところで、以下のように呼び出せばOKです。

Dim blnRet As Boolean = False
blnRet = RunAs(起動するプログラムファイル, 引数が必要であればここに, ユーザー名, パスワード)

起動に成功すればTrueが返ってきます。
ちなみに、「p.WaitForExit()」としていますので、起動したプログラムが終了するまでは次のコードは実行されません。
ここら辺は、状況に応じて適宜変えた方がよいかと思います。

解説

解説するまでもないような気がしますが、ポイントは ProcessStartInfo オブジェクトの Verb プロパティに「runas」という値を設定します。
これにより、管理者として実行(UAC昇格)を行うことが出来ます。
ユーザーパスワードは、平文でセットしても認識してくれない仕様なので、SecureStringオブジェクトで暗号化します。

と、ここまで書いて気がつきましたが、最初からSecureStringオブジェクトで暗号化した文字列を入れればいいんじゃ…。
(SecureStringオブジェクトで生成したセキュリティ文字列は結構簡単に復号出来ちゃうようですが)

注意点

このやり方は、ソースコード中にパスワードを記載してしまうので、ソースコード管理には細心の注意が必要です。
パスワードを暗号化して外部ファイルに保存するなどしても、ソースコードの中身を見られてしまったら復号できたも同然…。
利便性を取るか、セキュリティを取るかは、きちんと設計する必要があります。

参考リンク

別ユーザーで外部アプリケーションを起動する
http://dobon.net/vb/dotnet/process/startwithusername.html

管理者としてほかのアプリケーションを実行するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/954uacrunas/uacrunas.html

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10