Excel-script til at hente specifikke registreringsværdier fra eksterne computere

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på et projekt, hvor jeg skal hente en bestemt registreringsværdi fra eksterne computere og offentliggøre rapporten i Excel-filen. Jeg forsøgte at arbejde med PsExec værktøjet, men det opfylder ikke mit krav. Jeg har mere end 20000 systemer, hvorfra jeg skal hente reg værdien. Jeg forsøger at hente disse systemer reg værdier, som lever i netværket pr subnet, hvor jeg har flere forskellige undernet. Min hensigt er at køre scriptet fra en central server og indsamle værdierne i en Excel-fil med værtsnavn, reg værdi. Enhver hjælp ville blive meget værdsat. Vær venlig at hjælpe mig med at finde ud af det. Tak på forhånd. Nedenfor er scriptet, som jeg forsøgte at oprette.


psexec @c:ips.txt -u domainid -p 12345 reg query "HKEY\_LOCAL\_MACHINESOFTWARESymantecSymantec Endpoint ProtectionCurrentVersion" /v PRODUCTVERSION >> c:version.xlsx


Hilsen,
Pinaki

Bedste reference


For det første udsender du ikke direkte til en .xlsx-fil. Det filformat består af en samling af XML-data i en zip-komprimeret container. Brug .csv i stedet.


Dernæst, hvis dit domæne tillader fjernregistret forespørgsler, kan du bruge


reg query \remotemachineHKLMetc.


at søge registreringsværdier over netværket. Indtast reg query /? for en detaljeret beskrivelse i en cmd-konsol.





Hvis dit domæne ikke tillader fjernregistrerings forespørgsler som et alternativ til psexec, kan du prøve at bruge wmic med sine fjernbetjeningsanordninger og spørge StdRegProv-klassen. Hvis man antager, at 'PRODUCTTVERSION' -værdien er holdt i en strengværdi, vil den se sådan ud: [11]




wmic /node:computername /user:domainadmin /password:adminpass /namespace:\rootdefault class stdregprov call GetStringValue hDefKey="&H80000002" sSubkeyName="SOFTWARE\Symantec\Symantec Endpoint Protection\CurrentVersion" sValueName="PRODUCTVERSION" | findstr "sValue"


Eller med variabler for at gøre det mere læseligt:


@echo off & setlocal

set "user=domainadmin"
set "pass=adminPass"

set "creds=/user:\%user\% /password:\%pass\%"
set "GetStringValue=/namespace:\rootdefault 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,\%\%~#
        )
    )
)


Bemærk: Jeg har ikke udført omfattende test af dette script, som jeg ikke er i øjeblikket i et domæne miljø. Hvis det ikke virker som forventet, er du sandsynligvis alene for at finde ud af, hvad der er forkert og rette det. Så vidt jeg kunne, prøvede jeg evalueringen af ​​caret escape og kunne forespørge registreringsdatabasen på min lokale maskine uden /node, /user og /password skifter. Og jeg har med succes brugt lignende metoder til at forespørge fjernmaskiner på et domæne i fortiden, hvor mere traditionelle forespørgsler om fjernregistrering er blokeret.