2017-08-02 111 views
1

我正在处理一个项目,我需要从远程计算机获取特定注册表值并在Excel文件中发布报告。我尝试使用PsExec工具,但那不符合我的要求。我有超过20000个系统需要取得reg值。我正在尝试获取那些系统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

您能否向任何可能感觉到此类请求可能与安全漏洞利用有关系的人解释是否是错误的? – Compo

+0

即使您将该文件扩展名为.xlsx,也无法通过将文本输出重定向到文件来创建Excel工作簿。另外,为什么你使用'psexec'而不是'reg query \\ 1.2.3.4 \ HKLM \ ...'? –

+0

此外,使用20000个系统检查您可能希望以某种程度的并行性运行查询。 PowerShell [jobs](https://stackoverflow.com/a/18193195/1630171)是一种可能的方法。 –

回答

0

首先,不要直接输出到.xlsx文件。该文件格式由zip压缩容器中的XML数据集合组成。改为使用.csv。

接下来,如果您的域名允许远程注册表查询,您可以使用

reg query \\remotemachine\HKLM\etc. 

在网络上查询注册表值。在cmd控制台中输入reg query /?了解详细信息。


如果您的域名不允许远程注册表查询,作为替代psexec,你可以尝试使用wmic与它的远程开关,查询StdRegProv class。假设“的ProductVersion”值的字符串值举行,这将是这个样子:

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来查询域中的远程计算机,过去传统的远程注册表查询被阻止。

+0

我了解该脚本,并会在我的办公室域环境中检查此脚本,并让您知道是否会发生任何事情。还有一个查询,如果我将所有IP列表垂直放置在ips.txt中,那就没问题了,因为对于PsExec我们把它放在一起。 –

+1

非常感谢Rojo..This脚本适用于我,并且它在运行时节省时间,并且如此快速地从远程系统注册表获取值。再一次感谢你。 –

相关问题