2009-08-04 20 views
5

我需要從VBScript中讀取Temporary ASP.NET Files文件夾的位置,作爲使用Visual Studio 2008部署項目創建的安裝程序中的安裝後任務的一部分。如何從VBScript中讀取64位註冊表值作爲msi安裝後任務運行?

我想我會做這樣的事情:

Set oShell = CreateObject("Wscript.Shell") 
strPath = oShell.RegRead("HKLM\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\Path") 

,然後拼接strPath的用「\臨時ASP.NET文件」,並用它做。

在x64系統,但是,我從WOW6432Node所獲得的價值(HKLM \ SOFTWARE \ Wow6432Node \微軟\ ASP.NET \ 2.0.50727.0),它給我的32位架構的路徑(C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727),但在x64系統上,我實際上需要64位路徑,即C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727。

據我所知,發生這種情況是因爲.vbs文件是使用32位腳本主機運行的,因爲父進程(安裝程序)本身是32位的。

如何使用64位腳本主機運行腳本 - 或者 - 即使使用32位腳本主機運行腳本,如何讀取64位值?

回答

6

不知道關於啓動64位腳本主機版本,但你應該能夠使用WMI StdRegProv類從32位腳本主機訪問64位註冊表,像這樣:

Const HKEY_LOCAL_MACHINE = &H80000002 
sPath = ReadRegStr (HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\ASP.NET\2.0.50727.0", "Path", 64) 
WScript.Echo sPath 

' Reads a REG_SZ value from the local computer's registry using WMI. 
' Parameters: 
' RootKey - The registry hive (see http://msdn.microsoft.com/en-us/library/aa390788(VS.85).aspx for a list of possible values). 
' Key - The key that contains the desired value. 
' Value - The value that you want to get. 
' RegType - The registry bitness: 32 or 64. 
' 
Function ReadRegStr (RootKey, Key, Value, RegType) 
    Dim oCtx, oLocator, oReg, oInParams, oOutParams 

    Set oCtx = CreateObject("WbemScripting.SWbemNamedValueSet") 
    oCtx.Add "__ProviderArchitecture", RegType 

    Set oLocator = CreateObject("Wbemscripting.SWbemLocator") 
    Set oReg = oLocator.ConnectServer("", "root\default", "", "", , , , oCtx).Get("StdRegProv") 

    Set oInParams = oReg.Methods_("GetStringValue").InParameters 
    oInParams.hDefKey = RootKey 
    oInParams.sSubKeyName = Key 
    oInParams.sValueName = Value 

    Set oOutParams = oReg.ExecMethod_("GetStringValue", oInParams, , oCtx) 

    ReadRegStr = oOutParams.sValue 
End Function 

注意:我現在正在使用32位操作系統,所以無法驗證此示例是否有效。謹防錯誤:-)

另請參閱Requesting WMI Data on a 64-bit Platform有關該主題的更多信息。

+0

你是怎麼做的,但只驗證一個鍵,而不是一個值? (例如:查看「SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0」是否存在,但不是「路徑」值 – 2013-09-17 19:12:59

+1

@ DaniellePaquette-Harvey:您需要調用[`EnumKey`](http://msdn.microsoft.com/zh-cn/ com/en-us/library/aa390387.aspx)而不是`GetStringValue`(帶有適當的參數),並檢查'​​oOutParams.ReturnValue`是否爲0。另外,請參閱此問題中的答案:[檢查是否存在註冊表項](http ://stackoverflow.com/q/9604276/113116) – Helen 2013-09-18 06:51:54

0

我想這樣的事情,但我沒有理清如何處理輸出值。

strComputer = "." 
Const HKLM = &h80000002 
Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet") 
objCtx.Add "__ProviderArchitecture", 64 
objCtx.Add "__RequiredArchitecture", TRUE 
Set objLocator = CreateObject("Wbemscripting.SWbemLocator") 
Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx) 
Set objStdRegProv = objServices.Get("StdRegProv") 

' Use ExecMethod to call the GetStringValue method 
Set Inparams = objStdRegProv.Methods_("EnumValues").Inparameters 
Inparams.Hdefkey = HKLM 
Inparams.Ssubkeyname = "SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL\" 
'Inparams.Svaluename = "Logging" 
set Outparams = objStdRegProv.ExecMethod_("EnumValues", Inparams,,objCtx) 

'Show output parameters object and the registry value HKLM\SOFTWARE\ 
WScript.Echo Outparams.GetObjectText_ 
WScript.Echo "WMI Logging is set to " & Outparams.SValue 
相關問題