外部アプリケーションを起動する方法は、「外部アプリケーションを起動する」で説明しました。ここではさらに、ユーザー名を指定して、別ユーザーで外部アプリケーションを起動する方法を紹介します。
ただしここで紹介している方法は、残念ながら.NET Framework 2.0以降でしかサポートされていません。.NET Framework 1.1以前では、CreateProcessWithLogonWを直接呼び出すことで可能です。
ユーザー名を指定して外部アプリケーションを起動するには、ProcessStartInfo.UserNameプロパティにユーザー名、ProcessStartInfo.Passwordプロパティにパスワード、ProcessStartInfo.Domainプロパティにドメインを設定して、Process.Startメソッドを呼び出します。この時、ProcessStartInfo.UseShellExecuteプロパティは必ずFalseにします。
また、ProcessStartInfo.WorkingDirectoryプロパティに作業ディレクトリを指定します。これを指定していない(nullか空白文字列)と、作業ディレクトリはEnvironment.CurrentDirectoryになります。UserNameプロパティに指定されたユーザーが作業ディレクトリへのアクセスを許可されていない場合、例外Win32Exceptionがスローされます。よって、WorkingDirectoryプロパティは明確に指定しておいた方が良いです。
補足:MSDNにはWorkingDirectoryプロパティが設定されていないと作業ディレクトリは「%SYSTEMROOT%\system32」になるとありますが、正しくないようです。
もし、ユーザーのプロファイルをロードするなら、ProcessStartInfo.LoadUserProfileプロパティをTrueにします。しかしロードには時間がかかるため、必要なければFalseのままにしておきます。
Domainプロパティには、アカウントが登録されているドメインまたはサーバーを指定します。ローカルアカウントの場合は、nullでOKです。UserNameプロパティがUPN形式の場合もnullにします。
Passwordプロパティには文字列ではなく、SecureStringオブジェクトを指定します。文字列のパスワードをSecureStringオブジェクトに変換する方法は、下の例をご覧ください。
補足:ProcessStartInfo.UserNameプロパティを使った時、CreateProcessWithLogonWを使用して実行ファイルを実行します。よって、CreateProcessWithLogonWの説明や注意事項がほぼそのまま当てはまります。
下の例では、ユーザー名「username」、パスワード「password」としてメモ帳を起動しています。
'ProcessStartInfoオブジェクトを作成する Dim psi As New System.Diagnostics.ProcessStartInfo() '起動するアプリケーションの実行ファイルのパスを設定する psi.FileName = "notepad.exe" 'ユーザー名を設定する psi.UserName = "username" 'パスワードを設定する Dim pwd As String = "password" '文字列をSecureStringに変換する Dim ssPwd As New System.Security.SecureString() For Each c As Char In pwd ssPwd.AppendChar(c) Next psi.Password = ssPwd 'ドメインを設定する。ローカルアカウントの場合はnullでよい。 psi.Domain = Nothing 'アクセスが許可されている作業ディレクトリを設定する psi.WorkingDirectory = "C:\temp" 'UseShellExecuteはFalseにする psi.UseShellExecute = False 'アプリケーションを起動する Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(psi)
//ProcessStartInfoオブジェクトを作成する System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo(); //起動するアプリケーションの実行ファイルのパスを設定する psi.FileName = "notepad.exe"; //ユーザー名を設定する psi.UserName = "username"; //パスワードを設定する string pwd = "password"; //文字列をSecureStringに変換する System.Security.SecureString ssPwd = new System.Security.SecureString(); foreach (char c in pwd) { ssPwd.AppendChar(c); } psi.Password = ssPwd; //ドメインを設定する。ローカルアカウントの場合はnullでよい。 psi.Domain = null; //アクセスが許可されている作業ディレクトリを設定する psi.WorkingDirectory = @"C:\temp"; //UseShellExecuteはFalseにする psi.UseShellExecute = false; //アプリケーションを起動する System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
Process.Startメソッドの引数にユーザー名、パスワード、ドメインを指定して呼び出す方法もあります。ただしこの方法ではProcessStartInfo.WorkingDirectoryプロパティを指定できませんので、お勧めはできません。
'ユーザー名 Dim userName As String = "username" 'パスワード Dim pwd As String = "password" '文字列をSecureStringに変換する Dim ssPwd As New System.Security.SecureString() For Each c As Char In pwd ssPwd.AppendChar(c) Next 'ドメイン Dim domain As String = Nothing 'ユーザー名を指定して、メモ帳を起動する System.Diagnostics.Process.Start("notepad.exe", userName, ssPwd, domain) 'コマンドライン引数を指定して起動すると、次のようになる System.Diagnostics.Process.Start("notepad.exe", "C:\test\1.txt", _ userName, ssPwd, domain)
//ユーザー名 string userName = "username"; //パスワード string pwd = "password"; //文字列をSecureStringに変換する System.Security.SecureString ssPwd = new System.Security.SecureString(); foreach (char c in pwd) { ssPwd.AppendChar(c); } //ドメイン string domain = null; //ユーザー名を指定して、メモ帳を起動する System.Diagnostics.Process.Start("notepad.exe", userName, ssPwd, domain); //コマンドライン引数を指定して起動すると、次のようになる System.Diagnostics.Process.Start("notepad.exe", @"C:\test\1.txt", userName, ssPwd, domain);