vb.net runs gpg.exe step of job runs ok from PC but not from SQL Server Agent schedule

最后都变了- 提交于 2019-12-11 17:01:31

问题


Everything worked great from my Visual Studio on my PC running this from the Start button. When I build the executable and copied the executable to the production box and scheduled the job via SQL Server Agent on the production machine – everything worked fine to create the file, but the encryption bit does not work. The gpg.exe is here on the production server: \sql2014\c$\Program Files (x86)\GnuPG\bin

The gpg is here on my PC: C:\Program Files (x86)\GnuPG\bin

The filename.csv gets created in the proper location ok - I tested with both these names Dim Extract_File As String = “\sql2014\e$\Extracts\ProgramName\filename.csv” ‘Dim Extract_File As String = “E:\Extracts\ProgramName\filename.csv” ‘do to this from my PC I had to change the E: to a C:

This line calls the function: FileEncrypted = Encrypt_File(Extract_File, Batch_Timestamp)

Private Function Encrypt_File(File_To_Encrypt As String, Batch_Timestamp As Date)
    On Error GoTo Encrypt_File_Error
    Dim Success As Boolean = False
    Dim sourceName As String = File_To_Encrypt
    Dim gpgProcess = New Process()
    ‘Test with working directory - no effect
    ‘gpgProcess.StartInfo.UseShellExecute = False 
    'gpgProcess.StartInfo.WorkingDirectory = "\\sql2014\c$\Program Files (x86)\GnuPG\bin\"
    ‘gpgProcess.StartInfo.FileName = "gpg.exe"
    gpgProcess.StartInfo.FileName = \\sql2014\c$\Program Files (x86)\GnuPG\bin\gpg.exe  ‘This works from my PC
    ‘gpgProcess.StartInfo.FileName = \\sql2014\c$\Program Files (x86)\GnuPG\bn\gpg.exe  ‘If I change this path took the “i” out of bin I get an error:  The system cannot find the file specified
    gpgProcess.StartInfo.UseShellExecute = False 
    gpgProcess.StartInfo.CreateNoWindow = True
    gpgProcess.StartInfo.Arguments = "--batch --yes --recipient reciptname --encrypt " & sourceName
    gpgProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
    gpgProcess.Start()
    gpgProcess.WaitForExit()
    If FileExists(sourceName & ".gpg") Then
        Success = True
    End If
Encrypt_File_Exit:
    On Error Resume Next
    ‘gpgProcess.WaitForExit() moved this up to 
    gpgProcess.Close()
    Return Success
    Exit Function
Encrypt_File_Error:
    Error_Handler("SomeModule.vb", "Encrypt_File", Err, System_Output, Batch_Timestamp)
    Resume Encrypt_File_Exit
End Function

Any suggestions for how I can resolve this. When it worked on my PC it creates a filename.csv.gpg in the same directory as filename.csv. On the production server it does not create the gpg and it does not give a visible error message either.


回答1:


This is how I solved this issue. I Installed the OpenPgpLib from the NuGet Package Manager and re-wrote this Function as shown here. I created the .asc file from the Kleopatra tool and saved it in the location used in the pubkey in the code bit below. The OpenPgp is from the package.

    Private Function Encrypt_File(File_To_Encrypt As String, Log_File As String, Batch_Timestamp As Date)
        Dim Success As Boolean = False
        Dim encryptthis As String = File_To_Encrypt
        Dim thisencrypted As String = File_To_Encrypt & ".gpg"
        Dim pubkey As String = "\\sql2014\c$\Data_Programs\MyDirectory\<thepublickeyfile>.asc"
        Try
            OpenPgp.EncryptFile(encryptthis, thisencrypted, pubkey, False, False)
            If FileExists(thisencrypted) Then
                Success = True
            End If
        Catch ex As Exception
            App_Logger(Log_File, ex.StackTrace.ToString(), System_Output, Batch_Timestamp)
            Success = False
        End Try
        Return Success
    End Function


来源:https://stackoverflow.com/questions/51881002/vb-net-runs-gpg-exe-step-of-job-runs-ok-from-pc-but-not-from-sql-server-agent-sc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!