Как узнать значение реестра или проверить, существует ли реестр из 64-битного куста реестра с 32-разрядным cmd в 64-разрядной машине через vbscript. Поскольку sccm использует 32-разрядный cmdКак читать 64-битный реестр в 32-разрядном cmd?
ответ
Существует несколько возможностей для этого. Прежде всего, если у вас есть SCCM 2012, вы можете использовать приложение вместо пакета/программы. Приложения должны выполняться в 64 бит на соответствующих машинах.
Если вам нужен пакет, и вы когда-либо захотите его выполнить на машинах 64Bit (либо потому, что у вас есть только те, либо из-за того, что вы делаете несколько пакетов со специальными настройками среды, ограничивая их только 64Bit), вы можете использовать sysnative. Sysnative - это жесткая ссылка в C: \ windows, которую вы можете использовать для принудительного доступа к собственной папке system32, а не к эмулируемому WoW64. Итак, вы должны использовать C:\Windows\sysnative\wscript.exe <path to your script>
как путь к исполняемым программам, скрипт будет выполнен с 64-битным хостом скриптов, и поэтому доступ к реестру будет работать. К сожалению, MS упустила возможность включить системный на 32-битных машинах, так что в этих системах это не сработает.
Третья возможность также основана на системной работе, но работает и на 32-битных системах. Если включить следующий код в начале вашего скрипта:
If fso.FileExists("C:\Windows\SysWOW64\wscript.exe") Then ' very basic check for 64bit Windows, you can replace it with a more complicated wmi check if you find it not reliable enough
If InStr(1, WScript.FullName, "SysWOW64", vbTextCompare) <> 0 Then ' = case insensitive check
newFullName = Replace(WScript.FullName, "SysWOW64", "Sysnative", 1, -1, vbTextCompare) ' System32 is replaced by Sysnative to deactivate WoW64, cscript or wscript stay the same
newArguments = "" ' in case of command line arguments they are passed on
For Each arg In WScript.Arguments
newArguments = newArguments & arg & " "
Next
wso.Run newFullName & " """ & WScript.ScriptFullName & """ " & newArguments, , False
WScript.Quit '32 Bit Scripting Host is closed
End If
End If
он будет проверять, если это машина 64Bit и если да рестарт себя с родной сценариев хозяина, сохраняя при этом все параметры. Если он не обнаружит 64Bit, он будет нормально работать в 32Bit.
strValue64 = ReadRegStr (HKEY_LOCAL_MACHINE, strKeyPath64, "UninstallString", 64) strValue32 = ReadRegStr (HKEY_LOCAL_MACHINE, strKeyPath32, "UninstallString", 64) Функция ReadRegStr (корневого раздела, Key, Value, RegType) дим oCtx, oLocator , Öreg, 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