3

特別なユーザー、ドメイン、およびパスワードを使用してプロセスを開始しています。コンソール ウィンドウを非表示にするように C# に指示しましたが、表示されます。

ここに私のコード:

Process process = new Process();
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

process.StartInfo.UserName = strUsername;
process.StartInfo.Domain = strDomain;
process.StartInfo.Password = secPassword;

process.StartInfo.FileName = "PsExec.exe";
process.StartInfo.Arguments = @"/accepteula -s \\" + strServername + @"program.exe";
process.Start();
process.WaitForExit();

別のフォーラムでいくつかのヒントを見つけることができました。

ProcessStartInfo..::.UserName および ProcessStartInfo..::.Password プロパティを設定して Start(ProcessStartInfo) メソッドを呼び出すと、アンマネージ CreateProcessWithLogonW 関数が呼び出され、CreateNoWindow プロパティ値がtrue または WindowStyle プロパティの値が Hidden です。

実は、私はこの声明にあまり満足していません...

前もって感謝します。

乾杯アレックス

4

3 に答える 3

1

結局、プロセス クラスを使用してこの psexec コンソール ウィンドウを非表示にすることはできません。psexec を使用する必要はありません。代わりに WMI のものを使用しました。

ConnectionOptions remoteConnectionOptions = new ConnectionOptions();
remoteConnectionOptions.Impersonation = ImpersonationLevel.Impersonate;
remoteConnectionOptions.EnablePrivileges = true;
remoteConnectionOptions.Authentication = AuthenticationLevel.Packet;
remoteConnectionOptions.Username = strDomain + @"\" + strUsername;
remoteConnectionOptions.SecurePassword = secPassword;

ManagementScope scope = new ManagementScope(@"\\" + strServername + @"\root\CIMV2", remoteConnectionOptions); ManagementPath p = new ManagementPath("Win32_Process");

ManagementClass classInstance = new ManagementClass(scope, p, null); object[] theProcessToRun = { "myExecutable.exe" };

classInstance.InvokeMethod("Create", theProcessToRun);
于 2013-10-24T12:01:38.707 に答える
1
            using (Process LMUTIL = new Process())
            {
                string arg1 ="argument"
                LMUTIL.StartInfo.FileName = "program.exe";
                LMUTIL.StartInfo.Arguments = arg1
                LMUTIL.StartInfo.UseShellExecute = false;
                LMUTIL.StartInfo.RedirectStandardOutput = true;
                LMUTIL.StartInfo.CreateNoWindow = true;
                LMUTIL.EnableRaisingEvents = true;
                LMUTIL.OutputDataReceived += p_WriteData;
                LMUTIL.Start();
                LMUTIL.BeginOutputReadLine();
            }

    private void p_WriteData(object sender, DataReceivedEventArgs e)
    {
        if (e.Data != null)
        {
           Debug.WriteLine(e.Data.ToString());
        }
    }

私はあなたが必要とすることをするプロジェクトからこれをまっすぐ持ち上げました。コマンド ウィンドウに表示される内容をキャプチャするには、p_WriteData イベントをサブスクライブします。

于 2013-10-18T12:27:13.610 に答える
1

私が知っているように、この問題には回避策があります。パラメータを使用して隠しコマンドを起動できます。このようなもの:

 ProcessStartInfo psi = new ProcessStartInfo("cmd.exe", String.Format("/accepteula -s \\{0}program.exe", strServername));
 psi.UseShellExecute = false;
 psi.CreateNoWindow = true;
 Process.Start(psi);
于 2013-10-18T10:25:56.880 に答える