批处理文件 REG QUERY

Posted

技术标签:

【中文标题】批处理文件 REG QUERY【英文标题】:Batch file REG QUERY 【发布时间】:2022-01-17 23:50:58 【问题描述】:

我正在编写一个脚本来检索“DefaultUserName”注册表项的值。我有:

@echo off
Title Kiosk Account Autologin Password Changer
::Search for current Kiosk Account . . .
echo Identifying Kiosk Account
reg query HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon /s
Pause

但我不断收到语法错误。我是编码初学者,感谢所有帮助。

最终目标是有一个输入输出表来根据用户名自动更改“DefaultPassword”键。我工作的公司正在更改所有密码,我不想全部手动完成。

【问题讨论】:

您需要保护注册表子项中的空间,使用双引号,即"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon".,对于reg.exe,可以缩短为"HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"。你也不应该使用惰性代码来搜索和假设路径和扩展,而不是使用reg,使用%SystemRoot%\System32\reg.exe 我已将该行更改为%SystemRoot%\System32\reg.exe query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName /k /t REG_SZ,但没有成功。 你为什么现在使用/K /T REG_SZ?此外,据我从笔记等中得知,在该键下并不总是有一个名为 DefaultUserName 的值,因此可能尚未将特定用户名定义为默认用户,和/或只有一个用户帐户。 我认为我需要更具体地纠正我的语法错误,我错了。我将行更改为reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName,它返回所需的信息,但继续下一步。我想将该查询用作 if/then 语句的输入(即,如果“DefaultUserName”为“A”,则将“DefaultPassword”更改为“1”)。公司对这些机器进行映像的方式,它们都在 Winlogon 键中具有这两个字符串。 试试这样的 oneliner:@%SystemRoot%\System32\reg.exe Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /V "DefaultUserName" 2>NUL | %SystemRoot%\System32\findstr.exe /IRC:"^ *DefaultUserName *REG_SZ *A$" 1>NUL && %SystemRoot%\System32\reg.exe Add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /V "DefaultPassword" /T "REG_SZ" /D "1" /F 1>NUL。仅当默认用户名恰好是不区分大小写的字符串 A 时,才应添加所需的密码设置。请注意,这肯定需要以提升的权限运行。 【参考方案1】:

鉴于您在comment 中所述的其他要求,这应该添加所需的密码字符串值数据,前提是现有的默认用户名恰好是不区分大小写的字符串A

请注意,由于您在受保护的 HKEY_LOCAL_MACHINE 根密钥中进行修改,因此需要以提升的权限运行以下示例。

@%SystemRoot%\System32\reg.exe Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /V "DefaultUserName" 2>NUL | %SystemRoot%\System32\findstr.exe /IRC:"^  *DefaultUserName  *REG_SZ  *A$" 1>NUL && %SystemRoot%\System32\reg.exe Add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /V "DefaultPassword" /T "REG_SZ" /D "1" /F 1>NUL

这里唯一你可能不明白的是条件运算符&&。有两个条件运算符,&&||,前者表示上一个命令是否报告成功,后者表示上一个命令是否报告不成功。因此,在上述情况下,findstr.exe 会查找以一个或多个空格字符开头的行,然后是不区分大小写的字符串 DefaultUserName,然后是一个或多个空格,然后是不区分大小写的字符串 @ 987654329@ 后跟一个或多个空格,并以不区分大小写的字符串 A 结尾。要了解有关 FindStr 命令实用程序选项的更多信息,请打开命令提示符窗口,键入 findstr /? 并按 ENTER 键。如果返回的字符串匹配,则通过 StdOut 将其打印到控制台窗口,因此我已将该打印重定向到 NUL 设备,因为我们不需要查看或使用它,并且运行 && 之后的命令. (如果不匹配则不会运行该行的其余部分).

为了修改命令行,因为老实说,你并没有真正得到A的用户名,只需根据需要在FindStr匹配中更改A .例如,如果您真的在寻找默认用户名Michael,您可以使用:

@%SystemRoot%\System32\reg.exe Query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /V "DefaultUserName" 2>NUL | %SystemRoot%\System32\findstr.exe /IRC:"^  *DefaultUserName  *REG_SZ  *Michael$" 1>NUL && %SystemRoot%\System32\reg.exe Add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /V "DefaultPassword" /T "REG_SZ" /D "1" /F 1>NUL

但是请记住findstr /? 命令的输出。您会注意到某些字符是特殊的,因此如果不转义某些特殊元字符,所有用户名字符串可能都无法正常工作。

【讨论】:

这很有见地。再次感谢您的帮助。 如果我有一个 Excel 文件“Book1.xlsx”,其中“A”列是“用户名”,“B”列是“密码”,我可以让这个脚本查询该电子表格并使用相应的用户名和密码组合?这将省去我需要为每个组合手动编辑(可能)数百行的麻烦。机器已经知道当前使用的用户名,因此我需要一些逻辑来在电子表格中查找该用户名,然后更新新密码。这可能吗? Excel 文件是一种专有格式,可能不是您应该尝试从批处理文件中读取的格式。但是,可以将 Excel 文件导出为 CSV,并且可以在批处理文件中解析纯文本文件。【参考方案2】:

只需在实际命令行中加引号即可:

reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /s

没有它们,Windows NT 处的空格会导致语法错误,从那时起它将NT\CurrentVersion\Winlogon 视为传递给reg query 命令的(第三个)参数。

【讨论】:

reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v DefaultUserName 最终成为了成功的解决方案

以上是关于批处理文件 REG QUERY的主要内容,如果未能解决你的问题,请参考以下文章

批处理reg query里findstr 如何按照变量名称查找(如查找path里有没有"%JAVA_HOME%")

批处理修改注册表

如何用批处理语句获取reg命令的返回值?

如何从批处理文件运行 PowerShell 脚本

06 cp 命令

06 cp 命令