用于从远程计算机获取特定注册表值的脚本

时间:2017-08-02 19:21:20

标签: excel windows powershell batch-file

我正在开发一个项目,我需要从远程计算机获取特定的注册表值并在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

此致 皮纳基环礁

1 个答案:

答案 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在过去查询域上的远程计算机,其中阻止了更多传统的远程注册表查询。