从远程计算机获取powershell中的.dll文件版本

时间:2011-12-08 00:11:35

标签: powershell powershell-v2.0 powershell-remoting

我试图在几台服务器上使用Powershell远程获取dll的文件版本,并将服务器名称,dll版本和dll文件位置写入csv或html报告。问题是一些服务器是Win 2003和Win 2008.因此该文件可能位于例如C:\ Program Files \ WinZip \ WZCAB.DLL或C:\ Program Files(x86)\ WinZip \ WZCAB.DLL中。该脚本将检查一个位置,如果它不存在,它将检查另一个,然后将其写出。任何人都可以帮助我吗?

只需几件事 - 这个脚本将用于访问2003年和2008年的200多台服务器或VM。2003年需要Powershell 2.0和2008,它将及时启用远程处理。我想也许我需要利用WMI。我有两个其他脚本利用WMI获取补丁和重启时间。虽然我尝试了Ravikanth脚本(再次感谢你)并且在传递服务器的txt文件时出现以下错误 - 一个或多个计算机名称无效。如果您尝试传递Uri,请使用-Co​​nnectionUri参数或传递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 个答案:

答案 0 :(得分:5)

如果您在这些计算机上启用了远程处理:

$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。

答案 1 :(得分:0)

使用Test-Path cmdlet查看路径是否存在。如果不使用备用路径。

程序文件路径的差异不是来自Win 2003或2008,而是来自操作系统是32位还是64位,并且应用程序具有32位或64位支持。