2009-08-04 22 views
5

Tôi cần đọc vị trí của thư mục Tệp ASP.NET Tạm thời từ VBScript như một phần của tác vụ sau khi cài đặt trong trình cài đặt được tạo bằng cách sử dụng dự án triển khai Visual Studio 2008.Làm cách nào để đọc các giá trị đăng ký 64 bit từ VBScript đang chạy dưới dạng tác vụ sau khi cài đặt msi?

Tôi nghĩ tôi sẽ làm điều gì đó như thế này:

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

và sau đó nối strPath với "\ Temporary ASP.NET Files" và được thực hiện với nó.

Trên hệ thống x64, tuy nhiên, tôi nhận được giá trị từ WOW6432Node (HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ ASP.NET \ 2.0.50727.0), cung cấp cho tôi đường dẫn khung 32 bit (C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727), nhưng trên một hệ thống x64, tôi thực sự muốn đường dẫn 64-bit, tức là C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727.

Tôi hiểu rằng điều này xảy ra vì tệp .vbs được chạy bằng máy chủ tập lệnh 32 bit do quy trình gốc (trình cài đặt) là bản thân 32 bit.

Làm cách nào để chạy tập lệnh bằng máy chủ tập lệnh 64 bit - hoặc - làm cách nào tôi có thể đọc các giá trị 64 bit ngay cả khi tập lệnh được chạy bằng máy chủ tập lệnh 32 bit?

Trả lời

6

Không chắc về ra mắt phiên bản kịch bản máy chủ 64-bit, nhưng bạn sẽ có thể truy cập vào registry 64-bit từ host kịch bản 32-bit bằng cách sử dụng lớp WMI StdRegProv, như thế này:

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 

NB: Hiện tôi đang ở trong hệ điều hành 32 bit, vì vậy không thể xác minh rằng ví dụ này hoạt động. Cẩn thận với lỗi :-)

Xem thêm bài viết Requesting WMI Data on a 64-bit Platform MSDN để biết thêm thông tin về chủ đề.

+0

Bạn làm như thế nào, nhưng chỉ để xác minh khóa chứ không phải giá trị ?? (Ví dụ: xem "SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0" tồn tại nhưng không phải là giá trị "Đường dẫn" –

+1

@ DaniellePaquette-Harvey: Bạn cần gọi ['EnumKey'] (http://msdn.microsoft. com/en-us/library/aa390387.aspx) thay vì 'GetStringValue' (với các tham số thích hợp) và kiểm tra xem' oOutParams.ReturnValue' là 0. Ngoài ra, hãy xem câu trả lời trong câu hỏi này: [Kiểm tra xem khóa registry tồn tại] (http : //stackoverflow.com/q/9604276/113116) – Helen

0

Tôi nghĩ một cái gì đó như thế này, nhưng tôi đã không được sắp xếp làm thế nào để xử lý các giá trị đầu ra.

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 
Các vấn đề liên quan