Как создать сценарий VBS, который записывает как 32-, так и 64-разрядные версии всем пользователям HKCU\... hive (включая пользователя по умолчанию и пользователя домена)

Речь идет о настройке нового шаблона конфигурации Windows без каких-либо принудительных политик. Мне нужен базовый сценарий Visual (VBS), который может получить доступ к кусту реестра HKCU всех пользователей (не к HKLM!), Включая пользователей домена и вариант по умолчанию для будущих пользователей, а также с возможностью определения подхода к 32- и 64-разрядной версии (или обойти перенаправление окон).

Что я выяснил на данный момент:

  • «RegUpdateAllHkcuHkcr.vbs» (автор Mick Grove) работает для всех пользователей, но не может работать с конкретными 32/64 битами (https://github.com/micksmix/RegUpdateAllUsers).
  • Скрипт из "https://www.4thcorner.net/2011/09/30/reading-and-writing-64-bit-register-of-32-bit/" может обрабатывать 32/64 бит, но для текущего только пользователь.

=> Для меня нет возможности объединить эти два метода скрипта, названные выше.

Может кто-то помочь мне, пожалуйста?

1 ответ

Метод WMI ProviderArchitecture для записи 32- или 64-разрядного режима в реестр не будет работать в сочетании с загрузкой кустов с диска, поскольку используемый временный путь (например, TempHive) не распознается как путь для перенаправления. Вот пример кода, демонстрирующий это:

      'Change these test SIDs to valid SIDs on your computer
MySID = "S-1-5-21-3204579862-702238378-1387230306-1001"
NotLoggedOnUserSID = "S-1-5-21-3204579862-702238378-1387230306-1005"

HKEY_CURRENT_USER = &H80000001
HKEY_LOCAL_MACHINE = &H80000002
HKEY_USERS = &H80000003
Set reg32 = MakeRegLocator(32)
Set reg64 = MakeRegLocator(64)
Set oWSH = CreateObject("WScript.Shell")

'Redirection works when writing to HKEY_USERS:
reg32.CreateKey HKEY_USERS,MySID & "\Software\Classes\CLSID\_Test"
reg64.CreateKey HKEY_USERS,MYSID & "\Software\Classes\CLSID\_Test"
reg32.SetStringValue HKEY_USERS,MySID & "\Software\Classes\CLSID\_Test","StrTest", "Test"
reg64.SetStringValue HKEY_USERS,MySID & "\Software\Classes\CLSID\_Test","StrTest", "Test"
reg32.SetDwordValue HKEY_USERS,MySID & "\Software\Classes\CLSID\_Test","DWTest", "1"
reg64.SetDwordValue HKEY_USERS,MySID & "\Software\Classes\CLSID\_Test","DWTest", "1"

'Load up the profile of the not-logged-on user:
TestProfilePath = oWSH.RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\" & NotLoggedOnUserSID & "\ProfileImagePath")
oWSH.Run "reg load HKLM\TempHive " & chr(34) & TestProfilePath & "\NTUser.dat" & chr(34), 0, True

'Redirection fails here because "TempHive" is not a known key to redirect:
reg32.CreateKey HKEY_LOCAL_MACHINE,"TempHive\Software\Classes\CLSID\_Test"
reg64.CreateKey HKEY_LOCAL_MACHINE,"TempHive\Software\Classes\CLSID\_Test"
reg32.SetStringValue HKEY_LOCAL_MACHINE,"TempHive\Software\Classes\CLSID\_Test","StrTest", "Test"
reg64.SetStringValue HKEY_LOCAL_MACHINE,"TempHive\Software\Classes\CLSID\_Test","StrTest", "Test"
reg32.SetDwordValue HKEY_LOCAL_MACHINE,"TempHive\Software\Classes\CLSID\_Test","DWTest", "1"
reg64.SetDwordValue HKEY_LOCAL_MACHINE,"TempHive\Software\Classes\CLSID\_Test","DWTest", "1"

'Unload hive (comment out if you want to examine results in registry)
oWSH.Run "reg unload HKLM\TempHive", 0, True

Function MakeRegLocator(bitness)
  Set ctx = CreateObject("WbemScripting.SWbemNamedValueSet")
  ctx.Add "__ProviderArchitecture", bitness
  Set locator = CreateObject("Wbemscripting.SWbemLocator")
  Set services = locator.ConnectServer("", "root\default", "", "", , , , ctx)
  Set reg = services.Get("StdRegProv")
  Set MakeRegLocator = reg
End Function

Более простое решение - просто напрямую записать необходимые записи реестра как в 32-битном, так и в 64-битном расположении, например:

      'Change these test SIDs to valid SIDs on your computer
MySID = "S-1-5-21-3204579862-702238378-1387230306-1001"
NotLoggedOnUserSID = "S-1-5-21-3204579862-702238378-1387230306-1005"

Set oWSH = CreateObject("WScript.Shell")

'Write entries for 32 and 64 bit:
oWSH.RegWrite "HKEY_USERS\" & MySID & "\Software\Classes\CLSID\_Test\",""
oWSH.RegWrite "HKEY_USERS\" & MYSID & "\Software\Classes\WOW6432Node\CLSID\_Test\",""
oWSH.RegWrite "HKEY_USERS\" & MYSID & "\Software\Classes\CLSID\_Test\StrTest", "Test", "REG_SZ"
oWSH.RegWrite "HKEY_USERS\" & MYSID & "\Software\Classes\WOW6432Node\CLSID\_Test\StrTest", "Test", "REG_SZ"
oWSH.RegWrite "HKEY_USERS\" & MYSID & "\Software\Classes\CLSID\_Test\DWTest", "1", "REG_DWORD"
oWSH.RegWrite "HKEY_USERS\" & MYSID & "\Software\Classes\WOW6432Node\CLSID\_Test\DWTest", "1", "REG_DWORD"

'Load up the profile of the not-logged-on user:
TestProfilePath = oWSH.RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\" & NotLoggedOnUserSID & "\ProfileImagePath")
oWSH.Run "reg load HKLM\TempHive " & chr(34) & TestProfilePath & "\NTUser.dat" & chr(34), 0, True

'Write entries for 32 and 64 bit:
oWSH.RegWrite "HKEY_LOCAL_MACHINE\TempHive\Software\Classes\CLSID\_Test",""
oWSH.RegWrite "HKEY_LOCAL_MACHINE\TempHive\Software\Classes\WOW6432Node\CLSID\_Test",""
oWSH.RegWrite "HKEY_LOCAL_MACHINE\TempHive\Software\Classes\CLSID\_Test\StrTest", "Test", "REG_SZ"
oWSH.RegWrite "HKEY_LOCAL_MACHINE\TempHive\Software\Classes\WOW6432Node\CLSID\_Test\StrTest", "Test", "REG_SZ"
oWSH.RegWrite "HKEY_LOCAL_MACHINE\TempHive\Software\Classes\CLSID\_Test\DWTest", "1", "REG_DWORD"
oWSH.RegWrite "HKEY_LOCAL_MACHINE\TempHive\Software\Classes\WOW6432Node\CLSID\_Test\DWTest", "1", "REG_DWORD"

'Unload hive (comment out if you want to examine results in registry)
oWSH.Run "reg unload HKLM\TempHive", 0, True

Используя подход прямой записи в WOW6432Node, вы можете обновить все профили пользователей, используя сценарий RegUpdateAllHkcuHkcr.vbs как есть.

Другие вопросы по тегам