我正在开发一个项目,我需要从远程计算机获取特定的注册表值并在excel文件中发布报告。我尝试使用PsExec工具,但这不符合我的要求。我有超过20000个系统,我需要从中获取reg值。我试图获取那些在每个子网的网络中存活的系统寄存器值,其中我有几个不同的子网。我的目的是从中央服务器运行脚本,并使用hostname,reg值收集excel文件中的值。任何帮助将受到高度赞赏。请帮我解决一下。先感谢您。下面是我试图创建的脚本。
psexec @c:\ips.txt -u domain\id -p 12345 reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Symantec\Symantec Endpoint Protection\CurrentVersion" /v PRODUCTVERSION >> c:\version.xlsx
此致 皮纳基环礁
答案 0 :(得分:0)
首先,不要直接输出到.xlsx文件。该文件格式由zip压缩容器中的XML数据集合组成。请改用.csv。
接下来,如果您的域允许远程注册表查询,则可以使用
reg query \\remotemachine\HKLM\etc.
通过网络查询注册表值。在cmd控制台中,输入reg query /?
以获取完整详细信息。
如果您的域不允许远程注册表查询,作为psexec
的替代方法,您可以尝试将wmic
与其远程交换机一起使用,查询StdRegProv class。假设" PRODUCTVERSION" value保存在字符串值中,它看起来像这样:
wmic /node:computername /user:domain\admin /password:adminpass /namespace:\\root\default class stdregprov call GetStringValue hDefKey="&H80000002" sSubkeyName="SOFTWARE\\Symantec\\Symantec Endpoint Protection\\CurrentVersion" sValueName="PRODUCTVERSION" | findstr "sValue"
或使用变量使其更具可读性:
@echo off & setlocal
set "user=domain\admin"
set "pass=adminPass"
set "creds=/user:%user% /password:%pass%"
set "GetStringValue=/namespace:\\root\default class stdregprov call GetStringValue"
set hive=hDefKey^^^="^&H80000002"
set key=sSubkeyName^^^="SOFTWARE\\Symantec\\Symantec Endpoint Protection\\CurrentVersion"
set valname=sValueName^^^="PRODUCTVERSION"
set "args=%creds% %GetStringValue% %hive% %key% %valname%"
rem // output to c:\versions.csv
> "c:\versions.csv" (
rem // loop through ips.txt
for /f "usebackq delims=" %%I in ("c:\ips.txt") do (
rem // capture output of wmic command
for /f "tokens=2*" %%x in ('wmic /node:%%I %args% ^| find "sValue"') do (
rem // normalize encoding of response and output to csv file
for /f "delims=" %%# in ("%%~y") do echo %%~I,%%~#
)
)
)
注意:我还没有对此脚本进行过大量测试,因为我目前不在域环境中。如果它没有按预期工作,你可能会自己找出错误并修复它。尽我所能,我测试了插入符转义的评估,并且能够在没有/node
,/user
和/password
开关的本地计算机上查询注册表。我有successfully used similar methods在过去查询域上的远程计算机,其中阻止了更多传统的远程注册表查询。