在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
1条答案
按热度按时间3j86kqsm1#
根据Oracle,这些位置分别搜索
tnsnames.ora
。sqlnet.ora
:1.当前路径(与正在运行的客户端应用程序相关联)
1.为会话定义的环境变量
TNS_ADMIN
1.为系统定义的环境变量
TNS_ADMIN
HKLM\SOFTWARE\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN
(用于64位)或HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{ORACLE_HOME_NAME}\TNS_ADMIN
(用于32位)%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
,您必须导航到Oraclebin
文件夹(通过%PATH%
环境变量找到)并打开文件oracle.key
。这是一个简单的文本文件,仅包含ORACLE_HOME_NAME
值,例如 OraClient11g_home1。但是,通常在
HKLM\SOFTWARE\ORACLE
下面只有一个Oracle Home,因此查找和阅读文件oracle.key
可能是一种过度。更新
当我在我的机器上运行测试时(使用Oracle Client 11.2),我得到以下顺序:
1.环境变量
TNS_ADMIN
HKLM\SOFTWARE\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN
,分别为HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN
->仅当未设置TNS_ADMIN
环境变量时。%ORACLE_HOME%\network\admin
1.当前目录(可以与应用程序所在的目录不同)
1.应用程序所在的文件夹
要进行深入分析,必须搜索
tnsnames.ora
、sqlnet.ora
和ldap.ora
。Oracle数据库名称可以通过它们中的每一个来解析,即即使当X1 M25 N1 X和X1 M26 N1 X不存在时也可以建立连接。