人気ブログランキング | 話題のタグを見る
(.Net)アカウトを指定してProcess.Startを使うときはWorkingDirectoryプロパティを指定しないといけない
共有フォルダ上で動く.Net WindowsFormアプリ(仮にapp1)を作成しています。
その共有フォルダから、別のサーバ上の共有フォルダ上の.Netコンソールアプリ(仮にapp2)をキックし、その.Netアプリから管理者ユーザ権限でバッチ(bat1)を起動させるというカラクリを作ってました。

ところが、app2からbat1を起動させる時に、app2の Process.Start 時に下記のような例外が発生しました。

ディレクトリ名が無効です。
場所 System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)
場所 System.Diagnostics.Process.Start()
場所 app1.Program.Main(String[] args)

で、調べてみたところ別ユーザでプロセスやファイルを実行する場合(ProcessStartInfo の UserName , Password を指定した場合)は、WorkingDirectory プロパティを設定し、作業フォルダを指定しないといけないようですね。
そのことは、ProcessStartInfo.WorkingDirectory プロパティ (System.Diagnostics)にも書いてありました。

ということで、上記のapp1,app2について別プロセスを起動する部分は下記のようにコーディングしました。(C#)

■app1
int iExitCode = 0;
try{
//プロセスオブジェクト生成
Process proc = new Process();
//個人フォルダ作成ツールのパスをセット
string strPath = Properties.Settings.Default.MakePersonalDirPath;
proc.StartInfo.FileName = strPath;
//コマンドライン引数はユーザ名
proc.StartInfo.Arguments = username;
//シェルを使わない。
proc.StartInfo.UseShellExecute = false;
//プロセス起動
proc.Start();
 
//起動したプロセスが終わるまで待つ。
proc.WaitForExit();
 
iExitCode = proc.ExitCode;
}catch{
//エラー表示
return;
}
 
if (iExitCode != 0){
//エラー表示
}



■app2
//コマンドライン引数取得
string[] cmds;
cmds = System.Environment.GetCommandLineArgs();
//プロセスオブジェクト生成
Process proc = new Process();
// 起動するアプリケーションを設定する(このapp2.exeと同じフォルダのバッチファイルを指定)
proc.StartInfo.FileName =System.Windows.Forms.Application.StartupPath + @"\bat1.bat";
//ワークディレクトリの設定(これを指定しないと"ディレクトリが無効です。"の例外になることがある。)
proc.StartInfo.WorkingDirectory = System.Windows.Forms.Application.StartupPath;
// コマンドライン引数を設定する
proc.StartInfo.Arguments = cmds[1];
// 新しいウィンドウを作成するかどうかを設定する (初期値 false)
proc.StartInfo.CreateNoWindow = false;
// シェルを使用するかどうか設定する (初期値 true)
proc.StartInfo.UseShellExecute = false;
// 起動できなかった時にエラーダイアログを表示するかどうかを設定する (初期値 false)
proc.StartInfo.ErrorDialog = false;
//プロセス実行時のドメイン名(ローカルユーザの場合はnullを指定)
proc.StartInfo.Domain = "hogedomain";
//プロセス実行時のユーザ名
proc.StartInfo.UserName = "administrator";
//ユーザのパスワード
string pswwd = "passwd";
//パスワード(ProcessStartInfo.PasswordはSecureStringで指定しないといけない)
SecureString password = new SecureString();
foreach (char c in pswwd.ToCharArray())
{
//SecureStringの文字追加
password.AppendChar(c);
}
//プロセス実行時のユーザのパスワード指定
proc.StartInfo.Password = password;
// 起動時のウィンドウの状態を設定する
proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; //通常
 
// 起動する
proc.Start();
//起動したプロセスが終わるまで待つ。(60秒待つ)
proc.WaitForExit(60000);


参考:
ネットワーク上にあるファイルの実行について
by jehoshaphat | 2010-11-01 21:23 | .Net開発


<< (.Net)DotNetZip... (VisualStudio)コ... >>