查找psql命令是否因验证用户而失败

时间:2012-09-11 06:03:41

标签: delphi postgresql psql

使用Delphi 你怎么能找到psql脚本已经返回

   password authentication has failed for user "myadmin"

运行以下脚本(psqlRun.bat)时

   "C:\Program Files\PostgreSQL\9.0\bin\psql.exe"  -h localhost -p 5433 -d TestDB -U myadmin -f someSQLscript.sql   

上面的脚本是使用shellexecute运行的

   ReturnedValue:= ShellExecute(Handle,'open',PChar('C:\psqlRun.bat'), nil, nil, SW_SHOWNORMAL);

返回值超过32(so it ran successfully) 但对我来说密码验证失败了.. 有没有办法通过delphi找到密码失败的脚本失败? 由于可能尚未创建pgpass.conf,因此我无法检查文件中的用户密码。 用户可能不知道密码或输入了错误的密码。

以编程方式如何检查身份验证是否失败?

注意:Postgresql 9.0

1 个答案:

答案 0 :(得分:3)

  

返回值超过32(因此成功运行)

不,这并不意味着它。 http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153.aspx 这只意味着它已成功启动。如果完整运行成功与否,MSDN提示无法知道使用ShellExecute / ShellExecuteEx。

您应该使用CreateProcess来获取正在运行的任务句柄,然后使用WaitFor获取结果或拦截它的输出以查找特定行。

您可以尝试Jedi代码库,其中JclSysUtils单元具有Execute函数,TJclCommandLineTool类用于封装它。 使用示例是JCL安装程序,它调用许多命令行工具,如DCC32.EXE,捕获并保存其输出到日志并检查返回代码。

PS。你最好不要使用bat文件。创建命令行并直接运行它。截至目前,你把它变成了一棵树。

 YourProg.exe
 \\-> CMD.EXE /C BAT-FILE-NAME
      \\->pgSQL exe with options

即使pgSQL.exe返回某些内容,它也不会返回到您的程序而是返回到CMD.exe 之后,CMD.exe将该代码暴露给其内部变量%ERRORLEVEL%
现在你必须要知道它是否可以将该变量传递给你的程序。

为什么?每个下一个间接级别都会使您的程序更加孤立和脆弱。只需直接调用PG EXE,无需脚本。否则你应该为CMD.EXE编程 - 你真的需要吗?