DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

別ユーザーで外部アプリケーションを起動する

外部アプリケーションを起動する方法は、「外部アプリケーションを起動する」で説明しました。ここではさらに、ユーザー名を指定して、別ユーザーで外部アプリケーションを起動する方法を紹介します。

ただしここで紹介している方法は、残念ながら.NET Framework 2.0以降でしかサポートされていません。.NET Framework 1.1以前では、CreateProcessWithLogonWを直接呼び出すことで可能です。

ProcessStartInfo.UserNameプロパティを使用する方法

ユーザー名を指定して外部アプリケーションを起動するには、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」としてメモ帳を起動しています。

VB.NET
コードを隠すコードを選択
'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)
C#
コードを隠すコードを選択
//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メソッドの引数に指定する方法

Process.Startメソッドの引数にユーザー名、パスワード、ドメインを指定して呼び出す方法もあります。ただしこの方法ではProcessStartInfo.WorkingDirectoryプロパティを指定できませんので、お勧めはできません。

VB.NET
コードを隠すコードを選択
'ユーザー名
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)
C#
コードを隠すコードを選択
//ユーザー名
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);

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。