如何创建向所有用户 HKCU\... 配置单元(包括默认用户和域用户)写入 32 位和 64 位的 VBS 脚本
Posted
技术标签:
【中文标题】如何创建向所有用户 HKCU\\... 配置单元(包括默认用户和域用户)写入 32 位和 64 位的 VBS 脚本【英文标题】:How to create VBS script that writes in both 32 and 64 bit to all users HKCU\... hive (including default and domain user)如何创建向所有用户 HKCU\... 配置单元(包括默认用户和域用户)写入 32 位和 64 位的 VBS 脚本 【发布时间】:2021-11-28 05:29:47 【问题描述】:这是关于在没有任何强制策略的情况下配置新的 Windows 配置模板。 我需要一个 Visual Basic 脚本 (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 方法。您可以直接更新 HKLM 和 HKEY_USERS 32 位和 64 位条目,您可以通过加载 NTUser.dat 和 UsrClass.dat 文件对未登录的用户执行相同操作。 HKCU 不需要直接编辑,因为它通过更新 HKEY_USERS 覆盖。这是代码(以管理员身份运行):
Const HKLM = &H80000002
Const HKU = &H80000003
Set oWSH = CreateObject("WScript.Shell")
Set oReg = GetObject("winmgmts:\\.\root\default:StdRegProv")
Dim Prefix, SoftwareClasses
UpdateUserTemplate = True
UpdateHKLM
If UpdateUserTemplate Then
Prefix = "HKEY_LOCAL_MACHINE\TempHive"
ProfilePath = "C:\Users\Default"
oWSH.Run "reg load HKLM\TempHive " & chr(34) & ProfilePath & "\AppData\Local\Microsoft\Windows\UsrClass.dat" & chr(34), 0, True
SoftwareClasses = ""
UpdateUserClasses
oWSH.Run "reg unload HKLM\TempHive", 0, True
oWSH.Run "reg load HKLM\TempHive " & chr(34) & ProfilePath & "\NTUser.dat" & chr(34), 0, True
UpdateUserOther
oWSH.Run "reg unload HKLM\TempHive", 0, True
End If
Key = "Software\Microsoft\Windows NT\CurrentVersion\ProfileList"
Result = oReg.EnumKey(HKLM, Key, ArrProfileList)
If Result=0 Then
For Each SID In ArrProfileList
If Len(SID)=45 Then
Result = oReg.EnumKey(HKU, SID, ArrHKU)
If Result=0 Then
UpdateUser True,SID 'Logged on user
Else
UpdateUser False,SID 'Not logged on user
End If
End If
Next
End If
Sub UpdateUser(LoggedOn,SID)
If LoggedOn Then
Prefix = "HKEY_USERS\" & SID
SoftwareClasses = "\Software\Classes"
End If
If Not LoggedOn Then
Prefix = "HKEY_LOCAL_MACHINE\TempHive"
ProfilePath = oWSH.RegRead("HKLM\Software\Microsoft\Windows NT\CurrentVersion\ProfileList\" & SID & "\ProfileImagePath")
oWSH.Run "reg load HKLM\TempHive " & chr(34) & ProfilePath & "\AppData\Local\Microsoft\Windows\UsrClass.dat" & chr(34), 0, True
SoftwareClasses = ""
End If
UpdateUserClasses
If Not LoggedOn Then
oWSH.Run "reg unload HKLM\TempHive", 0, True
oWSH.Run "reg load HKLM\TempHive " & chr(34) & ProfilePath & "\NTUser.dat" & chr(34), 0, True
End If
UpdateUserOther
If Not LoggedOn Then oWSH.Run "reg unload HKLM\TempHive", 0, True
End Sub
'HKLM registry entries go here:
Sub UpdateHKLM
oWSH.RegWrite "HKLM\Software\_Test\StrTest", "Test", "REG_SZ"
oWSH.RegWrite "HKLM\Software\_Test\DWTest", "1", "REG_DWORD"
oWSH.RegWrite "HKLM\Software\WOW6432Node\_Test\StrTest", "Test", "REG_SZ"
oWSH.RegWrite "HKLM\Software\WOW6432Node\_Test\DWTest", "1", "REG_DWORD"
End Sub
'User registry entries that are in the Classes subkey go here:
Sub UpdateUserClasses
oWSH.RegWrite Prefix & SoftwareClasses & "\CLSID\_Test\StrTest", "Test", "REG_SZ"
oWSH.RegWrite Prefix & SoftwareClasses & "\CLSID\_Test\DWTest", "1", "REG_DWORD"
oWSH.RegWrite Prefix & SoftwareClasses & "\WOW6432Node\CLSID\_Test\StrTest", "Test", "REG_SZ"
oWSH.RegWrite Prefix & SoftwareClasses & "\WOW6432Node\CLSID\_Test\DWTest", "1", "REG_DWORD"
End Sub
'User registry entries that are NOT in the Classes subkey go here:
Sub UpdateUserOther
oWSH.RegWrite Prefix & "\Software\_Test\StrTest", "Test", "REG_SZ"
oWSH.RegWrite Prefix & "\Software\_Test\DWTest", "1", "REG_DWORD"
End Sub
【讨论】:
但是我需要所有用户的 SID 以及默认用户的 SID。这是您的代码无法实现的。我设法读出了用户 SID,但不是那个默认值,而不是将默认值加载到注册表配置单元中 不要使用我发布的代码。使用RegUpdateAllHkcuHkcr.vbs但是直接写WOW6432Node. 确实,我在过去的所有任务中都使用过 RegUpdateAllHkcuHkcr.vbs,但 VBS 无法区分 32 位和 64 位。如果我直接写入 WOW6432Node,它将访问它,但我想要的不是 WOW6432Node 子键... 我没有发现问题。为什么不在所有机器上的所有用户的两个位置写入值? 你是说所有的写入都被重定向到WOW6432Node?在我的测试中并非如此。以上是关于如何创建向所有用户 HKCU\... 配置单元(包括默认用户和域用户)写入 32 位和 64 位的 VBS 脚本的主要内容,如果未能解决你的问题,请参考以下文章
组件testcomp安装到用户配置文件。它必须使用HKCU下的注册表项作为其KeyPath,而不是文件