如何创建向所有用户 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,而不是文件

计算机中所有用户的应用程序的 Windows 注册表项

如何为所有会话创建配置单元 UDF

使用 (SetACL) 自动化 Windows HKCU 注册表权限的批处理文件

如何移动表格单元格并显示图像?

java写了一个下载excel的功能,我想把用户下载的模版的所有单元格都变成文本格式。该如何写呢?