当以 SYSTEM 用户(批处理)运行脚本时,更改当前登录的 Windows 用户的注册表值

Posted

技术标签:

【中文标题】当以 SYSTEM 用户(批处理)运行脚本时,更改当前登录的 Windows 用户的注册表值【英文标题】:change registry value for currently logged in Windows user, when running script as SYSTEM user (batch) 【发布时间】:2020-06-24 22:00:38 【问题描述】:

我在批处理脚本中有这段代码。

REG ADD HKEY_CURRENT_USER\MyKey /ve /t REG_DWORD /d 1 /f

问题是脚本是使用系统帐户作为 Windows 中的计划任务运行的。当使用系统帐户运行任务时,它不会将该值应用于当前登录的 Windows 用户的注册表。我找不到将任务设置为使用当前登录用户的方法,因此必须将其设置为使用系统帐户。

我尝试使用this 解决方案;但是它不适用于当前登录的用户,因为 NTUSER.DAT 文件正在被另一个进程使用。

我还尝试导入 .reg 文件;但是,这也不适用于当前登录的用户。

如何将设置应用到HKEY_USERS\*\MyKey?最好使用批处理?或者,如何以当前登录的 Windows 用户身份运行计划任务?

【问题讨论】:

【参考方案1】:

我用下面的代码解决了这个问题。 (当然要替换 MyKey)

这将仅适用于已登录的用户注册表。当我在应用程序启动时运行此代码时,在它读取注册表之前,这很适合我的情况。

SETLOCAL ENABLEDELAYEDEXPANSION
for /f %%A in ('reg query HKEY_USERS') do (
    set hive=%%A
    if "!hive:~11,8!"=="S-1-5-21" (
        if not "!hive:~-7!"=="Classes" (
            REG ADD !hive!\MyKey /ve /t REG_DWORD /d 1 /f
        )
    )
)
endlocal

如果您想应用于所有用户,无论是否登录,那么这应该可以实现。

SETLOCAL ENABLEDELAYEDEXPANSION
for /f %%A in ('reg query HKEY_USERS') do (
    set hive=%%A
    if not "!hive:~-7!"=="Classes" (
        REG ADD !hive!\MyKey /ve /t REG_DWORD /d 1 /f
    )
)
endlocal

【讨论】:

只要考虑到您在上面使用的方法对您无法加载的蜂巢有效,因为它们已经在使用中。一个健壮的脚本会尝试使用一个,然后在第一个指示失败时使用另一个。 我只需要将设置应用到当前登录的用户,因此尝试加载 NTUSER.DAT 文件对我来说是不行的。如果用户已经登录,它永远不会加载。我并不真正关心这个用例的未登录用户;但是,对于其他情况,这很好。 我知道这一点,Archer,你是对的。我之前的评论是为了向其他人澄清,您的解决方案虽然满足您的特定要求,但并不是对所有用户都适用的强大解决方案。如果您认为这是对您的解决方案的批评,我深表歉意。 @Compo,我根本没有把它当作批评。我绝对可以看到首先使用 .dat 文件的案例是明智的,然后当它无法执行“reg 查询”以应用于当前登录的用户时。我将来可能会在部署软件时使用该方法...我想了解为什么使用 .DAT 文件更健壮。 它不是更健壮,我所说的健壮性是允许修改,无论用户当前是否登录。我当然遇到过reg unload 失败的实例,如果处理不当,可能会导致损坏。一个完全强大的解决方案可能还包括在任何更改之前和之后备份用户注册表的建议。【参考方案2】:

这首先通过 WMI 解析 SID,而不是将 SID 填充到 reg 命令中。试试吧。。

for /f "delims=" %a in ('wmic useraccount where "name='%username%'" get sid') do for /f "delims=" %b in ("%a") do REG ADD HKEY_CURRENT_USER\%b /ve /t REG_DWORD /d 1 /f

【讨论】:

如果任务在正确的用户配置文件下运行,那么总体思路似乎是合理的。但是我不相信您当前的代码还在那里。您的第一个循环可能会遇到 unicode WMIC 输出问题,我假设 HKCU 也应该是 HKU。

以上是关于当以 SYSTEM 用户(批处理)运行脚本时,更改当前登录的 Windows 用户的注册表值的主要内容,如果未能解决你的问题,请参考以下文章

从cron运行时,Perl脚本不会将STDOUT输出到文件

当以编程方式完成时,视图不会反映任何变化

Angular2/material 2:当以编程方式更改值时,md-input-container 标签不会重置浮点数

当以管理员权限运行CMD时,如何切换工作目录

当以编程方式将选项卡更改为“更多”中的选项卡时,TabbedPage selectedItem 不会更改

Linux进取之旅1: 第一个脚本-检查及创建用户