从c#运行gpg.exe时出错

时间:2012-09-04 17:37:44

标签: c# windows windows-services gnupg

您好我正在尝试使用GPG加密zip,我可以从命令行执行此操作。当我将它集成到C#应用程序中时,它运行良好。但当我将其与Windows服务集成时,我得到错误,因为 gpg2.exe已关闭

以下是例外情况

Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: gpg2.exe
  Application Version:  0.0.0.0
  Application Timestamp:    4fa14f63
  Fault Module Name:    StackHash_e51a
  Fault Module Version: 0.0.0.0
  Fault Module Timestamp:   00000000
  Exception Code:   c0000005
  Exception Offset: 00000000
  OS Version:   6.0.6002.2.2.0.272.7
  Locale ID:    1033
  Additional Information 1: e51a
  Additional Information 2: 4c0d4d78887f76d971d5d00f1f20a433
  Additional Information 3: e51a
  Additional Information 4: 4c0d4d78887f76d971d5d00f1f20a433

以下是我用来加密的代码

public bool Encrypt(string inRecipient,string sourceFile,string destinationFile) {

/// File info
FileInfo fi = new FileInfo(sourceFile);

ProcessStartInfo s = new ProcessStartInfo("cmd.exe");
s.CreateNoWindow = true;
s.UseShellExecute = false;
s.RedirectStandardInput = true;
s.RedirectStandardOutput = true;
s.RedirectStandardError = true;
s.WorkingDirectory = new FileInfo(pgpPath).DirectoryName;

bool processExited = false;

using (Process p = Process.Start(s))
{

    string recipient = " --recipient \"" + inRecipient + "\"";
    string output = " --output \"" + destinationFile + "\"";
    string encrypt = " --encrypt \"" + sourceFile + "\"";
    string homedir = " --homedir \"" + HomeDirectory + "\"";
    string cmd = "\"" + PgpPath + "\" " + recipient + output + encrypt;

    p.StandardInput.WriteLine(cmd);
    p.StandardInput.Flush();
    p.StandardInput.Close();
    processExited = p.WaitForExit(3500);
    p.Close();
}
return processExited;

}

我无法使用问题签名找到任何内容。请帮忙

提前致谢!!

2 个答案:

答案 0 :(得分:3)

如果您要使用Process,为什么不运行gpg.exe而不是cmd.exe? 我刚刚为一个项目做了这个,并且没有遇到以下问题

private static void encrypt()
    {
        //have to list full path, adding to PATH had no effect 
        ProcessStartInfo gpg = new ProcessStartInfo(
            @"C:\Program Files (x86)\GnuPT\GPG\gpg.exe",
            @"--no-options --yes --armor --recipient ""recipient"" --encrypt ""file"""
        );
        Process.Start(gpg);
    }

将所有命令行参数作为第二个参数传递。

答案 1 :(得分:1)

这很可能是由用户上下文问题引起的。可能运行服务的用户帐户无法访问您尝试加密的文件。

要测试此理论,请转到服务属性,然后在“登录”选项卡中输入您知道可以访问该文件的帐户。最好使用与运行C#应用程序相同的帐户/密码

您还应确保您的代码使用文件的完整路径进行加密,而不是相对路径。