1

我有(在设置从调试器复制,以确保这是实际传递给命令的内容):

process.StartInfo.FileName = "C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\signtool.exe"

process.StartInfo.Arguments = " sign /f \"C:\\Users\\...\\myPfx.pfx\" /p \"myPassword\" \"C:\\Users\\...\\Desktop\\app.exe\""

但是当我Start()使用它时,它不会签署应用程序。(当我将 signtool 复制到该文件夹​​并手动执行时 - 它可以工作。)因此,为了调试,我尝试了:

System.Diagnostics.Process.Start(@"cmd.exe", @" /k " + "\"" + process.StartInfo.FileName + "\"" + " " + "\"" + process.StartInfo.Arguments + "\"");

但我得到:

'C:\Program' 不是内部或外部命令、可运行程序或批处理文件。

那么我如何让签名工作(或者至少是cmd,所以我将能够看到究竟是什么问题)?

编辑:谢谢大家。问题的答案如下 - 缺少引号。尽管我在发布问题之前确实尝试过(-在所有内容中添加引号) - 它当时没有用。事实证明,我在引号和实际参数之间添加了一些空格。所以似乎这会导致错误。

4

3 回答 3

3

您的文件名需要被引用

process.StartInfo.FileName = "\"C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\signtool.exe\""

编辑

尝试改用这个,它适用于我的虚拟文件

string filename = "\"C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\signtool.exe\""
string arguments = "sign /f \"C:\\Users\\...\\myPfx.pfx\" /p \"myPassword\" \"C:\\Users\\...\\Desktop\\app.exe\""
Process.Start("cmd.exe /k " + filename + " " + arguments)
于 2012-11-20T12:02:06.773 回答
1

请试试这个,自己创建一个 ProcessStartInfo 对象,然后将 Process 的 StartInfo 设置为您的新对象:

ProcessStartInfo startInfo = new ProcessStartInfo();

string filename = "\"C:\\Program Files\\Microsoft SDKs\\Windows\\v7.1\\Bin\\signtool.exe\""
string arguments = " sign /f \"C:\\Users\\...\\myPfx.pfx\" /p \"myPassword\" \"C:\\Users\\...\\Desktop\\app.exe\""
startInfo.Arguments = filename + arguments;
startInfo.FileName = "cmd.exe";
startInfo.UseShellExecute = false;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;

startInfo.WorkingDirectory = "set your working directory here";
Process p = new Process();

p.StartInfo = startInfo;
p.Start();

string output = p.StandardOutput.ReadToEnd();
string error = p.StandardError.
//Instrumentation.Log(LogTypes.ProgramOutput, output);
//Instrumentation.Log(LogTypes.StandardError, error);

p.WaitForExit();

if (p.ExitCode == 0) 
{        
    // log success;
}
else
{
    // log failure;
}
于 2012-11-20T12:22:35.173 回答
0

您可能需要将 WorkingDirectory 属性设置为桌面(您的 app.exe 所在的位置),并将“app.exe”(不带路径)传递给 arguments 属性。

于 2012-11-20T12:12:23.313 回答