前回の続き的に…。
これまた覚え書き程度のメモです。
概要
VisualBasicにて、別プログラムを起動するコードはよく知られていて簡単。
別のユーザーとして起動させる場合も、比較的簡単。[こちら][link-1]
管理者ユーザーで起動させるとなると、[こちら][link-2]のようなやり方が必要になります。
で、今回は、一般ユーザーからアプリケーションを起動させ、管理者ユーザー(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][link-1]
[link-1]:http://dobon.net/vb/dotnet/process/startwithusername.html
管理者としてほかのアプリケーションを実行するには?
[http://www.atmarkit.co.jp/fdotnet/dotnettips/954uacrunas/uacrunas.html
][link-2]
[link-2]:http://www.atmarkit.co.jp/fdotnet/dotnettips/954uacrunas/uacrunas.html