oracle 标识相关tnsname的位置并回显到控制台

ebdffaop  于 2023-05-16  发布在  Oracle
关注(0)|答案(1)|浏览(117)

previous post中,我正在使用VBS列出机器上安装的所有驱动程序。我对Oracle驱动程序特别感兴趣。
现在,我想接下来捕获适用的tnsnames.ora文件的内容。实际上,在我们的环境中,假设一台机器可能同时安装了32位和64位驱动程序,我希望最多有3个tnsnames.ora文件。如果为%TNS_ADMIN%定义了一个系统变量,那么我希望在32位admin文件夹中有1个tnnamesora文件,在63位文件夹中有1个,在%TNS_ADMIN%文件夹中有一个。在我的机器上,我的%TNS_ADMIN%系统变量被设置为C:\Windows\TNS,一旦设置,我就不需要在32位和64位位置有单独的tbnsnames.ora文件。位于%TNS_ADMIN%位置(如果已定义)的文件夹将由任一驱动程序使用。在我的PC上,32位和64位tnsnames.ora文件的位置是:

C:\Oracle\product\11203_32bit\CLIENT_1\NETWORK\ADMIN
C:\Oracle\product\11203_64bit\CLIENT_1\NETWORK\ADMIN

我想做的是使用VBS读取注册表来识别这些位置,然后使用TYPE命令在每个文件上使用我上一篇文章的代码作为起点将内容回显到控制台。
我一直在注册表中四处闲逛,试图找到相关的键或键链来获取此信息。有了这些信息,我也许能找出密码。

REM Run this file with the following command:
REM cscript  ListDriversV2.vbs | clip

WScript.Echo "------------------------------------------------"

'Get Server Name
Set wshNetwork = WScript.CreateObject( "WScript.Network" )
strComputerName = wshNetwork.ComputerName
WScript.Echo "Computer Name: " & strComputerName

'List 64 bit drivers
WScript.Echo "------------------------------------------------"
WScript.Echo "List 64 bit drivers:"
WScript.Echo 

Const HKEY_LOCAL_MACHINE = &H80000002

strComputer = "."
Set objRegistry = GetObject("winmgmts:\\" & strComputer & "\root\default:StdRegProv")

strKeyPath = "SOFTWARE\ODBC\ODBCINST.INI\ODBC Drivers"
objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes

For i = 0 to UBound(arrValueNames)
    strValueName = arrValueNames(i)
    objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue    
    Wscript.Echo arrValueNames(i) & " -- 64 Bit " & strValue
Next

'List 32 bit drivers
WScript.Echo "------------------------------------------------"
WScript.Echo "List 32 bit drivers:"
WScript.Echo 

strKeyPath = "SOFTWARE\Wow6432Node\ODBC\ODBCINST.INI\ODBC Drivers"
objRegistry.EnumValues HKEY_LOCAL_MACHINE, strKeyPath, arrValueNames, arrValueTypes

For i = 0 to UBound(arrValueNames)
    strValueName = arrValueNames(i)
    objRegistry.GetStringValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,strValue    
    Wscript.Echo arrValueNames(i) & " -- 32 Bit " & strValue
Next

'List Oracle Environment variables

WScript.Echo "------------------------------------------------"
WScript.Echo "List Oracle Environment variables:"
WScript.Echo 

Set objShell = WScript.CreateObject("WScript.Shell")
strTnsAdmin = objShell.Environment("SYSTEM").Item("TNS_ADMIN")
WScript.Echo "TNS_ADMIN=" & strTnsAdmin

strOracleHome = objShell.Environment("SYSTEM").Item("ORACLE_HOME")
WScript.Echo "ORACLE_HOME=" & stroracleHome

WScript.Echo "------------------------------------------------"
WScript.Echo "List All System Environment variables:"
WScript.Echo 

Set objEnv = objShell.Environment("SYSTEM")

For Each strVar in objEnv
  WScript.Echo strVar
Next

WScript.Echo "------------------------------------------------"
WScript.Echo "List All User Environment variables:"
WScript.Echo 

Set objEnv = objShell.Environment("User")

For Each strVar in objEnv
  WScript.Echo strVar
Next

WScript.Echo "------------------------------------------------"
'How do I dynamically determine this Oracle 64 bit tnsnames location location from the registry?
strPath = "E:\oracle_12101_64bit\product\12101_64bit\CLIENT_1\NETWORK\ADMIN\"

WScript.Echo "Dump " & strPath
WScript.Echo 

strFileContent = LoadStringFromFile(strPath)

WScript.Echo LoadStringFromFile(strPath)
WScript.Echo strPath

WScript.Echo "------------------------------------------------"
'How do I dynamically determine this Oracle 32 bit tnsnames location location from the registry?
strPath = "E:\Oracle\product\11.2.0\client_32Bit\NETWORK\ADMIN\TNSNAMES.ORA"
WScript.Echo "Dump " & strPath
WScript.Echo 

strFileContent = LoadStringFromFile(strPath)

WScript.Echo LoadStringFromFile(strPath)
WScript.Echo strPath

WScript.Echo "------------------------------------------------"
strPath = strTnsAdmin & "\tnsnames.ora"
WScript.Echo "Dump " & strPath
WScript.Echo 

strFileContent = LoadStringFromFile(strPath)

WScript.Echo LoadStringFromFile(strPath)
WScript.Echo strPath

Function LoadStringFromFile(filename)
    Const fsoForReading = 1
    Const fsoForWriting = 2
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject")

    If fso.FileExists(filename) Then
        Set f = fso.OpenTextFile(filename, fsoForReading)
        LoadStringFromFile = f.ReadAll
        f.Close
    Else
        LoadStringFromFile = ""
    End if
        
End Function
3j86kqsm

3j86kqsm1#

根据Oracle,这些位置分别搜索tnsnames.orasqlnet.ora
1.当前路径(与正在运行的客户端应用程序相关联)
1.为会话定义的环境变量TNS_ADMIN
1.为系统定义的环境变量TNS_ADMIN

  1. Windows注册表项HKLM\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN(用于64位)或HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN(用于32位)
  2. %ORACLE_HOME%\network\admin
    但是,我不确定是否每个应用程序/驱动程序/版本都遵循这个列表。此列表由Oracle提供,与版本9 i相关。我想你会通过VBScript来管理这些文件夹。
    如果ORACLE_HOME未被环境变量设置,则必须查询注册表HKLM\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\ORACLE_HOME(64位)或HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{ORACLE_HOME_NAME}\ORACLE_HOME(32位)
    对于ORACLE_HOME_NAME,您必须导航到Oracle bin文件夹(通过%PATH%环境变量找到)并打开文件oracle.key。这是一个简单的文本文件,仅包含ORACLE_HOME_NAME值,例如 OraClient11g_home1
    但是,通常在HKLM\SOFTWARE\ORACLE下面只有一个Oracle Home,因此查找和阅读文件oracle.key可能是一种过度。

更新

当我在我的机器上运行测试时(使用Oracle Client 11.2),我得到以下顺序:
1.环境变量TNS_ADMIN

  1. HKLM\SOFTWARE\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN,分别为HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN->仅当未设置TNS_ADMIN环境变量时。
  2. %ORACLE_HOME%\network\admin
    1.当前目录(可以与应用程序所在的目录不同)
    1.应用程序所在的文件夹
    要进行深入分析,必须搜索tnsnames.orasqlnet.oraldap.ora。Oracle数据库名称可以通过它们中的每一个来解析,即即使当X1 M25 N1 X和X1 M26 N1 X不存在时也可以建立连接。

相关问题