2012-09-04 109 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); 
    } 

只是傳遞所有的命令行參數作爲第二個參數。