2009-08-04 4 views
5

Visual Studio 2008 배포 프로젝트를 사용하여 만든 설치 관리자에서 설치 후 작업의 일부로 VBScript에서 Temporary ASP.NET Files 폴더의 위치를 ​​읽어야합니다.msi 설치 후 작업으로 실행되는 VBScript에서 64 비트 레지스트리 값을 읽으려면 어떻게해야합니까?

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

다음과 strPath을 연결 "\ 임시 ASP.NET 파일"과 함께 할 수 :

은 내가 이런 식으로 뭔가를 할 것이라고 생각했다.

그러나 x64 시스템에서는 32 비트 프레임 워크 경로 (C : \)를 제공하는 WOW6432Node (HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ ASP.NET \ 2.0.50727.0) Windows \ Microsoft.NET \ Framework \ v2.0.50727), x64 시스템에서는 실제로 C : \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727과 같은 64 비트 경로가 필요합니다.

부모 프로세스 (설치 관리자)가 32 비트 자체이기 때문에 .vbs 파일이 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 

NB : 현재 32 비트 OS를 사용하고 있으므로이 예제가 작동하는지 확인할 수 없습니다. 버그에주의하십시오 :-)

자세한 내용은 Requesting WMI Data on a 64-bit Platform MSDN 문서를 참조하십시오.

+0

당신은 어떻게 그렇게, 그러나 단지 키가 아닌 값을 확인하기 위해 ?? (예 : "SOFTWARE \ Microsoft \ ASP.NET \ 2.0.50727.0"이 존재하지만 "Path"값이 아닌지 확인하십시오. –

+1

@ DaniellePaquette-Harvey : [EnumKey'] (http://msdn.microsoft. 적절한 매개 변수를 사용하여'GetStringValue' 대신'.OOutParams.ReturnValue'가 0인지 확인하십시오. 또한 다음 질문에 대한 답을보십시오 : [레지스트리 키가 있는지 확인하십시오] (http : // com/ko-kor/ko/library/aa390387.aspx) : //stackoverflow.com/q/9604276/113116) – Helen

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 
-1

이 옵션을 선택하십시오 :

설정 oShell = CreateObject를 ("Wscript.Shell") strPath = oShell.RegRead ("HKLM64 \ 소프트웨어 마이크로 소프트 \ \ ASP.NET에게 \ 2.0.50727.0 \ 경로")

https://www.autoitscript.com/autoit3/docs/functions/RegRead.htm

+0

AutoIt 스크립트가 VBScript가 아니며 함수가 동일하지 않습니다. – Fowl

관련 문제