python在不使用cx_Oracle的情况下验证Oracle用户名/密码

python在不使用cx_Oracle的情况下验证Oracle用户名/密码,python,oracle,Python,Oracle,我需要验证用户为oracle帐户信息提供的数据是否正确。我尝试使用cx_Oracle,但无法升级的服务器上的OCI.DLL版本似乎不是cx_Oracle的正确版本 如何在不使用cx\U Oracle的情况下验证用户名/密码?问题很可能是cx\U Oracle模块的版本 安装模块时必须非常小心,以便为oracle安装选择合适的版本 如果无法使用cx_Oracle连接到数据库,则可能很难检查信息的准确性 如果安装了sql*plus,您可以尝试使用子流程模块启动流程并检查是否可以连接,但我认为,修复c

我需要验证用户为oracle帐户信息提供的数据是否正确。我尝试使用cx_Oracle,但无法升级的服务器上的OCI.DLL版本似乎不是cx_Oracle的正确版本


如何在不使用cx\U Oracle的情况下验证用户名/密码?

问题很可能是cx\U Oracle模块的版本

安装模块时必须非常小心,以便为oracle安装选择合适的版本

如果无法使用cx_Oracle连接到数据库,则可能很难检查信息的准确性

如果安装了sql*plus,您可以尝试使用子流程模块启动流程并检查是否可以连接,但我认为,修复cx\U Oracle可能会更好

编辑:表示子流程模块

以下是如何使用子流程执行此操作:

import subprocess

def is_login_valid(user, password, instance):
  output = subprocess.check_output("sqlplus %s/%s@%s" %(user, password, instance))
  return (output.find("ORA-01017") == -1 and output.find("ORA-12154") == -1)

如果无法编译cx_Oracle,则有两个选项:

以ODBC为例; 用于与sqlplus交互。
如果您可以通过一些不需要cx_Oracle的替代方法访问用户名和密码散列,并且只需要验证密码散列,python库可能会提供帮助。它同时支持和散列格式。

如果您无法连接到数据库,您将需要一些替代数据源,可以告诉您有效的用户名和密码是什么。希望没有,否则我会担心你的数据库安全。脚本将在本地机器上运行,所以我不担心数据库安全。我拥有的是一系列其他脚本,它们可以做各种事情。我已经编写了一个中央GUI,可以为非db专家用户提供使用其他工具的简单方法。问题是其他工具需要DB用户名/密码才能工作。因此,我要做的是获取用户提供的凭据,然后在启动所需工具之前验证它们是否正确。我查看了适用于python 2.7和Oracle 10G的cx_Oracle的所有5.1和5.0.4版本。他们都不肯上船。使用dependency walker,它将OCI.DLL标记为没有所需的某些函数。由于策略原因,我无法在服务器上更改Oracle的版本。安装了Sqlplus,但我不熟悉多进程模块。您能解释一下您的想法吗?多进程模块允许生成进程并侦听它们的输出。如果使用多进程模块从python启动Sqlplus进程,则可以检查它是否可以连接到数据库。通过检查连接错误,检查oracle上的X\U HOME环境变量,检查它是否引用了正确的客户端,然后重新安装。@fn是的,这样做了。另一个扭曲是,这台服务器上有3个不同版本的10G实例。我怀疑这就是导致cx_Oracle出现问题的原因。@ccwhite1您试图连接的实例的版本是什么?cx\U Oracle是否会引发一些错误/异常?您可以尝试使用源代码分发版,进行一些手动安装,甚至在安装程序上“强制”使用正确的dll。py您可以提供一个链接,指向pyodbc连接到Oracle的示例吗?我收到pyodbc错误。错误:'01000',[01000][Microsoft][ODBC驱动程序管理器]驱动程序不支持应用程序请求的ODBC行为版本。到目前为止,如果我使用cnxn=pyodbc.connectDRIVER='{Microsoft ODBC for Oracle}',uid='uname',pwd='pword',这将起作用。但是,当我尝试添加选项database='iname'时,它给出了无效的connection-nstring-attribute,我能够使它正常工作。因为我想为实例和服务器创建一个变量,所以我创建了一个字符串:connectString='DRIVER={microsoftobcfororacle}:server='+strServername+':1521/'+strInstance+';uid='+strUsername+';pwd='+strPassword。然后我将其作为cnxn=pyodbc.connectstring传递。我用Try/Except包装了它以捕获错误。我实际上没有访问散列的权限。用户输入用户名/pwd,我希望在尝试使用它们运行命令之前验证它们。