2012-09-04 92 views
0

嗨我试图加密使用GPG即时通讯能够从命令行执行的zip。当我将它整合到C#应用程序中时,它运行良好。但是,当我用Windows服务整合它,我得到错误的gpg2.exe关闭从c#运行gpg.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 

以下是我使用的加密

公共代码布尔加密(串inRecipient,串的资源文件,串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; 

}

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

在此先感谢!

+0

什么是'HomeDirectory',你是否以系统用户身份作为用户运行服务? –

回答

1

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

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

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

+0

嗨马克,你是对的,它证明是一个用户上下文问题。我已安装GPG是我的用户帐户,本地管理员无法访问该路径,第二个问题是我从我的useraccount创建了GPG密钥,该服务无法从管理员帐户中找到该密钥。我已将应用程序用户上下文更改为我的用户帐户,并且工作正常! – Umamaheswaran

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); 
    } 

只是传递所有的命令行参数作为第二个参数。