2017-07-12 4 views
0

私は自分のアプリケーションに助けが必要なので、更新ボタンを押すといくつかの機能を実行するPsExecファイルを実行するアプリケーションを作成した。私のマシンでローカルでうまくいくという問題が起こりますが、私のアプリケーションは多くのユーザーに共有されます。 PsExecファイルをすべてのユーザーにコンピュータにインストールしたくない場合は、自分のプログラムを自分のコンピュータにインストールして問題なくプログラムを実行するだけです。C#Windowsアプリケーションのフルパスを知らずにPsExecを実行する。

私のコードはすべてのアプリケーションに対応しています。プログラム全体がPathを知らずにPsExecを呼び出すコードを追加するだけです。今はPsExecファイルをDebugフォルダにインストールしました。私のプロジェクトにあります。

ので、代わりに私のディレクトリにある全PsExecはパスを使用して、私はこの

string leMars21StArguments = @"/C C:\PowerShellRemotly\PsExec.exe " + 
    @"-i \\VML-2012-QBOOK2 -u mydomain\" + userInfo.Username + " -p " + 
    userInfo.Password + " -d C:\\batch\\myfile.bat"; 

を使用したくない

私が何かをしたいと思います私のプロジェクトのいずれかを使用するようになりますこのようなプロジェクトのデバッグフォルダーが、動作しません。これを行う別のものはありますか?

string leMars21StArguments = @"/C Debug\PsExec.exe " + 
    @"-i \\VML-2012-QBOOK2 -u mydomain\" + userInfo.Username + " -p " + 
    userInfo.Password + " -d C:\\batch\\myfile.bat"; 

ここでは完全なコードは次のとおりです。

Process p = new Process();      

//assigned from the form txtboxes to the UserInformation class 
userInfo.Username = txt_Username.Text; 
userInfo.Password = txt_Password.Text; 

//string variabes for the cmd arguments 
string leMars21StArguments = @"/C C:\PowerShellRemotly\PsExec.exe -i " + 
    @"\\VML-2012-QBOOK2 -u mydomain\" + userInfo.Username + " -p " + 
    userInfo.Password + " -d C:\\batch\\myfile.bat"; 

if (userInfo.Username == string.Empty) 
{ 
    MessageBox.Show("Username cannot be null, please try again"); 
} 

if (userInfo.Password == string.Empty) 
{ 
    MessageBox.Show("Password cannot be null, please try again"); 
} 

if (cmb_DatabaseSelection.SelectedItem == "location") 
{ 
    p.StartInfo.FileName = "cmd.exe"; 
    p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    p.StartInfo.CreateNoWindow = true; 
    p.StartInfo.Arguments = leMars21StArguments; 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.UseShellExecute = false; 
    p.StartInfo.RedirectStandardError = true; 

    p.Start(); 
    string output = p.StandardOutput.ReadToEnd(); 
    string errOutput = p.StandardError.ReadToEnd(); 
    p.Close(); 

    MessageBox.Show(errOutput); 
} 
+0

つまり、あなたのプログラムでPSEXEC.EXEを含めるするつもりはないですか?彼らはそれを持っていない場合はどうなりますか? –

+0

はいプログラムにPsExecプログラムが追加されました。使用するためにディレクトリパス全体を追加せずに使用したいと思っています。私は自分のプロジェクトにインストーラプログラムを作って、ファイルが常にプロジェクト内にあるようにします。 – AndresBryan29

答えて

0

あなたがプログラムに追加した場合、あなたはちょうどあなたがそれを置くあなたの.exeファイルに対する位置を参照することができます。例えば

、あなたのプロジェクトに「ツール」と呼ばれる新しいフォルダを追加し、そこにPSEXEC.EXEを追加し、「新しい場合はコピー」に設定している場合(「常にコピー」または):

enter image description here

次に、あなたは常にあなたの.exeファイルが入っているディレクトリをつかみ、「ツール」フォルダ(あなたはAssembly.GetExecutingAssemblyを使用するSystem.Reflectionへの参照が必要になります。注)に移動し、それへのパスを取得することができます:

var thisExeDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
var psExecPath = Path.Combine(thisExeDirectory, "Tools", "psexec.exe"); 

eとしてXAMPLE:

var userInfo = new UserInfo {Password = "LetMeIn", Username = "rufusl"}; 
var thisExeDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 
var psExePath = Path.Combine(thisExeDirectory, "Tools", "psexec.exe"); 

var leMars21StArguments = 
    "/C \"" + psExePath + @""" -i \\VML-2012-QBOOK2 -u mydomain\" + userInfo.Username + 
    " -p " + userInfo.Password + @" -d C:\batch\myfile.bat"; 

Console.WriteLine(leMars21StArguments); 

出力

enter image description here

+0

こんにちはルーファス、ありがとう、しかし、今私は次のエラーが表示されます – AndresBryan29

+0

C:\ユーザー\ aluna \ Documents \ Visualは、内部または外部のコマンドとして認識されません。操作可能なプログラムまたはバッチファイル。私は、文字列leMars21StArgumentsをp.StartInfo = leMars21StArgumentsに追加しました。何らかの理由で私が上記で追加したエラーを私に与えています。何がエラーなのか教えてください。私はまた、C#Windowsアプリケーションフォームアプリケーションではなく、C#コンソールプロジェクトを行っています。 – AndresBryan29

+0

このRufusのアップデートはありますか? – AndresBryan29

関連する問題