3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.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);

参考:

ネットワーク上にあるファイルの実行について