.net中的Windows服务无法解析tns服务名称

.net中的Windows服务无法解析tns服务名称,.net,oracle,windows-services,windows-server-2003,.net,Oracle,Windows Services,Windows Server 2003,我已将应用程序的一个组件从Web服务移动到Windows服务。它从Web服务完美地连接到oracle,但拒绝从Windows服务查看Tns名称。我已将ORAHOME目录的完全控制权授予运行该服务的帐户 我还使用runas regedit作为服务帐户检查了服务帐户对注册表的权限,它可以查看HKLM\SOFTWARE\ORACLE\HOME0详细信息和HKLM\SOFTWARE\ORACLE\ALL_HOMES。所有ORACLE_主密钥都指向同一目录 我可以作为服务帐户登录,并在没有问题的情况下打开

我已将应用程序的一个组件从Web服务移动到Windows服务。它从Web服务完美地连接到oracle,但拒绝从Windows服务查看Tns名称。我已将ORAHOME目录的完全控制权授予运行该服务的帐户

我还使用runas regedit作为服务帐户检查了服务帐户对注册表的权限,它可以查看HKLM\SOFTWARE\ORACLE\HOME0详细信息和HKLM\SOFTWARE\ORACLE\ALL_HOMES。所有ORACLE_主密钥都指向同一目录

我可以作为服务帐户登录,并在没有问题的情况下打开sid“UAT”:
'OK (70 msec)'

我将进程监视器附加到进程,服务帐户(最终在扫描了大部分注册表后)看到了tnsnames.ora,甚至读取了它

你在键盘后面咯咯笑吗?你能帮忙吗

原因:OracleException

来源:System.Data.OracleClient 消息:ORA-12154:TNS:无法解析服务名称 位于System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 位于System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection-owningConnection) 位于System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory) 在System.Data.OracleClient.OracleConnection.Open()中

检查服务是否可以通过通知oracle tnsnames.ora文件的位置来访问注册表项。从内存中,它是HKLM\SOFTWARE\ORACLE\Key\u客户端,带有TNS\u名称注册表字符串,该字符串是保存tnsnames.ora文件的文件夹。您也可以在HKCU树中创建相同的内容

哎呀!现在我正在工作,我可以看到字符串名称应该是TNS_ADMIN。另外,请尝试环境变量TNS_ADMIN,并确保HKCU中没有任何内容


还注意到,您需要与tnsnames.ora位于同一文件夹中的sqlnet.ora文件

尝试将windows环境变量TNS_ADMIN设置为tnsnames.ora文件所在的路径,然后重新启动服务。

运行Process Monitor以查看是否正在加载tnsnames.ora文件。我想是的,但是你的名字解析像那个用户一样被破坏了

如果您可以使用服务帐户以交互方式登录,请尝试使用tnsping查看是否可以连接到该名称

Oracle按此顺序解析文件(根据Metalink第114085.1条):

  • 当前工作目录中的Oracle Net文件
  • TNS_ADMIN定义为用户/会话环境变量
  • TNS_ADMIN定义为全局环境变量
  • 在注册表中定义的TNS_管理
  • %Oracle\u HOME%\network\admin(Oracle默认位置)中的Oracle Net文件

  • 查看Process Monitor正在读取哪些(如果有)。

    首先,您可以更改连接字符串以展开tns条目:

    数据源=(描述=(地址=(协议=TCP)(主机=10.161.50.101)(端口=1521))(连接数据=(服务名称=MOUAT));密码=密码;用户Id=用户名

    然后你会得到真正的错误:

    并获得“ORA-06413:连接未打开”。

    这是因为“Windows服务”路径中有括号(DEV)或(UAT)'


    回答:展开连接字符串以排除TNS解析,然后确保调用应用程序的路径不包含括号“(”或“)”。首先检查您的操作系统是32位还是64位。如果是64位,则安装oracle express edition 64位,则不会生成任何错误并成功运行


    有关更多详细信息,请访问…

    谢谢Martlark,我已将regedit作为服务帐户运行,它可以查看HKLM\SOFTWARE\ORACLE\HOME0详细信息和HKLM\SOFTWARE\ORACLE\HOME0。所有ORACLE_主密钥都指向同一个目录.crb,感谢您的建议。该服务现在看到tnsnames.ora(进程监视器中),但仍然无法解析该服务。奇怪的是,当rdp'ing作为服务帐户时,它可以调用sid。谢谢你的帮助,我非常感谢。现在我们讨论的是服务许可问题。如果您的服务勾选了“与桌面交互”,它能工作吗?Oracle堆栈中是否有只授予交互权限的部分?谢谢!这是一个真正的救命恩人。在64位服务器上安装32位应用时要小心,因为它们可能安装在C:\Program Files(x86)中,这将导致相同的问题。您能否提供其中的一些详细信息?
    Cause: OracleException

    Source: System.Data.OracleClient Message: ORA-12154: TNS:could not resolve service name at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.OracleClient.OracleConnection.Open()