получить версию файла .dll в powershell с удаленных компьютеров - PullRequest
1 голос
/ 08 декабря 2011

Я пытаюсь получить версию файла dll удаленно, используя Powershell на нескольких серверах, и мне нужно записать имя сервера, версию dll и местоположение файла dll в отчет csv или html. Подвох в том, что некоторые серверы - это Win 2003 и Win 2008. Таким образом, файл может находиться, например, в C: \ Program Files \ WinZip \ WZCAB.DLL или C: \ Program Files (x86) \ WinZip \ WZCAB.DLL. Сценарий проверит одно местоположение и, если он не существует, проверит другое, а затем запишет его. Кто-нибудь может мне помочь?

Всего несколько вещей. Этот сценарий будет использоваться для доступа к более чем 200 серверам или виртуальным машинам как в 2003, так и в 2008 году. В 2003 году требуется Powershell 2.0 и 2008, чтобы включить удаленное взаимодействие. Я думал, может быть, мне нужно использовать WMI. У меня есть два других сценария, которые используют WMI для получения исправлений и перезагрузки. Я все же попробовал скрипт Ravikanth (еще раз спасибо) и получил следующую ошибку при передаче txt-файла серверов - Одно или несколько имен компьютеров недопустимы. Если вы пытаетесь передать Uri, используйте параметр -ConnectionUri или передайте объекты Uri вместо строк. Опять же, поскольку я не буду включать удаленное взаимодействие на каждом сервере, есть ли другой способ сделать это? Я изменил сценарий Ravikanth (ниже) и попробовал его локально, отлично работает. Когда я пытаюсь сделать это удаленно, это не так. Есть мысли?

$servers = "D:\scripts\winzip\servers.txt" 
$x86Path = 'C:\Program Files (x86)\WinZip\WZCAB.DLL'
$x64Path = 'C:\Program Files\WinZip\WZCAB.DLL'

    foreach ($computername in $servers){
        if (Test-Path $x86Path) {
            (Get-Item $x86Path | Select -ExpandProperty VersionInfo).FileVersion
        } elseif (Test-Path $x64Path) {
            (Get-Item $x64Path | Select -ExpandProperty VersionInfo).FileVersion           
        }
    }

Ответы [ 2 ]

5 голосов
/ 08 декабря 2011

Если на этих компьютерах включено удаленное взаимодействие:

$servers = 'server1','server2'
$x86Path = 'C:\Program Files (x86)\WinZip\WZCAB.DLL'
$x64Path = 'C:\Program Files\WinZip\WZCAB.DLL'
Invoke-Command $servers {
    Param ($x86Path, $x64Path)
    if (Test-Path $x86Path) {
        (Get-Item $x86Path | Select -ExpandProperty VersionInfo).FileVersion
    } elseif (Test-Path $x64Path) {
        (Get-Item $x64Path | Select -ExpandProperty VersionInfo).FileVersion           
    }
} -ArgumentList $x86Path,$x64Path

Это WMI способ сделать это:

$servers = @(Get-Content C:\servers.txt) 
$servers | % { Get-WMIObject -ComputerName $_ -Query "SELECT * FROM CIM_DataFile WHERE Drive ='C:' AND Path='\\Program Files (x86)\\WinZip\\' AND FileName='WZCAB' AND Extension='dll'" } | select Version

Это только часть того, что вам нужно. Вам нужно поставить блок try-catch, чтобы убедиться, что вы обрабатываете ошибки в случае, если файл не найден по этому пути. Я оставлю это для вашего R & D.

0 голосов
/ 08 декабря 2011

Используйте командлет Test-Path, чтобы проверить, существует ли путь. Если нет, используйте альтернативный путь.

И разница в пути к программным файлам возникает не в Win 2003 или 2008, а в том, является ли ОС 32-разрядной или 64-разрядной, а приложение поддерживает 32-разрядную или 64-разрядную версию.

...