klanax
Goto Top

Probleme beim Schreiben eines WMI bzw. WMIC-Abfrageergebnisses in eine Textdatei

Hallo an alle!

Ich will eine -wirklich- kleine Softwarebestandsführung aufbauen.

Aus einer CMD-Datei rufe ich folgende Befehle auf:
@chcp 1252 >nul
@wmic /node:%Computername% product where "Name like '%%Adobe%%'" get name,version,vendor >c:\users\public\Adobe_Installationen.txt

Ergebnis:
bild01

Wunderbar! Passt so.

Damit ich die Abfrage für mehrere Clients ausführen und danach auswerten kann, hätte ich gerne den jeweiligen Computernamen mit in die Ausgabedatei hineingepackt.
Am liebsten würde ich die vorhandene Tabelle um diese Information ergänzen. Mit wmi/wmic habe ich im Bereich "product" nichts gefunden, nur im Bereich "OS" den Wert aus "CSName".

Frage 1: Weiß jemand eine Möglichkeit, wie ich diese Tabelle um den Computernamen ergänzen kann?


Ich habe dann versucht, vor oder nach den obigen Befehlen den Computernamen mit dem Befehl
@echo %Computername% >c:\users\public\Adobe_Installationen.txt
in die Ausgabedatei einzufügen. Das Ergebnis war jedes Mal unbefriedigend:

1.) Wenn ich vorher den Computernamen einfüge, dann werden die Tabelleninformationen GESPERRT und ohne Zeilenumbrüche ausgegeben (den Computernamen habe ich in der Textdatei geändert):
bild02

2.) Wenn ich den Computernamen anhänge, erhalte ich ASIATISCHE SCHRIFTZEICHEN:
bild03

Frage 2: Hat hier jemand eine Idee, wie ich diese Probleme lösen kann?

Vielen Dank im Voraus.

Gruß

Klaus Nagel

Content-Key: 381956

Url: https://administrator.de/contentid/381956

Printed on: April 25, 2024 at 04:04 o'clock

Member: erikro
Solution erikro Aug 01, 2018 updated at 09:44:16 (UTC)
Goto Top
Moin,

nimm die Powershell:

PS P:\ldap> Get-WmiObject win32_product | Where-Object {$_.name -like "*Adobe*"} | Select-Object Name, Vendor, Version,  
PSComputerName | out-file P:\software.txt -append

Ergebnis:

Name                          Vendor                        Version                       PSComputerName               
----                          ------                        -------                       --------------               
Adobe Refresh Manager         Adobe Systems Incorporated    1.8.0                         XXXXXX                   
Adobe Acrobat Reader DC - ... Adobe Systems Incorporated    18.011.20055                  XXXXXX   

<edit>Das sehe ich jetzt erst, dass der Name abgeschnitten wird. Dann vielleicht besser so:

PS P:\ldap> Get-WmiObject win32_product | Where-Object {$_.name -like "*Adobe*"} | Select-Object Name, Vendor, Version,  
PSComputerName |Format-List |  out-file P:\software.txt -append

Dann sieht das so aus:

Name           : Adobe Refresh Manager
Vendor         : Adobe Systems Incorporated
Version        : 1.8.0
PSComputerName : XXXXXXX

Name           : Adobe Acrobat Reader DC - Deutsch
Vendor         : Adobe Systems Incorporated
Version        : 18.011.20055
PSComputerName : XXXXXXX


hth

Erik
Member: Tektronix
Solution Tektronix Aug 01, 2018 at 09:40:49 (UTC)
Goto Top
Hallo,
schau mal hier. Man muss das Rad ja nicht dauernd neu erfinden. face-wink
Faq-o-matic Cindy
Member: SlainteMhath
Solution SlainteMhath Aug 01, 2018 at 09:44:32 (UTC)
Goto Top
Moin,

das kommt weil WMIC Unicode ausgibt. Abhilfe mit "more", siehe hier: https://superuser.com/questions/812438/combine-batch-wmic-ansi-unicode-o ...

lg,
Slainte
Member: klanax
klanax Aug 01, 2018 at 10:52:51 (UTC)
Goto Top
Hallo!

Vielen Dank für eure schnellen Reaktionen!

@erikro: Danke für den Tipp mit PowerShell. Ich werde auch diese Richtung weiterverfolgen.
Bei mir wird übrigens der Name nicht abgeschnitten.

@Tektronix: Hab's mir heruntergeladen und schau mir die "Cindy" bei Gelegenheit an.

@SlainteMhath: Der Hinweis mit MORE war Gold wert. Danke!

Gruß

Klaus Nagel
Member: colinardo
colinardo Aug 01, 2018 updated at 11:22:40 (UTC)
Goto Top
Zitat von @erikro:
nimm die Powershell:
PS P:\ldap> Get-WmiObject win32_product | Where-Object {$_.name -like "*Adobe*"} | Select-Object Name, Vendor, Version,  
> PSComputerName | out-file P:\software.txt -append

Enthält nicht alle installierten Programme und kann auf bestimmten Rechnern sehr viel Zeit in Anspruch nehmen da der Windows-Installer angetriggert wird. Also besser gleich auch das was nicht per Installer erfasst wurde aus der Registry auslesen:
function Get-InstalledSoftware {
    param(
        [parameter(mandatory=$true)][ValidateNotNullOrEmpty()][string]$Computer
    )
    $all = @();$hklm = 2147483650; $hkcu = 2147483649
    # Subkeydefinition for Uninstallinformation
    $key = "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"  
    $key64 = "SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"  
    try{
        # connect to StdRegProv via Remote-WMI
        $reg = gwmi -List "StdRegProv" -ComputerName $Computer -Namespace root\Default  
        # scriptblock function to get desired Information
        $getnodedata = {
            param($section,$k)
            $reg.EnumKey($section,$k).sNames | %{
                [pscustomobject] @{
                    Name=$reg.GetStringValue($section,"$k\$_","DisplayName").sValue  
                    Version=$reg.GetStringValue($section,"$k\$_","DisplayVersion").sValue  
                    InstallLocation=$reg.GetStringValue($section,"$k\$_","InstallLocation").sValue  
                    InstallSource=$reg.GetStringValue($section,"$k\$_","InstallSource").sValue  
                    UninstallString=$reg.GetStringValue($section,"$k\$_","UninstallString").sValue  
                    InstallDate=$reg.GetStringValue($section,"$k\$_","InstallDate").sValue  
                }
            }
        }
        # call scriptblock function 
        $all += .$getnodedata $hklm $key
        $all += .$getnodedata $hkcu $key
        # call scriptblock function for 64bit section if available
        if ((gwmi Win32_OperatingSystem -ComputerName $computer).OSArchitecture -eq '64-Bit'){  
            $all += .$getnodedata $hklm $key64
            $all += .$getnodedata $hkcu $key64
        }
    }catch{
        throw $_.Exception.Message
    }
    # return sorted and unique object data
    return ($all | ?{$_.Name -ne $null} | sort Name | select Name,Version,InstallLocation,InstallSource,UninstallString,InstallDate -Unique)
}
Get-InstalledSoftware -Computer $env:COMPUTERNAME | ?{$_.Name -like '*Adobe*'}  
Grüße Uwe